diff options
Diffstat (limited to 'remmina/src/remmina_connection_window.c')
-rw-r--r-- | remmina/src/remmina_connection_window.c | 828 |
1 files changed, 480 insertions, 348 deletions
diff --git a/remmina/src/remmina_connection_window.c b/remmina/src/remmina_connection_window.c index d5aa70501..9d9e9cd65 100644 --- a/remmina/src/remmina_connection_window.c +++ b/remmina/src/remmina_connection_window.c @@ -35,11 +35,14 @@ #include "config.h" -#include <gtk/gtk.h> -#include <gdk/gdkkeysyms.h> -#include <glib/gi18n.h> #include <stdlib.h> +#include <cairo/cairo-xlib.h> +#include <glib/gi18n.h> +#include <gdk/gdk.h> +#include <gdk/gdkkeysyms.h> +#include <gtk/gtk.h> + #include "remmina_connection_window.h" #include "remmina_file.h" #include "remmina_file_manager.h" @@ -51,6 +54,7 @@ #include "remmina_public.h" #include "remmina_scrolled_viewport.h" #include "remmina_widget_pool.h" +#include "remmina_log.h" #include "remmina/remmina_trace_calls.h" G_DEFINE_TYPE( RemminaConnectionWindow, remmina_connection_window, GTK_TYPE_WINDOW) @@ -59,9 +63,9 @@ G_DEFINE_TYPE( RemminaConnectionWindow, remmina_connection_window, GTK_TYPE_WIND #define FLOATING_TOOLBAR_WIDGET (GTK_CHECK_VERSION(3, 10, 0)) -typedef struct _RemminaConnectionHolder RemminaConnectionHolder; + typedef struct _RemminaConnectionHolder RemminaConnectionHolder; -struct _RemminaConnectionWindowPriv + struct _RemminaConnectionWindowPriv { RemminaConnectionHolder* cnnhld; @@ -99,6 +103,7 @@ struct _RemminaConnectionWindowPriv GtkToolItem* toolitem_grab; GtkToolItem* toolitem_preferences; GtkToolItem* toolitem_tools; + GtkToolItem* toolitem_screenshot; GtkWidget* fullscreen_option_button; GtkWidget* fullscreen_scaler_button; GtkWidget* scaler_option_button; @@ -154,22 +159,22 @@ static guint remmina_connection_window_signals[LAST_SIGNAL] = { 0 }; #define DECLARE_CNNOBJ \ - if (!cnnhld || !cnnhld->cnnwin || gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)) < 0) return; \ - RemminaConnectionObject* cnnobj = (RemminaConnectionObject*) g_object_get_data ( \ - G_OBJECT(gtk_notebook_get_nth_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook), \ - gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)))), "cnnobj"); + if (!cnnhld || !cnnhld->cnnwin || gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)) < 0) return; \ +RemminaConnectionObject* cnnobj = (RemminaConnectionObject*) g_object_get_data ( \ + G_OBJECT(gtk_notebook_get_nth_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook), \ + gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)))), "cnnobj"); #define DECLARE_CNNOBJ_WITH_RETURN(r) \ - if (!cnnhld || !cnnhld->cnnwin || gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)) < 0) return r; \ - RemminaConnectionObject* cnnobj = (RemminaConnectionObject*) g_object_get_data ( \ - G_OBJECT(gtk_notebook_get_nth_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook), \ - gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)))), "cnnobj"); + if (!cnnhld || !cnnhld->cnnwin || gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)) < 0) return r; \ +RemminaConnectionObject* cnnobj = (RemminaConnectionObject*) g_object_get_data ( \ + G_OBJECT(gtk_notebook_get_nth_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook), \ + gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)))), "cnnobj"); static void remmina_connection_holder_create_scrolled(RemminaConnectionHolder* cnnhld, RemminaConnectionObject* cnnobj); static void remmina_connection_holder_create_fullscreen(RemminaConnectionHolder* cnnhld, RemminaConnectionObject* cnnobj, - gint view_mode); + gint view_mode); static gboolean remmina_connection_window_hostkey_func(RemminaProtocolWidget* gp, guint keyval, gboolean release, - RemminaConnectionHolder* cnnhld); + RemminaConnectionHolder* cnnhld); static void remmina_connection_holder_grab_focus(GtkNotebook *notebook); static GtkWidget* remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint mode); @@ -209,70 +214,70 @@ static void remmina_connection_window_class_init(RemminaConnectionWindowClass* k * we will never know its internal area size, because GtkViweport::viewport_get_view_allocation, * which returns the internal size of the GtkViewport, is private and we cannot access it */ gtk_css_provider_load_from_data (provider, - "GtkViewport, GtkAspectFrame {\n" - " padding:0;\n" - " border:0;\n" - " background-color: black;\n" - "}\n" - "GtkDrawingArea {\n" - " background-color: black;\n" - "}\n" - "GtkToolbar {\n" - " -GtkWidget-window-dragging: 0;\n" - "}\n" - "#remmina-connection-window-fullscreen {\n" - " background-color: black;\n" - "}\n" - "#remmina-small-button {\n" - " -GtkWidget-focus-padding: 0;\n" - " -GtkWidget-focus-line-width: 0;\n" - " padding: 0;\n" - " border: 0;\n" - "}\n" - "#remmina-pin-button {\n" - " -GtkWidget-focus-padding: 0;\n" - " -GtkWidget-focus-line-width: 0;\n" - " padding: 2px;\n" - " border: 0;\n" - "}\n" - "#remmina-scrolled-container {\n" - " background-color: black;\n" - "}\n" - "#remmina-scrolled-container.undershoot {\n" - " background: none\n" - "}\n" - "#ftbbox-upper {\n" - " border-style: none solid solid solid;\n" - " border-width: 1px;\n" - " border-radius: 4px;\n" - " border-color: #808080;\n" - " padding: 0px;\n" - " background-color: #f0f0f0;\n" - "}\n" - "#ftbbox-lower {\n" - " border-style: solid solid none solid;\n" - " border-width: 1px;\n" - " border-radius: 4px;\n" - " border-color: #808080;\n" - " padding: 0px;\n" - " background-color: #f0f0f0;\n" - "}\n" - "#ftb-handle {\n" - " background-color: #f0f0f0;\n" - "}\n" - - ,-1, NULL); + "GtkViewport, GtkAspectFrame {\n" + " padding:0;\n" + " border:0;\n" + " background-color: black;\n" + "}\n" + "GtkDrawingArea {\n" + " background-color: black;\n" + "}\n" + "GtkToolbar {\n" + " -GtkWidget-window-dragging: 0;\n" + "}\n" + "#remmina-connection-window-fullscreen {\n" + " background-color: black;\n" + "}\n" + "#remmina-small-button {\n" + " -GtkWidget-focus-padding: 0;\n" + " -GtkWidget-focus-line-width: 0;\n" + " padding: 0;\n" + " border: 0;\n" + "}\n" + "#remmina-pin-button {\n" + " -GtkWidget-focus-padding: 0;\n" + " -GtkWidget-focus-line-width: 0;\n" + " padding: 2px;\n" + " border: 0;\n" + "}\n" + "#remmina-scrolled-container {\n" + " background-color: black;\n" + "}\n" + "#remmina-scrolled-container.undershoot {\n" + " background: none\n" + "}\n" + "#ftbbox-upper {\n" + " border-style: none solid solid solid;\n" + " border-width: 1px;\n" + " border-radius: 4px;\n" + " border-color: #808080;\n" + " padding: 0px;\n" + " background-color: #f0f0f0;\n" + "}\n" + "#ftbbox-lower {\n" + " border-style: solid solid none solid;\n" + " border-width: 1px;\n" + " border-radius: 4px;\n" + " border-color: #808080;\n" + " padding: 0px;\n" + " background-color: #f0f0f0;\n" + "}\n" + "#ftb-handle {\n" + " background-color: #f0f0f0;\n" + "}\n" + + ,-1, NULL); gtk_style_context_add_provider_for_screen (gdk_screen_get_default(), - GTK_STYLE_PROVIDER (provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(provider); /* Define a signal used to notify all remmina_connection_windows of toolbar move */ remmina_connection_window_signals[TOOLBARPLACE_SIGNAL] = g_signal_new("toolbar-place", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaConnectionWindowClass, toolbar_place), NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaConnectionWindowClass, toolbar_place), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } @@ -355,8 +360,8 @@ void remmina_connection_window_delete(RemminaConnectionWindow* cnnwin) if (n > 1) { dialog = gtk_message_dialog_new(GTK_WINDOW(cnnwin), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, - GTK_BUTTONS_YES_NO, - _("There are %i active connections in the current window. Are you sure to close?"), n); + GTK_BUTTONS_YES_NO, + _("There are %i active connections in the current window. Are you sure to close?"), n); i = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (i != GTK_RESPONSE_YES) @@ -439,7 +444,7 @@ gboolean remmina_connection_window_notify_widget_toolbar_placement(GtkWidget *wi } static gboolean remmina_connection_window_tb_drag_failed(GtkWidget *widget, GdkDragContext *context, - GtkDragResult result, gpointer user_data) + GtkDragResult result, gpointer user_data) { TRACE_CALL("remmina_connection_window_tb_drag_failed"); RemminaConnectionHolder* cnnhld; @@ -455,7 +460,7 @@ static gboolean remmina_connection_window_tb_drag_failed(GtkWidget *widget, GdkD } static gboolean remmina_connection_window_tb_drag_drop(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, guint time, gpointer user_data) + gint x, gint y, guint time, gpointer user_data) { TRACE_CALL("remmina_connection_window_tb_drag_drop"); GtkAllocation wa; @@ -539,8 +544,8 @@ static void remmina_connection_holder_update_toolbar_opacity(RemminaConnectionHo RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; priv->floating_toolbar_opacity = (1.0 - TOOLBAR_OPACITY_MIN) / ((gdouble) TOOLBAR_OPACITY_LEVEL) - * ((gdouble)(TOOLBAR_OPACITY_LEVEL - remmina_file_get_int(cnnobj->remmina_file, "toolbar_opacity", 0))) - + TOOLBAR_OPACITY_MIN; + * ((gdouble)(TOOLBAR_OPACITY_LEVEL - remmina_file_get_int(cnnobj->remmina_file, "toolbar_opacity", 0))) + + TOOLBAR_OPACITY_MIN; #if FLOATING_TOOLBAR_WIDGET if (priv->floating_toolbar_widget) { @@ -598,10 +603,10 @@ static gboolean remmina_connection_holder_floating_toolbar_motion(RemminaConnect { #if GTK_CHECK_VERSION(3, 8, 0) gtk_widget_set_opacity(GTK_WIDGET(priv->floating_toolbar_window), - (gdouble)(y - t) / (gdouble)(-t) * priv->floating_toolbar_opacity); + (gdouble)(y - t) / (gdouble)(-t) * priv->floating_toolbar_opacity); #else gtk_window_set_opacity(GTK_WINDOW(priv->floating_toolbar_window), - (gdouble)(y - t) / (gdouble)(-t) * priv->floating_toolbar_opacity); + (gdouble)(y - t) / (gdouble)(-t) * priv->floating_toolbar_opacity); #endif } if ((priv->floating_toolbar_motion_show && y >= 0) || (!priv->floating_toolbar_motion_show && y <= t)) @@ -629,14 +634,14 @@ static void remmina_connection_holder_floating_toolbar_update(RemminaConnectionH if (priv->floating_toolbar_motion_handler) g_source_remove(priv->floating_toolbar_motion_handler); priv->floating_toolbar_motion_handler = g_idle_add( - (GSourceFunc) remmina_connection_holder_floating_toolbar_motion, cnnhld); + (GSourceFunc) remmina_connection_holder_floating_toolbar_motion, cnnhld); } else { if (priv->floating_toolbar_motion_handler == 0) { priv->floating_toolbar_motion_handler = g_timeout_add(MOTION_TIME, - (GSourceFunc) remmina_connection_holder_floating_toolbar_motion, cnnhld); + (GSourceFunc) remmina_connection_holder_floating_toolbar_motion, cnnhld); } } } @@ -728,7 +733,7 @@ static void remmina_connection_object_set_scrolled_policy(RemminaConnectionObjec gboolean scale; scale = remmina_protocol_widget_get_scale(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); gtk_scrolled_window_set_policy(scrolled_window, scale ? GTK_POLICY_NEVER : GTK_POLICY_AUTOMATIC, - scale ? GTK_POLICY_NEVER : GTK_POLICY_AUTOMATIC); + scale ? GTK_POLICY_NEVER : GTK_POLICY_AUTOMATIC); } static gboolean remmina_connection_holder_toolbar_autofit_restore(RemminaConnectionHolder* cnnhld) @@ -746,15 +751,15 @@ static gboolean remmina_connection_holder_toolbar_autofit_restore(RemminaConnect gtk_widget_get_allocation(cnnobj->scrolled_container, &ca); gtk_widget_get_allocation(priv->toolbar, &ta); if (remmina_pref.toolbar_placement == TOOLBAR_PLACEMENT_LEFT || - remmina_pref.toolbar_placement == TOOLBAR_PLACEMENT_RIGHT) + remmina_pref.toolbar_placement == TOOLBAR_PLACEMENT_RIGHT) { gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), MAX(1, dwidth + ta.width + nba.width - ca.width), - MAX(1, dheight + nba.height - ca.height)); + MAX(1, dheight + nba.height - ca.height)); } else { gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), MAX(1, dwidth + nba.width - ca.width), - MAX(1, dheight + ta.height + nba.height - ca.height)); + MAX(1, dheight + ta.height + nba.height - ca.height)); } gtk_container_check_resize(GTK_CONTAINER(cnnhld->cnnwin)); } @@ -770,21 +775,21 @@ static void remmina_connection_holder_toolbar_autofit(GtkWidget* widget, Remmina TRACE_CALL("remmina_connection_holder_toolbar_autofit"); DECLARE_CNNOBJ - if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container)) - { - if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) & GDK_WINDOW_STATE_MAXIMIZED) != 0) + if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container)) { - gtk_window_unmaximize(GTK_WINDOW(cnnhld->cnnwin)); - } + if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) & GDK_WINDOW_STATE_MAXIMIZED) != 0) + { + gtk_window_unmaximize(GTK_WINDOW(cnnhld->cnnwin)); + } - /* It's tricky to make the toolbars disappear automatically, while keeping scrollable. - Please tell me if you know a better way to do this */ - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cnnobj->scrolled_container), GTK_POLICY_NEVER, - GTK_POLICY_NEVER); + /* It's tricky to make the toolbars disappear automatically, while keeping scrollable. + Please tell me if you know a better way to do this */ + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cnnobj->scrolled_container), GTK_POLICY_NEVER, + GTK_POLICY_NEVER); - /* ToDo: save returned source id in priv->something and then delete when main object is destroyed */ - g_timeout_add(200, (GSourceFunc) remmina_connection_holder_toolbar_autofit_restore, cnnhld); - } + /* ToDo: save returned source id in priv->something and then delete when main object is destroyed */ + g_timeout_add(200, (GSourceFunc) remmina_connection_holder_toolbar_autofit_restore, cnnhld); + } } @@ -813,60 +818,60 @@ static void remmina_connection_holder_check_resize(RemminaConnectionHolder* cnnh screen_height = screen_size.height; if (!remmina_protocol_widget_get_expand(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)) - && (server_width <= 0 || server_height <= 0 || screen_width < server_width - || screen_height < server_height)) + && (server_width <= 0 || server_height <= 0 || screen_width < server_width + || screen_height < server_height)) { scroll_required = TRUE; } switch (cnnhld->cnnwin->priv->view_mode) { - case SCROLLED_FULLSCREEN_MODE: - gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), screen_width, screen_height); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cnnobj->scrolled_container), - (scroll_required ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER), - (scroll_required ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER)); - break; - - case VIEWPORT_FULLSCREEN_MODE: - bordersz = scroll_required ? 1 : 0; - gtk_window_resize (GTK_WINDOW(cnnhld->cnnwin), screen_width , screen_height); - if (REMMINA_IS_SCROLLED_VIEWPORT(cnnobj->scrolled_container)) - { - /* Put a border around Notebook content (RemminaScrolledViewpord), so we can - * move the mouse over the border to scroll */ - gtk_container_set_border_width (GTK_CONTAINER (cnnobj->scrolled_container), bordersz); - } - - break; + case SCROLLED_FULLSCREEN_MODE: + gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), screen_width, screen_height); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cnnobj->scrolled_container), + (scroll_required ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER), + (scroll_required ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER)); + break; - case SCROLLED_WINDOW_MODE: - if (remmina_file_get_int (cnnobj->remmina_file, "viewmode", AUTO_MODE) == AUTO_MODE) - { - gtk_window_set_default_size (GTK_WINDOW(cnnhld->cnnwin), - MIN (server_width, screen_width), MIN (server_height, screen_height)); - if (server_width >= screen_width || server_height >= screen_height) + case VIEWPORT_FULLSCREEN_MODE: + bordersz = scroll_required ? 1 : 0; + gtk_window_resize (GTK_WINDOW(cnnhld->cnnwin), screen_width , screen_height); + if (REMMINA_IS_SCROLLED_VIEWPORT(cnnobj->scrolled_container)) { - gtk_window_maximize (GTK_WINDOW(cnnhld->cnnwin)); - remmina_file_set_int (cnnobj->remmina_file, "window_maximize", TRUE); + /* Put a border around Notebook content (RemminaScrolledViewpord), so we can + * move the mouse over the border to scroll */ + gtk_container_set_border_width (GTK_CONTAINER (cnnobj->scrolled_container), bordersz); } - else + + break; + + case SCROLLED_WINDOW_MODE: + if (remmina_file_get_int (cnnobj->remmina_file, "viewmode", AUTO_MODE) == AUTO_MODE) { - remmina_connection_holder_toolbar_autofit (NULL, cnnhld); - remmina_file_set_int (cnnobj->remmina_file, "window_maximize", FALSE); + gtk_window_set_default_size (GTK_WINDOW(cnnhld->cnnwin), + MIN (server_width, screen_width), MIN (server_height, screen_height)); + if (server_width >= screen_width || server_height >= screen_height) + { + gtk_window_maximize (GTK_WINDOW(cnnhld->cnnwin)); + remmina_file_set_int (cnnobj->remmina_file, "window_maximize", TRUE); + } + else + { + remmina_connection_holder_toolbar_autofit (NULL, cnnhld); + remmina_file_set_int (cnnobj->remmina_file, "window_maximize", FALSE); + } } - } - else - { - if (remmina_file_get_int (cnnobj->remmina_file, "window_maximize", FALSE)) + else { - gtk_window_maximize (GTK_WINDOW(cnnhld->cnnwin)); + if (remmina_file_get_int (cnnobj->remmina_file, "window_maximize", FALSE)) + { + gtk_window_maximize (GTK_WINDOW(cnnhld->cnnwin)); + } } - } - break; + break; - default: - break; + default: + break; } } @@ -881,7 +886,7 @@ static void remmina_connection_holder_set_tooltip(GtkWidget* item, const gchar* if (key2) { s1 = g_strdup_printf(" (%s + %s,%s)", gdk_keyval_name(remmina_pref.hostkey), - gdk_keyval_name(gdk_keyval_to_upper(key1)), gdk_keyval_name(gdk_keyval_to_upper(key2))); + gdk_keyval_name(gdk_keyval_to_upper(key1)), gdk_keyval_name(gdk_keyval_to_upper(key2))); } else if (key1 == remmina_pref.hostkey) { @@ -890,7 +895,7 @@ static void remmina_connection_holder_set_tooltip(GtkWidget* item, const gchar* else { s1 = g_strdup_printf(" (%s + %s)", gdk_keyval_name(remmina_pref.hostkey), - gdk_keyval_name(gdk_keyval_to_upper(key1))); + gdk_keyval_name(gdk_keyval_to_upper(key1))); } } else @@ -1068,7 +1073,7 @@ static void remmina_connection_holder_toolbar_fullscreen_option(GtkWidget* widge g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_fullscreen_option_popdown), cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, priv->toolitem_fullscreen, 0, - gtk_get_current_event_time()); + gtk_get_current_event_time()); } @@ -1143,7 +1148,7 @@ static void remmina_connection_holder_toolbar_scaler_option(GtkWidget* widget, R g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_scaler_option_popdown), cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, priv->toolitem_fullscreen, 0, - gtk_get_current_event_time()); + gtk_get_current_event_time()); } static void remmina_connection_holder_switch_page_activate(GtkMenuItem* menuitem, RemminaConnectionHolder* cnnhld) @@ -1202,7 +1207,7 @@ static void remmina_connection_holder_toolbar_switch_page(GtkWidget* widget, Rem g_object_set_data(G_OBJECT(menuitem), "new-page-num", GINT_TO_POINTER(i)); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_connection_holder_switch_page_activate), - cnnhld); + cnnhld); if (i == gtk_notebook_get_current_page(GTK_NOTEBOOK(priv->notebook))) { gtk_widget_set_sensitive(menuitem, FALSE); @@ -1210,7 +1215,7 @@ static void remmina_connection_holder_toolbar_switch_page(GtkWidget* widget, Rem } g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_toolbar_switch_page_popdown), - cnnhld); + cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, widget, 0, gtk_get_current_event_time()); } @@ -1252,7 +1257,7 @@ static void remmina_connection_holder_toolbar_scaled_mode(GtkWidget* widget, Rem gtk_widget_set_sensitive(GTK_WIDGET(priv->scaler_option_button), scale); remmina_protocol_widget_call_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, 0); + REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, 0); if (cnnhld->cnnwin->priv->view_mode != SCROLLED_WINDOW_MODE) { remmina_connection_holder_check_resize(cnnhld); @@ -1334,7 +1339,7 @@ static void remmina_connection_holder_call_protocol_feature_activate(GtkMenuItem } static void remmina_connection_holder_toolbar_preferences_radio(RemminaConnectionHolder* cnnhld, RemminaFile* remminafile, - GtkWidget* menu, const RemminaProtocolFeature* feature, const gchar* domain, gboolean enabled) + GtkWidget* menu, const RemminaProtocolFeature* feature, const gchar* domain, gboolean enabled) { TRACE_CALL("remmina_connection_holder_toolbar_preferences_radio"); GtkWidget* menuitem; @@ -1364,7 +1369,7 @@ static void remmina_connection_holder_toolbar_preferences_radio(RemminaConnectio } g_signal_connect(G_OBJECT(menuitem), "toggled", - G_CALLBACK(remmina_connection_holder_call_protocol_feature_radio), cnnhld); + G_CALLBACK(remmina_connection_holder_call_protocol_feature_radio), cnnhld); } else { @@ -1374,7 +1379,7 @@ static void remmina_connection_holder_toolbar_preferences_radio(RemminaConnectio } static void remmina_connection_holder_toolbar_preferences_check(RemminaConnectionHolder* cnnhld, RemminaFile* remminafile, - GtkWidget* menu, const RemminaProtocolFeature* feature, const gchar* domain, gboolean enabled) + GtkWidget* menu, const RemminaProtocolFeature* feature, const gchar* domain, gboolean enabled) { TRACE_CALL("remmina_connection_holder_toolbar_preferences_check"); GtkWidget* menuitem; @@ -1388,10 +1393,10 @@ static void remmina_connection_holder_toolbar_preferences_check(RemminaConnectio g_object_set_data(G_OBJECT(menuitem), "feature-type", (gpointer) feature); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), - remmina_file_get_int(remminafile, (const gchar*) feature->opt2, FALSE)); + remmina_file_get_int(remminafile, (const gchar*) feature->opt2, FALSE)); g_signal_connect(G_OBJECT(menuitem), "toggled", - G_CALLBACK(remmina_connection_holder_call_protocol_feature_check), cnnhld); + G_CALLBACK(remmina_connection_holder_call_protocol_feature_check), cnnhld); } else { @@ -1421,7 +1426,7 @@ static void remmina_connection_holder_toolbar_preferences(GtkWidget* widget, Rem domain = remmina_protocol_widget_get_domain(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); menu = gtk_menu_new(); for (feature = remmina_protocol_widget_get_features(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); feature && feature->type; - feature++) + feature++) { if (feature->type != REMMINA_PROTOCOL_FEATURE_TYPE_PREF) continue; @@ -1436,20 +1441,20 @@ static void remmina_connection_holder_toolbar_preferences(GtkWidget* widget, Rem enabled = remmina_protocol_widget_query_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature); switch (GPOINTER_TO_INT(feature->opt1)) { - case REMMINA_PROTOCOL_FEATURE_PREF_RADIO: - remmina_connection_holder_toolbar_preferences_radio(cnnhld, cnnobj->remmina_file, menu, feature, - domain, enabled); - separator = TRUE; - break; - case REMMINA_PROTOCOL_FEATURE_PREF_CHECK: - remmina_connection_holder_toolbar_preferences_check(cnnhld, cnnobj->remmina_file, menu, feature, - domain, enabled); - break; + case REMMINA_PROTOCOL_FEATURE_PREF_RADIO: + remmina_connection_holder_toolbar_preferences_radio(cnnhld, cnnobj->remmina_file, menu, feature, + domain, enabled); + separator = TRUE; + break; + case REMMINA_PROTOCOL_FEATURE_PREF_CHECK: + remmina_connection_holder_toolbar_preferences_check(cnnhld, cnnobj->remmina_file, menu, feature, + domain, enabled); + break; } } g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_toolbar_preferences_popdown), - cnnhld); + cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, widget, 0, gtk_get_current_event_time()); } @@ -1477,7 +1482,7 @@ static void remmina_connection_holder_toolbar_tools(GtkWidget* widget, RemminaCo domain = remmina_protocol_widget_get_domain(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); menu = gtk_menu_new(); for (feature = remmina_protocol_widget_get_features(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); feature && feature->type; - feature++) + feature++) { if (feature->type != REMMINA_PROTOCOL_FEATURE_TYPE_TOOL) continue; @@ -1499,7 +1504,7 @@ static void remmina_connection_holder_toolbar_tools(GtkWidget* widget, RemminaCo g_object_set_data(G_OBJECT(menuitem), "feature-type", (gpointer) feature); g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(remmina_connection_holder_call_protocol_feature_activate), cnnhld); + G_CALLBACK(remmina_connection_holder_call_protocol_feature_activate), cnnhld); } else { @@ -1530,11 +1535,11 @@ static void remmina_connection_holder_toolbar_tools(GtkWidget* widget, RemminaCo { /* Add the keystroke if no description was available */ menuitem = gtk_menu_item_new_with_label( - g_strdup(keystroke_values[strlen(keystroke_values[0]) ? 0 : 1])); + g_strdup(keystroke_values[strlen(keystroke_values[0]) ? 0 : 1])); g_object_set_data(G_OBJECT(menuitem), "keystrokes", g_strdup(keystroke_values[1])); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", - G_CALLBACK(remmina_protocol_widget_send_keystrokes), - REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); + G_CALLBACK(remmina_protocol_widget_send_keystrokes), + REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(submenu_keystrokes), menuitem); } @@ -1547,6 +1552,123 @@ static void remmina_connection_holder_toolbar_tools(GtkWidget* widget, RemminaCo gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, widget, 0, gtk_get_current_event_time()); } +static void remmina_connection_holder_toolbar_screenshot(GtkWidget* widget, RemminaConnectionHolder* cnnhld) +{ + TRACE_CALL("remmina_connection_holder_toolbar_screenshot"); + + GdkPixbuf *screenshot; + GdkWindow *active_window; + cairo_t *cr; + gint width, height; + const gchar* remminafile; + gchar* pngname; + gchar* pngdate; + GtkWidget* dialog; + RemminaProtocolWidget *gp; + RemminaPluginScreenshotData rpsd; + cairo_surface_t *srcsurface; + cairo_format_t cairo_format; + cairo_surface_t *surface; + int stride; + + GDateTime *date = g_date_time_new_now_utc (); + + // We will take a screenshot of the currently displayed RemminaProtocolWidget. + // DECLARE_CNNOBJ already did part of the job for us. + DECLARE_CNNOBJ + gp = REMMINA_PROTOCOL_WIDGET(cnnobj->proto); + + // Ask the plugin if it can give us a screenshot + if (remmina_protocol_widget_plugin_screenshot(gp, &rpsd)) { + // Good, we have a screenshot from the plugin ! + + remmina_log_printf("Screenshot from plugin: w=%d h=%d bpp=%d bytespp=%d\n", + rpsd.width, rpsd.height, rpsd.bitsPerPixel, rpsd.bytesPerPixel); + + width = rpsd.width; + height = rpsd.height; + + if (rpsd.bitsPerPixel == 32) + cairo_format = CAIRO_FORMAT_ARGB32; + else + cairo_format = CAIRO_FORMAT_RGB16_565; + + stride = cairo_format_stride_for_width(cairo_format, width); + + srcsurface = cairo_image_surface_create_for_data(rpsd.buffer, cairo_format, width, height, stride); + + surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height); + cr = cairo_create(surface); + cairo_set_source_surface(cr, srcsurface, 0, 0); + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + cairo_paint(cr); + cairo_surface_destroy(srcsurface); + + free(rpsd.buffer); + + } else { + // The plugin is not releasing us a screenshot, just try to catch one via GTK + + /* Warn the user if image is distorted */ + if (cnnobj->plugin_can_scale && + remmina_protocol_widget_get_scale(gp)) { + dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, + _("Warning: screenshot is scaled or distorted. Disable scaling to have better screenshot.")); + g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); + gtk_widget_show(dialog); + } + + // Get the screenshot. + active_window = gtk_widget_get_window(GTK_WIDGET(gp)); + // width = gdk_window_get_width(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))); + width = gdk_window_get_width (active_window); + // height = gdk_window_get_height(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))); + height = gdk_window_get_height (active_window); + + screenshot = gdk_pixbuf_get_from_window (active_window, 0, 0, width, height); + if (screenshot == NULL) + g_print("gdk_pixbuf_get_from_window failed\n"); + + // Prepare the destination cairo surface. + surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height); + cr = cairo_create(surface); + + // Copy the source pixbuf to the surface and paint it. + gdk_cairo_set_source_pixbuf(cr, screenshot, 0, 0); + cairo_paint(cr); + + // Deallocate screenshot pixbuf + g_object_unref(screenshot); + + } + + remminafile = remmina_file_get_filename(cnnobj->remmina_file); + //imagedir = g_get_user_special_dir(G_USER_DIRECTORY_PICTURES); + /* TODO: Improve file name (DONE:8743571d) + give the user the option */ + pngdate = g_strdup_printf("%d-%d-%d-%d:%d:%f", + g_date_time_get_year (date), + g_date_time_get_month (date), + g_date_time_get_day_of_month (date), + g_date_time_get_hour (date), + g_date_time_get_minute (date), + g_date_time_get_seconds (date)); + + g_date_time_unref (date); + pngname = g_strdup_printf("%s/%s-%s.png", remmina_pref.screenshot_path, + g_path_get_basename(remminafile), pngdate); + + cairo_surface_write_to_png(surface, pngname); + + /* send a desktop notification */ + remmina_public_send_notification ("remmina-screenshot-is-ready-id", "Screenshot taken", pngname); + + //Clean up and return. + cairo_destroy(cr); + cairo_surface_destroy(surface); + + +} + static void remmina_connection_holder_toolbar_minimize(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_holder_toolbar_minimize"); @@ -1566,11 +1688,11 @@ static void remmina_connection_holder_toolbar_grab(GtkWidget* widget, RemminaCon DECLARE_CNNOBJ remmina_file_set_int(cnnobj->remmina_file, "keyboard_grab", - gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))); + gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))); remmina_connection_holder_keyboard_grab(cnnhld); } -static GtkWidget* + static GtkWidget* remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint mode) { TRACE_CALL("remmina_connection_holder_create_toolbar"); @@ -1593,7 +1715,7 @@ remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint m toolitem = gtk_tool_button_new(NULL, NULL); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "remmina-fit-window"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Resize the window to fit in remote resolution"), - remmina_pref.shortcutkey_autofit, 0); + remmina_pref.shortcutkey_autofit, 0); g_signal_connect(G_OBJECT(toolitem), "clicked", G_CALLBACK(remmina_connection_holder_toolbar_autofit), cnnhld); priv->toolitem_autofit = toolitem; gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); @@ -1603,7 +1725,7 @@ remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint m toolitem = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "remmina-fullscreen"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Toggle fullscreen mode"), - remmina_pref.shortcutkey_fullscreen, 0); + remmina_pref.shortcutkey_fullscreen, 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); priv->toolitem_fullscreen = toolitem; @@ -1643,7 +1765,7 @@ remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint m toolitem = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "remmina-switch-page"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Switch tab pages"), remmina_pref.shortcutkey_prevtab, - remmina_pref.shortcutkey_nexttab); + remmina_pref.shortcutkey_nexttab); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_switch_page), cnnhld); @@ -1690,7 +1812,7 @@ remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint m toolitem = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "input-keyboard"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Grab all keyboard events"), - remmina_pref.shortcutkey_grab, 0); + remmina_pref.shortcutkey_grab, 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_grab), cnnhld); @@ -1717,6 +1839,13 @@ remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint m gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); + toolitem = gtk_tool_button_new(NULL, "_Screenshot"); + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (toolitem), "camera-photo"); + remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Screenshot"), remmina_pref.shortcutkey_screenshot, 0); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + gtk_widget_show(GTK_WIDGET(toolitem)); + g_signal_connect(G_OBJECT(toolitem), "clicked", G_CALLBACK(remmina_connection_holder_toolbar_screenshot), cnnhld); + toolitem = gtk_tool_button_new(NULL, "_Bottom"); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON (toolitem), "go-bottom"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Minimize window"), remmina_pref.shortcutkey_minimize, 0); @@ -1775,7 +1904,7 @@ static void remmina_connection_holder_update_toolbar(RemminaConnectionHolder* cn { TRACE_CALL("remmina_connection_holder_update_toolbar"); DECLARE_CNNOBJ - RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; + RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkToolItem* toolitem; gboolean bval; gboolean test_floating_toolbar; @@ -1792,21 +1921,21 @@ static void remmina_connection_holder_update_toolbar(RemminaConnectionHolder* cn gtk_widget_set_sensitive(GTK_WIDGET(priv->scaler_option_button), bval); bval = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - REMMINA_PROTOCOL_FEATURE_TYPE_SCALE); + REMMINA_PROTOCOL_FEATURE_TYPE_SCALE); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), bval); toolitem = priv->toolitem_grab; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(toolitem), - remmina_file_get_int(cnnobj->remmina_file, "keyboard_grab", FALSE)); + remmina_file_get_int(cnnobj->remmina_file, "keyboard_grab", FALSE)); toolitem = priv->toolitem_preferences; bval = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - REMMINA_PROTOCOL_FEATURE_TYPE_PREF); + REMMINA_PROTOCOL_FEATURE_TYPE_PREF); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), bval); toolitem = priv->toolitem_tools; bval = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - REMMINA_PROTOCOL_FEATURE_TYPE_TOOL); + REMMINA_PROTOCOL_FEATURE_TYPE_TOOL); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), bval); gtk_window_set_title(GTK_WINDOW(cnnhld->cnnwin), remmina_file_get_string(cnnobj->remmina_file, "name")); @@ -1819,7 +1948,7 @@ static void remmina_connection_holder_update_toolbar(RemminaConnectionHolder* cn if (test_floating_toolbar) { gtk_label_set_text(GTK_LABEL(priv->floating_toolbar_label), - remmina_file_get_string(cnnobj->remmina_file, "name")); + remmina_file_get_string(cnnobj->remmina_file, "name")); } } @@ -1834,8 +1963,8 @@ static void remmina_connection_holder_showhide_toolbar(RemminaConnectionHolder* if (priv->view_mode == SCROLLED_WINDOW_MODE) { if (resize - && (gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) - & GDK_WINDOW_STATE_MAXIMIZED) == 0) + && (gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) + & GDK_WINDOW_STATE_MAXIMIZED) == 0) { gtk_window_get_size(GTK_WINDOW(cnnhld->cnnwin), &width, &height); @@ -1866,7 +1995,7 @@ static void remmina_connection_holder_showhide_toolbar(RemminaConnectionHolder* } static gboolean remmina_connection_holder_floating_toolbar_on_enter(GtkWidget* widget, GdkEventCrossing* event, - RemminaConnectionHolder* cnnhld) + RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_holder_floating_toolbar_on_enter"); remmina_connection_holder_floating_toolbar_show(cnnhld, TRUE); @@ -1874,7 +2003,7 @@ static gboolean remmina_connection_holder_floating_toolbar_on_enter(GtkWidget* w } static gboolean remmina_connection_object_enter_protocol_widget(GtkWidget* widget, GdkEventCrossing* event, - RemminaConnectionObject* cnnobj) + RemminaConnectionObject* cnnobj) { TRACE_CALL("remmina_connection_object_enter_protocol_widget"); RemminaConnectionHolder* cnnhld = cnnobj->cnnhld; @@ -1887,8 +2016,6 @@ static gboolean remmina_connection_object_enter_protocol_widget(GtkWidget* widge return FALSE; } - - static gboolean remmina_connection_window_focus_in(GtkWidget* widget, GdkEventFocus* event, RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_window_focus_in"); @@ -1906,9 +2033,9 @@ static gboolean remmina_connection_window_focus_in(GtkWidget* widget, GdkEventFo static gboolean remmina_connection_window_focus_out(GtkWidget* widget, GdkEventFocus* event, RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_window_focus_out"); - DECLARE_CNNOBJ_WITH_RETURN(FALSE) +DECLARE_CNNOBJ_WITH_RETURN(FALSE) #if !FLOATING_TOOLBAR_WIDGET - RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; + RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; #endif cnnhld->hostkey_activated = FALSE; @@ -1924,7 +2051,7 @@ static gboolean remmina_connection_window_focus_out(GtkWidget* widget, GdkEventF remmina_scrolled_viewport_remove_motion(REMMINA_SCROLLED_VIEWPORT(cnnobj->scrolled_container)); } remmina_protocol_widget_call_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, 0); + REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, 0); return FALSE; } @@ -1933,7 +2060,7 @@ static gboolean remmina_connection_window_on_enter(GtkWidget* widget, GdkEventCr { TRACE_CALL("remmina_connection_window_on_enter"); if (event->detail == GDK_NOTIFY_VIRTUAL || event->detail == GDK_NOTIFY_NONLINEAR - || event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) + || event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) { remmina_connection_holder_keyboard_grab(cnnhld); } @@ -1949,7 +2076,7 @@ static gboolean remmina_connection_window_on_leave(GtkWidget* widget, GdkEventCr GdkDevice *device = NULL; if (event->detail == GDK_NOTIFY_VIRTUAL || event->detail == GDK_NOTIFY_NONLINEAR - || event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) + || event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) { display = gtk_widget_get_display(widget); manager = gdk_display_get_device_manager(display); @@ -1967,7 +2094,7 @@ static gboolean remmina_connection_window_on_leave(GtkWidget* widget, GdkEventCr } static gboolean remmina_connection_holder_floating_toolbar_on_scroll(GtkWidget* widget, GdkEventScroll* event, - RemminaConnectionHolder* cnnhld) + RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_holder_floating_toolbar_on_scroll"); DECLARE_CNNOBJ_WITH_RETURN(FALSE) @@ -1976,46 +2103,46 @@ static gboolean remmina_connection_holder_floating_toolbar_on_scroll(GtkWidget* opacity = remmina_file_get_int(cnnobj->remmina_file, "toolbar_opacity", 0); switch (event->direction) { - case GDK_SCROLL_UP: - if (opacity > 0) - { - remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity - 1); - remmina_connection_holder_update_toolbar_opacity(cnnhld); - return TRUE; - } - break; - case GDK_SCROLL_DOWN: - if (opacity < TOOLBAR_OPACITY_LEVEL) - { - remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity + 1); - remmina_connection_holder_update_toolbar_opacity(cnnhld); - return TRUE; - } - break; + case GDK_SCROLL_UP: + if (opacity > 0) + { + remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity - 1); + remmina_connection_holder_update_toolbar_opacity(cnnhld); + return TRUE; + } + break; + case GDK_SCROLL_DOWN: + if (opacity < TOOLBAR_OPACITY_LEVEL) + { + remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity + 1); + remmina_connection_holder_update_toolbar_opacity(cnnhld); + return TRUE; + } + break; #ifdef GDK_SCROLL_SMOOTH - case GDK_SCROLL_SMOOTH: - if (event->delta_y < 0 && opacity > 0) - { - remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity - 1); - remmina_connection_holder_update_toolbar_opacity(cnnhld); - return TRUE; - } - if (event->delta_y > 0 && opacity < TOOLBAR_OPACITY_LEVEL) - { - remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity + 1); - remmina_connection_holder_update_toolbar_opacity(cnnhld); - return TRUE; - } - break; + case GDK_SCROLL_SMOOTH: + if (event->delta_y < 0 && opacity > 0) + { + remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity - 1); + remmina_connection_holder_update_toolbar_opacity(cnnhld); + return TRUE; + } + if (event->delta_y > 0 && opacity < TOOLBAR_OPACITY_LEVEL) + { + remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity + 1); + remmina_connection_holder_update_toolbar_opacity(cnnhld); + return TRUE; + } + break; #endif - default: - break; + default: + break; } return FALSE; } static gboolean remmina_connection_window_on_configure(GtkWidget* widget, GdkEventConfigure* event, - RemminaConnectionHolder* cnnhld) + RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_window_on_configure"); DECLARE_CNNOBJ_WITH_RETURN(FALSE) @@ -2027,7 +2154,7 @@ static gboolean remmina_connection_window_on_configure(GtkWidget* widget, GdkEve #endif if (cnnhld->cnnwin && gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)) - && cnnhld->cnnwin->priv->view_mode == SCROLLED_WINDOW_MODE) + && cnnhld->cnnwin->priv->view_mode == SCROLLED_WINDOW_MODE) { /* Here we store the window state in real-time */ if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) @@ -2069,12 +2196,12 @@ static void remmina_connection_holder_update_pin(RemminaConnectionHolder* cnnhld if (cnnhld->cnnwin->priv->pin_down) { gtk_button_set_image(GTK_BUTTON(cnnhld->cnnwin->priv->pin_button), - gtk_image_new_from_icon_name("remmina-pin-down", GTK_ICON_SIZE_MENU)); + gtk_image_new_from_icon_name("remmina-pin-down", GTK_ICON_SIZE_MENU)); } else { gtk_button_set_image(GTK_BUTTON(cnnhld->cnnwin->priv->pin_button), - gtk_image_new_from_icon_name("remmina-pin-up", GTK_ICON_SIZE_MENU)); + gtk_image_new_from_icon_name("remmina-pin-up", GTK_ICON_SIZE_MENU)); } } @@ -2243,10 +2370,10 @@ static gboolean remmina_connection_window_state_event(GtkWidget* widget, GdkEven screen = gdk_screen_get_default(); if (remmina_pref.minimize_to_tray && (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) != 0 - && (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0 - && remmina_public_get_current_workspace(screen) - == remmina_public_get_window_workspace(GTK_WINDOW(widget)) - && gdk_screen_get_number(screen) == gdk_screen_get_number(gtk_widget_get_screen(widget))) + && (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0 + && remmina_public_get_current_workspace(screen) + == remmina_public_get_window_workspace(GTK_WINDOW(widget)) + && gdk_screen_get_number(screen) == gdk_screen_get_number(gtk_widget_get_screen(widget))) { gtk_widget_hide(widget); return TRUE; @@ -2255,7 +2382,7 @@ static gboolean remmina_connection_window_state_event(GtkWidget* widget, GdkEven return FALSE; // moved here because a function should return a value. Should be correct } -static GtkWidget* + static GtkWidget* remmina_connection_window_new_from_holder(RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_window_new_from_holder"); @@ -2289,15 +2416,15 @@ static void remmina_connection_window_update_tag(RemminaConnectionWindow* cnnwin switch (remmina_pref.tab_mode) { - case REMMINA_TAB_BY_GROUP: - tag = g_strdup(remmina_file_get_string(cnnobj->remmina_file, "group")); - break; - case REMMINA_TAB_BY_PROTOCOL: - tag = g_strdup(remmina_file_get_string(cnnobj->remmina_file, "protocol")); - break; - default: - tag = NULL; - break; + case REMMINA_TAB_BY_GROUP: + tag = g_strdup(remmina_file_get_string(cnnobj->remmina_file, "group")); + break; + case REMMINA_TAB_BY_PROTOCOL: + tag = g_strdup(remmina_file_get_string(cnnobj->remmina_file, "protocol")); + break; + default: + tag = NULL; + break; } g_object_set_data_full(G_OBJECT(cnnwin), "tag", tag, (GDestroyNotify) g_free); } @@ -2392,7 +2519,7 @@ static GtkWidget* remmina_connection_object_create_tab(RemminaConnectionObject* } static gint remmina_connection_object_append_page(RemminaConnectionObject* cnnobj, GtkNotebook* notebook, GtkWidget* tab, - gint view_mode) + gint view_mode) { TRACE_CALL("remmina_connection_object_append_page"); gint i; @@ -2407,7 +2534,7 @@ static gint remmina_connection_object_append_page(RemminaConnectionObject* cnnob } static void remmina_connection_window_initialize_notebook(GtkNotebook* to, GtkNotebook* from, RemminaConnectionObject* cnnobj, - gint view_mode) + gint view_mode) { TRACE_CALL("remmina_connection_window_initialize_notebook"); gint i, n, c; @@ -2440,14 +2567,14 @@ static void remmina_connection_window_initialize_notebook(GtkNotebook* to, GtkNo remmina_connection_object_append_page(cnnobj, to, tab, view_mode); G_GNUC_BEGIN_IGNORE_DEPRECATIONS - gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container); + gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container); G_GNUC_END_IGNORE_DEPRECATIONS - if (cnnobj->window) - { - gtk_widget_destroy(cnnobj->window); - cnnobj->window = NULL; - } + if (cnnobj->window) + { + gtk_widget_destroy(cnnobj->window); + cnnobj->window = NULL; + } } } else @@ -2467,7 +2594,7 @@ static void remmina_connection_window_initialize_notebook(GtkNotebook* to, GtkNo /* Reparent cnnobj->viewport */ G_GNUC_BEGIN_IGNORE_DEPRECATIONS - gtk_widget_reparent(tc->viewport, tc->scrolled_container); + gtk_widget_reparent(tc->viewport, tc->scrolled_container); G_GNUC_END_IGNORE_DEPRECATIONS } gtk_notebook_set_current_page(to, c); @@ -2488,15 +2615,15 @@ static void remmina_connection_holder_update_notebook(RemminaConnectionHolder* c switch (cnnhld->cnnwin->priv->view_mode) { - case SCROLLED_WINDOW_MODE: - n = gtk_notebook_get_n_pages(notebook); - gtk_notebook_set_show_tabs(notebook, remmina_pref.always_show_tab ? TRUE : n > 1); - gtk_notebook_set_show_border(notebook, remmina_pref.always_show_tab ? TRUE : n > 1); - break; - default: - gtk_notebook_set_show_tabs(notebook, FALSE); - gtk_notebook_set_show_border(notebook, FALSE); - break; + case SCROLLED_WINDOW_MODE: + n = gtk_notebook_get_n_pages(notebook); + gtk_notebook_set_show_tabs(notebook, remmina_pref.always_show_tab ? TRUE : n > 1); + gtk_notebook_set_show_border(notebook, remmina_pref.always_show_tab ? TRUE : n > 1); + break; + default: + gtk_notebook_set_show_tabs(notebook, FALSE); + gtk_notebook_set_show_border(notebook, FALSE); + break; } } @@ -2520,7 +2647,7 @@ static gboolean remmina_connection_holder_on_switch_page_real(gpointer data) } static void remmina_connection_holder_on_switch_page(GtkNotebook* notebook, GtkWidget* page, guint page_num, - RemminaConnectionHolder* cnnhld) + RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_holder_on_switch_page"); RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; @@ -2532,14 +2659,14 @@ static void remmina_connection_holder_on_switch_page(GtkNotebook* notebook, GtkW } static void remmina_connection_holder_on_page_added(GtkNotebook* notebook, GtkWidget* child, guint page_num, - RemminaConnectionHolder* cnnhld) + RemminaConnectionHolder* cnnhld) { if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook)) > 0) remmina_connection_holder_update_notebook(cnnhld); } static void remmina_connection_holder_on_page_removed(GtkNotebook* notebook, GtkWidget* child, guint page_num, - RemminaConnectionHolder* cnnhld) + RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_holder_on_page_removed"); @@ -2554,7 +2681,7 @@ static void remmina_connection_holder_on_page_removed(GtkNotebook* notebook, Gtk } -GtkNotebook* + GtkNotebook* remmina_connection_holder_on_notebook_create_window(GtkNotebook* notebook, GtkWidget* page, gint x, gint y, gpointer data) { /* This signal callback is called by GTK when a detachable tab is dropped on the root window */ @@ -2601,12 +2728,12 @@ remmina_connection_holder_on_notebook_create_window(GtkNotebook* notebook, GtkWi } remmina_protocol_widget_set_hostkey_func(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - (RemminaHostkeyFunc) remmina_connection_window_hostkey_func, cnnobj->cnnhld); + (RemminaHostkeyFunc) remmina_connection_window_hostkey_func, cnnobj->cnnhld); return GTK_NOTEBOOK(cnnobj->cnnhld->cnnwin->priv->notebook); } -static GtkWidget* + static GtkWidget* remmina_connection_holder_create_notebook(RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_holder_create_notebook"); @@ -2618,7 +2745,7 @@ remmina_connection_holder_create_notebook(RemminaConnectionHolder* cnnhld) gtk_widget_show(notebook); g_signal_connect(G_OBJECT(notebook), "create-window", G_CALLBACK(remmina_connection_holder_on_notebook_create_window), - cnnhld); + cnnhld); g_signal_connect(G_OBJECT(notebook), "switch-page", G_CALLBACK(remmina_connection_holder_on_switch_page), cnnhld); g_signal_connect(G_OBJECT(notebook), "page-added", G_CALLBACK(remmina_connection_holder_on_page_added), cnnhld); g_signal_connect(G_OBJECT(notebook), "page-removed", G_CALLBACK(remmina_connection_holder_on_page_removed), cnnhld); @@ -2691,13 +2818,13 @@ static void remmina_connection_holder_create_scrolled(RemminaConnectionHolder* c /* Add drag capabilities to the toolbar */ gtk_drag_source_set(GTK_WIDGET(toolbar), GDK_BUTTON1_MASK, - dnd_targets_tb, sizeof dnd_targets_tb / sizeof *dnd_targets_tb, GDK_ACTION_MOVE); + dnd_targets_tb, sizeof dnd_targets_tb / sizeof *dnd_targets_tb, GDK_ACTION_MOVE); g_signal_connect_after(GTK_WIDGET(toolbar), "drag-begin", G_CALLBACK(remmina_connection_window_tb_drag_begin), cnnhld); g_signal_connect(GTK_WIDGET(toolbar), "drag-failed", G_CALLBACK(remmina_connection_window_tb_drag_failed), cnnhld); /* Add drop capabilities to the drop/dest target for the toolbar (the notebook) */ gtk_drag_dest_set(GTK_WIDGET(notebook), GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT, - dnd_targets_tb, sizeof dnd_targets_tb / sizeof *dnd_targets_tb, GDK_ACTION_MOVE); + dnd_targets_tb, sizeof dnd_targets_tb / sizeof *dnd_targets_tb, GDK_ACTION_MOVE); gtk_drag_dest_set_track_motion(GTK_WIDGET(notebook), TRUE); g_signal_connect(GTK_WIDGET(notebook), "drag-drop", G_CALLBACK(remmina_connection_window_tb_drag_drop), cnnhld); @@ -2712,8 +2839,8 @@ static void remmina_connection_holder_create_scrolled(RemminaConnectionHolder* c gtk_widget_show(GTK_WIDGET(cnnhld->cnnwin)); remmina_connection_window_initialize_notebook(GTK_NOTEBOOK(notebook), - (oldwindow ? GTK_NOTEBOOK(REMMINA_CONNECTION_WINDOW(oldwindow)->priv->notebook) : NULL), cnnobj, - SCROLLED_WINDOW_MODE); + (oldwindow ? GTK_NOTEBOOK(REMMINA_CONNECTION_WINDOW(oldwindow)->priv->notebook) : NULL), cnnobj, + SCROLLED_WINDOW_MODE); if (cnnobj) { @@ -2840,13 +2967,13 @@ static void remmina_connection_holder_create_overlay_ftb_overlay(RemminaConnecti /* Add drag and drop capabilities to the source */ gtk_drag_source_set(GTK_WIDGET(priv->overlay_ftb_overlay), GDK_BUTTON1_MASK, - dnd_targets_ftb, sizeof dnd_targets_ftb / sizeof *dnd_targets_ftb, GDK_ACTION_MOVE); + dnd_targets_ftb, sizeof dnd_targets_ftb / sizeof *dnd_targets_ftb, GDK_ACTION_MOVE); g_signal_connect_after(GTK_WIDGET(priv->overlay_ftb_overlay), "drag-begin", G_CALLBACK(remmina_connection_window_ftb_drag_begin), cnnhld); } static gboolean remmina_connection_window_ftb_drag_drop(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, guint time, gpointer user_data) + gint x, gint y, guint time, gpointer user_data) { TRACE_CALL("remmina_connection_window_ftb_drag_drop"); GtkAllocation wa; @@ -2916,7 +3043,7 @@ static void remmina_connection_window_ftb_drag_begin(GtkWidget *widget, GdkDragC #endif static void remmina_connection_holder_create_fullscreen(RemminaConnectionHolder* cnnhld, RemminaConnectionObject* cnnobj, - gint view_mode) + gint view_mode) { TRACE_CALL("remmina_connection_holder_create_fullscreen"); GtkWidget* window; @@ -2953,8 +3080,8 @@ static void remmina_connection_holder_create_fullscreen(RemminaConnectionHolder* cnnhld->fullscreen_view_mode = view_mode; remmina_connection_window_initialize_notebook(GTK_NOTEBOOK(notebook), - (oldwindow ? GTK_NOTEBOOK(REMMINA_CONNECTION_WINDOW(oldwindow)->priv->notebook) : NULL), cnnobj, - view_mode); + (oldwindow ? GTK_NOTEBOOK(REMMINA_CONNECTION_WINDOW(oldwindow)->priv->notebook) : NULL), cnnobj, + view_mode); if (cnnobj) { @@ -2972,7 +3099,7 @@ static void remmina_connection_holder_create_fullscreen(RemminaConnectionHolder* remmina_connection_holder_create_overlay_ftb_overlay(cnnhld); /* Add drag and drop capabilities to the drop/dest target for floating toolbar */ gtk_drag_dest_set(GTK_WIDGET(priv->overlay), GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT, - dnd_targets_ftb, sizeof dnd_targets_ftb / sizeof *dnd_targets_ftb, GDK_ACTION_MOVE); + dnd_targets_ftb, sizeof dnd_targets_ftb / sizeof *dnd_targets_ftb, GDK_ACTION_MOVE); gtk_drag_dest_set_track_motion(GTK_WIDGET(priv->notebook), TRUE); g_signal_connect(GTK_WIDGET(priv->overlay), "drag-drop", G_CALLBACK(remmina_connection_window_ftb_drag_drop), cnnhld); #else @@ -3001,7 +3128,7 @@ static void remmina_connection_holder_create_fullscreen(RemminaConnectionHolder* } static gboolean remmina_connection_window_hostkey_func(RemminaProtocolWidget* gp, guint keyval, gboolean release, - RemminaConnectionHolder* cnnhld) + RemminaConnectionHolder* cnnhld) { TRACE_CALL("remmina_connection_window_hostkey_func"); DECLARE_CNNOBJ_WITH_RETURN(FALSE); @@ -3049,19 +3176,19 @@ static gboolean remmina_connection_window_hostkey_func(RemminaProtocolWidget* gp { switch (priv->view_mode) { - case SCROLLED_WINDOW_MODE: - remmina_connection_holder_create_fullscreen( - cnnhld, - NULL, - cnnhld->fullscreen_view_mode ? - cnnhld->fullscreen_view_mode : VIEWPORT_FULLSCREEN_MODE); - break; - case SCROLLED_FULLSCREEN_MODE: - case VIEWPORT_FULLSCREEN_MODE: - remmina_connection_holder_create_scrolled(cnnhld, NULL); - break; - default: - break; + case SCROLLED_WINDOW_MODE: + remmina_connection_holder_create_fullscreen( + cnnhld, + NULL, + cnnhld->fullscreen_view_mode ? + cnnhld->fullscreen_view_mode : VIEWPORT_FULLSCREEN_MODE); + break; + case SCROLLED_FULLSCREEN_MODE: + case VIEWPORT_FULLSCREEN_MODE: + remmina_connection_holder_create_scrolled(cnnhld, NULL); + break; + default: + break; } } else if (keyval == remmina_pref.shortcutkey_autofit) @@ -3090,24 +3217,29 @@ static gboolean remmina_connection_window_hostkey_func(RemminaProtocolWidget* gp if (gtk_widget_is_sensitive(GTK_WIDGET(priv->toolitem_scale))) { gtk_toggle_tool_button_set_active( - GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_scale), - !gtk_toggle_tool_button_get_active( - GTK_TOGGLE_TOOL_BUTTON( - priv->toolitem_scale))); + GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_scale), + !gtk_toggle_tool_button_get_active( + GTK_TOGGLE_TOOL_BUTTON( + priv->toolitem_scale))); } } else if (keyval == remmina_pref.shortcutkey_grab) { gtk_toggle_tool_button_set_active( - GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_grab), - !gtk_toggle_tool_button_get_active( - GTK_TOGGLE_TOOL_BUTTON( - priv->toolitem_grab))); + GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_grab), + !gtk_toggle_tool_button_get_active( + GTK_TOGGLE_TOOL_BUTTON( + priv->toolitem_grab))); } else if (keyval == remmina_pref.shortcutkey_minimize) { remmina_connection_holder_toolbar_minimize(GTK_WIDGET(gp), - cnnhld); + cnnhld); + } + else if (keyval == remmina_pref.shortcutkey_screenshot) + { + remmina_connection_holder_toolbar_screenshot(GTK_WIDGET(gp), + cnnhld); } else if (keyval == remmina_pref.shortcutkey_disconnect) { @@ -3118,30 +3250,30 @@ static gboolean remmina_connection_window_hostkey_func(RemminaProtocolWidget* gp if (priv->view_mode == SCROLLED_WINDOW_MODE) { remmina_pref.hide_connection_toolbar = - !remmina_pref.hide_connection_toolbar; + !remmina_pref.hide_connection_toolbar; remmina_connection_holder_showhide_toolbar( - cnnhld, TRUE); + cnnhld, TRUE); } } else { for (feature = - remmina_protocol_widget_get_features( - REMMINA_PROTOCOL_WIDGET( - cnnobj->proto)); - feature && feature->type; - feature++) + remmina_protocol_widget_get_features( + REMMINA_PROTOCOL_WIDGET( + cnnobj->proto)); + feature && feature->type; + feature++) { if (feature->type - == REMMINA_PROTOCOL_FEATURE_TYPE_TOOL - && GPOINTER_TO_UINT( - feature->opt3) - == keyval) + == REMMINA_PROTOCOL_FEATURE_TYPE_TOOL + && GPOINTER_TO_UINT( + feature->opt3) + == keyval) { remmina_protocol_widget_call_feature_by_ref( - REMMINA_PROTOCOL_WIDGET( - cnnobj->proto), - feature); + REMMINA_PROTOCOL_WIDGET( + cnnobj->proto), + feature); break; } } @@ -3157,18 +3289,18 @@ static RemminaConnectionWindow* remmina_connection_window_find(RemminaFile* remm switch (remmina_pref.tab_mode) { - case REMMINA_TAB_BY_GROUP: - tag = remmina_file_get_string(remminafile, "group"); - break; - case REMMINA_TAB_BY_PROTOCOL: - tag = remmina_file_get_string(remminafile, "protocol"); - break; - case REMMINA_TAB_ALL: - tag = NULL; - break; - case REMMINA_TAB_NONE: - default: - return NULL; + case REMMINA_TAB_BY_GROUP: + tag = remmina_file_get_string(remminafile, "group"); + break; + case REMMINA_TAB_BY_PROTOCOL: + tag = remmina_file_get_string(remminafile, "protocol"); + break; + case REMMINA_TAB_ALL: + tag = NULL; + break; + case REMMINA_TAB_NONE: + default: + return NULL; } return REMMINA_CONNECTION_WINDOW(remmina_widget_pool_find(REMMINA_TYPE_CONNECTION_WINDOW, tag)); } @@ -3205,13 +3337,13 @@ static void remmina_connection_object_on_connect(RemminaProtocolWidget* gp, Remm cnnobj->connected = TRUE; remmina_protocol_widget_set_hostkey_func(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - (RemminaHostkeyFunc) remmina_connection_window_hostkey_func, cnnhld); + (RemminaHostkeyFunc) remmina_connection_window_hostkey_func, cnnhld); /* Remember recent list for quick connect */ if (remmina_file_get_filename(cnnobj->remmina_file) == NULL) { remmina_pref_add_recent(remmina_file_get_string(cnnobj->remmina_file, "protocol"), - remmina_file_get_string(cnnobj->remmina_file, "server")); + remmina_file_get_string(cnnobj->remmina_file, "server")); } /* Save credentials */ @@ -3222,26 +3354,26 @@ static void remmina_connection_object_on_connect(RemminaProtocolWidget* gp, Remm i = remmina_file_get_int(cnnobj->remmina_file, "viewmode", 0); switch (i) { - case SCROLLED_FULLSCREEN_MODE: - case VIEWPORT_FULLSCREEN_MODE: - remmina_connection_holder_create_fullscreen(cnnhld, cnnobj, i); - break; - case SCROLLED_WINDOW_MODE: - default: - remmina_connection_holder_create_scrolled(cnnhld, cnnobj); - break; + case SCROLLED_FULLSCREEN_MODE: + case VIEWPORT_FULLSCREEN_MODE: + remmina_connection_holder_create_fullscreen(cnnhld, cnnobj, i); + break; + case SCROLLED_WINDOW_MODE: + default: + remmina_connection_holder_create_scrolled(cnnhld, cnnobj); + break; } } else { tab = remmina_connection_object_create_tab(cnnobj); i = remmina_connection_object_append_page(cnnobj, GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), tab, - cnnhld->cnnwin->priv->view_mode); + cnnhld->cnnwin->priv->view_mode); G_GNUC_BEGIN_IGNORE_DEPRECATIONS - gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container); + gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container); G_GNUC_END_IGNORE_DEPRECATIONS - gtk_window_present(GTK_WINDOW(cnnhld->cnnwin)); + gtk_window_present(GTK_WINDOW(cnnhld->cnnwin)); gtk_notebook_set_current_page(GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), i); } @@ -3268,7 +3400,7 @@ static void remmina_connection_object_on_disconnect(RemminaProtocolWidget* gp, R /* Detach the protocol widget from the notebook now, or we risk that a * window delete will destroy cnnobj->proto before we complete disconnection. - */ + */ pparent = gtk_widget_get_parent(cnnobj->proto); if (pparent != NULL) { @@ -3297,7 +3429,7 @@ static void remmina_connection_object_on_disconnect(RemminaProtocolWidget* gp, R if (remmina_protocol_widget_has_error(gp)) { dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - remmina_protocol_widget_get_error_message(gp), NULL); + remmina_protocol_widget_get_error_message(gp), NULL); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dialog); remmina_widget_pool_register(dialog); @@ -3306,9 +3438,9 @@ static void remmina_connection_object_on_disconnect(RemminaProtocolWidget* gp, R if (cnnhld && cnnhld->cnnwin && cnnobj->scrolled_container) { gtk_notebook_remove_page( - GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), - gtk_notebook_page_num(GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), - cnnobj->scrolled_container)); + GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), + gtk_notebook_page_num(GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), + cnnobj->scrolled_container)); } cnnobj->remmina_file = NULL; @@ -3345,7 +3477,7 @@ gboolean remmina_connection_window_open_from_filename(const gchar* filename) else { dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - _("File %s not found."), filename); + _("File %s not found."), filename); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dialog); remmina_widget_pool_register(dialog); @@ -3359,7 +3491,7 @@ void remmina_connection_window_open_from_file(RemminaFile* remminafile) remmina_connection_window_open_from_file_full(remminafile, NULL, NULL, NULL); } -GtkWidget* + GtkWidget* remmina_connection_window_open_from_file_full(RemminaFile* remminafile, GCallback disconnect_cb, gpointer data, guint* handler) { TRACE_CALL("remmina_connection_window_open_from_file_full"); @@ -3395,9 +3527,9 @@ remmina_connection_window_open_from_file_full(RemminaFile* remminafile, GCallbac } g_signal_connect(G_OBJECT(cnnobj->proto), "disconnect", G_CALLBACK(remmina_connection_object_on_disconnect), cnnobj); g_signal_connect(G_OBJECT(cnnobj->proto), "desktop-resize", G_CALLBACK(remmina_connection_object_on_desktop_resize), - cnnobj); + cnnobj); g_signal_connect(G_OBJECT(cnnobj->proto), "update-align", G_CALLBACK(remmina_connection_object_on_update_align), - cnnobj); + cnnobj); /* Create the viewport to make the RemminaProtocolWidget scrollable */ cnnobj->viewport = gtk_viewport_new(NULL, NULL); @@ -3408,8 +3540,8 @@ remmina_connection_window_open_from_file_full(RemminaFile* remminafile, GCallbac /* Determine whether the plugin can scale or not. If the plugin can scale and we do * not want to expand, then we add a GtkAspectFrame to maintain aspect ratio during scaling */ cnnobj->plugin_can_scale = remmina_plugin_manager_query_feature_by_type(REMMINA_PLUGIN_TYPE_PROTOCOL, - remmina_file_get_string(remminafile, "protocol"), - REMMINA_PROTOCOL_FEATURE_TYPE_SCALE); + remmina_file_get_string(remminafile, "protocol"), + REMMINA_PROTOCOL_FEATURE_TYPE_SCALE); cnnobj->aspectframe = NULL; gtk_container_add(GTK_CONTAINER(cnnobj->viewport), cnnobj->proto); |