diff options
-rw-r--r-- | plugins/spice/spice_plugin.c | 65 | ||||
-rw-r--r-- | src/include/remmina/plugin.h | 1 | ||||
-rw-r--r-- | src/rcw.c | 11 | ||||
-rw-r--r-- | src/remmina_plugin_manager.c | 1 | ||||
-rw-r--r-- | src/remmina_protocol_widget.c | 19 | ||||
-rw-r--r-- | src/remmina_protocol_widget.h | 2 |
6 files changed, 76 insertions, 23 deletions
diff --git a/plugins/spice/spice_plugin.c b/plugins/spice/spice_plugin.c index 23eb933f1..e3ab32f2a 100644 --- a/plugins/spice/spice_plugin.c +++ b/plugins/spice/spice_plugin.c @@ -38,7 +38,7 @@ enum { REMMINA_PLUGIN_SPICE_FEATURE_PREF_VIEWONLY = 1, - REMMINA_PLUGIN_SPICE_FEATURE_PREF_RESIZEGUEST, + REMMINA_PLUGIN_SPICE_FEATURE_DYNRESUPDATE, REMMINA_PLUGIN_SPICE_FEATURE_PREF_DISABLECLIPBOARD, REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTDEL, REMMINA_PLUGIN_SPICE_FEATURE_TOOL_USBREDIR, @@ -49,8 +49,9 @@ static RemminaPluginService *remmina_plugin_service = NULL; static void remmina_plugin_spice_channel_new_cb(SpiceSession *, SpiceChannel *, RemminaProtocolWidget *); static void remmina_plugin_spice_main_channel_event_cb(SpiceChannel *, SpiceChannelEvent, RemminaProtocolWidget *); +static void remmina_plugin_spice_agent_connected_event_cb(SpiceChannel *, RemminaProtocolWidget *); static void remmina_plugin_spice_display_ready_cb(GObject *, GParamSpec *, RemminaProtocolWidget *); -static void remmina_plugin_spice_update_scale(RemminaProtocolWidget *); +static void remmina_plugin_spice_update_scale_mode(RemminaProtocolWidget *); void remmina_plugin_spice_select_usb_devices(RemminaProtocolWidget *); #ifdef SPICE_GTK_CHECK_VERSION @@ -151,6 +152,9 @@ static gboolean remmina_plugin_spice_close_connection(RemminaProtocolWidget *gp) g_signal_handlers_disconnect_by_func(gpdata->main_channel, G_CALLBACK(remmina_plugin_spice_main_channel_event_cb), gp); + g_signal_handlers_disconnect_by_func(gpdata->main_channel, + G_CALLBACK(remmina_plugin_spice_agent_connected_event_cb), + gp); } if (gpdata->session) { @@ -187,6 +191,10 @@ static void remmina_plugin_spice_channel_new_cb(SpiceSession *session, SpiceChan "channel-event", G_CALLBACK(remmina_plugin_spice_main_channel_event_cb), gp); + g_signal_connect(channel, + "main-agent-update", + G_CALLBACK(remmina_plugin_spice_agent_connected_event_cb), + gp); #ifdef SPICE_GTK_CHECK_VERSION # if SPICE_GTK_CHECK_VERSION(0, 31, 0) g_signal_connect(channel, @@ -301,12 +309,27 @@ static void remmina_plugin_spice_main_channel_event_cb(SpiceChannel *channel, Sp } } +void remmina_plugin_spice_agent_connected_event_cb(SpiceChannel *channel, RemminaProtocolWidget *gp) +{ + TRACE_CALL(__func__); + gboolean connected; + + g_object_get(channel, + "agent-connected", &connected, + NULL); + + if (connected) { + remmina_plugin_service->protocol_plugin_unlock_dynres(gp); + } else { + remmina_plugin_service->protocol_plugin_lock_dynres(gp); + } +} + static void remmina_plugin_spice_display_ready_cb(GObject *display, GParamSpec *param_spec, RemminaProtocolWidget *gp) { TRACE_CALL(__func__); gboolean ready; - RemminaFile *remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); g_object_get(display, "ready", &ready, NULL); @@ -315,9 +338,10 @@ static void remmina_plugin_spice_display_ready_cb(GObject *display, GParamSpec * G_CALLBACK(remmina_plugin_spice_display_ready_cb), gp); + RemminaScaleMode scaleMode = remmina_plugin_service->remmina_protocol_widget_get_current_scale_mode(gp); g_object_set(display, - "scaling", (remmina_plugin_service->remmina_protocol_widget_get_current_scale_mode(gp) != REMMINA_PROTOCOL_WIDGET_SCALE_MODE_NONE), - "resize-guest", remmina_plugin_service->file_get_int(remminafile, "resizeguest", FALSE), + "scaling", (scaleMode == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_SCALED), + "resize-guest", (scaleMode == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_DYNRES), NULL); gtk_container_add(GTK_CONTAINER(gp), GTK_WIDGET(display)); gtk_widget_show(GTK_WIDGET(display)); @@ -351,18 +375,20 @@ static void remmina_plugin_spice_send_ctrlaltdel(RemminaProtocolWidget *gp) remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys)); } -static void remmina_plugin_spice_update_scale(RemminaProtocolWidget *gp) +static void remmina_plugin_spice_update_scale_mode(RemminaProtocolWidget *gp) { TRACE_CALL(__func__); - gint scale, width, height; + gint width, height; RemminaPluginSpiceData *gpdata = GET_PLUGIN_DATA(gp); - RemminaFile *remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); + RemminaScaleMode scaleMode = remmina_plugin_service->remmina_protocol_widget_get_current_scale_mode(gp); - scale = remmina_plugin_service->file_get_int(remminafile, "scale", FALSE); - g_object_set(gpdata->display, "scaling", scale, NULL); + g_object_set(gpdata->display, + "scaling", (scaleMode == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_SCALED), + "resize-guest", (scaleMode == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_DYNRES), + NULL); - if (scale) { + if (scaleMode != REMMINA_PROTOCOL_WIDGET_SCALE_MODE_NONE) { /* In scaled mode, the SpiceDisplay will get its dimensions from its parent */ gtk_widget_set_size_request(GTK_WIDGET(gpdata->display), -1, -1 ); }else { @@ -396,20 +422,15 @@ static void remmina_plugin_spice_call_feature(RemminaProtocolWidget *gp, const R remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE), NULL); break; - case REMMINA_PLUGIN_SPICE_FEATURE_PREF_RESIZEGUEST: - g_object_set(gpdata->display, - "resize-guest", - remmina_plugin_service->file_get_int(remminafile, "resizeguest", TRUE), - NULL); - break; case REMMINA_PLUGIN_SPICE_FEATURE_PREF_DISABLECLIPBOARD: g_object_set(gpdata->gtk_session, "auto-clipboard", !remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE), NULL); break; + case REMMINA_PLUGIN_SPICE_FEATURE_DYNRESUPDATE: case REMMINA_PLUGIN_SPICE_FEATURE_SCALE: - remmina_plugin_spice_update_scale(gp); + remmina_plugin_spice_update_scale_mode(gp); break; case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTDEL: remmina_plugin_spice_send_ctrlaltdel(gp); @@ -455,7 +476,6 @@ static const RemminaProtocolSetting remmina_plugin_spice_advanced_settings[] = { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableclipboard", N_("Disable clipboard sync"), TRUE, NULL, NULL}, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disablepasswordstoring", N_("Forget passwords after use"), TRUE, NULL, NULL}, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "enableaudio", N_("Enable audio channel"), TRUE, NULL, NULL}, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "resizeguest", N_("Resize guest to match window size"), TRUE, NULL, NULL}, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "sharesmartcard", N_("Share smart card"), TRUE, NULL, NULL}, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "viewonly", N_("View only"), TRUE, NULL, NULL}, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, TRUE, NULL, NULL} @@ -465,16 +485,16 @@ static const RemminaProtocolSetting remmina_plugin_spice_advanced_settings[] = * The last element of the array must be REMMINA_PROTOCOL_FEATURE_TYPE_END. */ static const RemminaProtocolFeature remmina_plugin_spice_features[] = { - { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_SPICE_FEATURE_PREF_VIEWONLY, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "viewonly", - N_("View only") }, - { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_SPICE_FEATURE_PREF_RESIZEGUEST, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "resizeguest", N_("Resize guest to match window size")}, + { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_SPICE_FEATURE_PREF_VIEWONLY, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "viewonly", N_("View only")}, { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_SPICE_FEATURE_PREF_DISABLECLIPBOARD, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "disableclipboard", N_("Disable clipboard sync")}, { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTDEL, N_("Send Ctrl+Alt+Delete"), NULL, NULL}, { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_SPICE_FEATURE_TOOL_USBREDIR, N_("Select USB devices for redirection"), NULL, NULL}, + { REMMINA_PROTOCOL_FEATURE_TYPE_DYNRESUPDATE, REMMINA_PLUGIN_SPICE_FEATURE_DYNRESUPDATE, NULL, NULL, NULL}, { REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, REMMINA_PLUGIN_SPICE_FEATURE_SCALE, NULL, NULL, NULL}, { REMMINA_PROTOCOL_FEATURE_TYPE_END, 0, NULL, NULL, NULL} }; + static RemminaProtocolPlugin remmina_plugin_spice = { REMMINA_PLUGIN_TYPE_PROTOCOL, // Type @@ -512,3 +532,4 @@ remmina_plugin_entry(RemminaPluginService *service) return TRUE; } + diff --git a/src/include/remmina/plugin.h b/src/include/remmina/plugin.h index 4886374da..5ad75ce28 100644 --- a/src/include/remmina/plugin.h +++ b/src/include/remmina/plugin.h @@ -167,6 +167,7 @@ typedef struct _RemminaPluginService { void (*protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp); void (*protocol_plugin_signal_connection_opened)(RemminaProtocolWidget *gp); void (*protocol_plugin_update_align)(RemminaProtocolWidget *gp); + void (*protocol_plugin_lock_dynres)(RemminaProtocolWidget *gp); void (*protocol_plugin_unlock_dynres)(RemminaProtocolWidget *gp); void (*protocol_plugin_desktop_resize)(RemminaProtocolWidget *gp); gint (*protocol_plugin_init_auth)(RemminaProtocolWidget *gp, RemminaMessagePanelFlags pflags, const gchar *title, const gchar *default_username, const gchar *default_password, const gchar *default_domain, const gchar *password_prompt); @@ -388,7 +388,7 @@ static RemminaScaleMode get_current_allowed_scale_mode(RemminaConnectionObject * scalemode = remmina_protocol_widget_get_current_scale_mode(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); plugin_has_dynres = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), - REMMINA_PROTOCOL_FEATURE_TYPE_SCALE); + REMMINA_PROTOCOL_FEATURE_TYPE_DYNRESUPDATE); plugin_can_scale = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), REMMINA_PROTOCOL_FEATURE_TYPE_SCALE); @@ -3958,6 +3958,14 @@ void rco_on_update_align(RemminaProtocolWidget *gp, gpointer data) remmina_protocol_widget_update_alignment(cnnobj); } +void rco_on_lock_dynres(RemminaProtocolWidget *gp, gpointer data) +{ + TRACE_CALL(__func__); + RemminaConnectionObject *cnnobj = gp->cnnobj; + cnnobj->dynres_unlocked = FALSE; + rco_update_toolbar(cnnobj); +} + void rco_on_unlock_dynres(RemminaProtocolWidget *gp, gpointer data) { TRACE_CALL(__func__); @@ -4125,6 +4133,7 @@ GtkWidget *rcw_open_from_file_full(RemminaFile *remminafile, GCallback disconnec g_signal_connect(G_OBJECT(cnnobj->proto), "disconnect", G_CALLBACK(rco_on_disconnect), NULL); g_signal_connect(G_OBJECT(cnnobj->proto), "desktop-resize", G_CALLBACK(rco_on_desktop_resize), NULL); g_signal_connect(G_OBJECT(cnnobj->proto), "update-align", G_CALLBACK(rco_on_update_align), NULL); + g_signal_connect(G_OBJECT(cnnobj->proto), "lock-dynres", G_CALLBACK(rco_on_lock_dynres), NULL); g_signal_connect(G_OBJECT(cnnobj->proto), "unlock-dynres", G_CALLBACK(rco_on_unlock_dynres), NULL); if (!remmina_pref.save_view_mode) diff --git a/src/remmina_plugin_manager.c b/src/remmina_plugin_manager.c index 7ce2edf75..6bc3abade 100644 --- a/src/remmina_plugin_manager.c +++ b/src/remmina_plugin_manager.c @@ -191,6 +191,7 @@ RemminaPluginService remmina_plugin_manager_service = remmina_protocol_widget_signal_connection_closed, remmina_protocol_widget_signal_connection_opened, remmina_protocol_widget_update_align, + remmina_protocol_widget_lock_dynres, remmina_protocol_widget_unlock_dynres, remmina_protocol_widget_desktop_resize, remmina_protocol_widget_panel_auth, diff --git a/src/remmina_protocol_widget.c b/src/remmina_protocol_widget.c index d595df1fb..60aaed820 100644 --- a/src/remmina_protocol_widget.c +++ b/src/remmina_protocol_widget.c @@ -114,6 +114,7 @@ enum { DISCONNECT_SIGNAL, DESKTOP_RESIZE_SIGNAL, UPDATE_ALIGN_SIGNAL, + LOCK_DYNRES_SIGNAL, UNLOCK_DYNRES_SIGNAL, LAST_SIGNAL }; @@ -141,6 +142,9 @@ static void remmina_protocol_widget_class_init(RemminaProtocolWidgetClass *klass remmina_protocol_widget_signals[UPDATE_ALIGN_SIGNAL] = g_signal_new("update-align", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaProtocolWidgetClass, update_align), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + remmina_protocol_widget_signals[LOCK_DYNRES_SIGNAL] = g_signal_new("lock-dynres", G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaProtocolWidgetClass, lock_dynres), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); remmina_protocol_widget_signals[UNLOCK_DYNRES_SIGNAL] = g_signal_new("unlock-dynres", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaProtocolWidgetClass, unlock_dynres), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); @@ -398,6 +402,14 @@ void remmina_protocol_widget_update_align(RemminaProtocolWidget *gp) g_idle_add(update_align, (gpointer)gp); } +static gboolean lock_dynres(gpointer data) +{ + TRACE_CALL(__func__); + RemminaProtocolWidget *gp = (RemminaProtocolWidget *)data; + g_signal_emit_by_name(G_OBJECT(gp), "lock-dynres"); + return G_SOURCE_REMOVE; +} + static gboolean unlock_dynres(gpointer data) { TRACE_CALL(__func__); @@ -406,6 +418,13 @@ static gboolean unlock_dynres(gpointer data) return G_SOURCE_REMOVE; } +void remmina_protocol_widget_lock_dynres(RemminaProtocolWidget *gp) +{ + /* Called by the plugin to do updates on rcw */ + TRACE_CALL(__func__); + g_idle_add(lock_dynres, (gpointer)gp); +} + void remmina_protocol_widget_unlock_dynres(RemminaProtocolWidget *gp) { /* Called by the plugin to do updates on rcw */ diff --git a/src/remmina_protocol_widget.h b/src/remmina_protocol_widget.h index f4224f2ce..d8d401f7a 100644 --- a/src/remmina_protocol_widget.h +++ b/src/remmina_protocol_widget.h @@ -67,6 +67,7 @@ struct _RemminaProtocolWidgetClass { void (*disconnect)(RemminaProtocolWidget *gp); void (*desktop_resize)(RemminaProtocolWidget *gp); void (*update_align)(RemminaProtocolWidget *gp); + void (*lock_dynres)(RemminaProtocolWidget *gp); void (*unlock_dynres)(RemminaProtocolWidget *gp); }; @@ -98,6 +99,7 @@ void remmina_protocol_widget_close_connection(RemminaProtocolWidget *gp); void remmina_protocol_widget_signal_connection_closed(RemminaProtocolWidget *gp); void remmina_protocol_widget_signal_connection_opened(RemminaProtocolWidget *gp); void remmina_protocol_widget_update_align(RemminaProtocolWidget *gp); +void remmina_protocol_widget_lock_dynres(RemminaProtocolWidget *gp); void remmina_protocol_widget_unlock_dynres(RemminaProtocolWidget *gp); void remmina_protocol_widget_desktop_resize(RemminaProtocolWidget *gp); void remmina_protocol_widget_grab_focus(RemminaProtocolWidget *gp); |