Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/spice/spice_plugin.c65
-rw-r--r--src/include/remmina/plugin.h1
-rw-r--r--src/rcw.c11
-rw-r--r--src/remmina_plugin_manager.c1
-rw-r--r--src/remmina_protocol_widget.c19
-rw-r--r--src/remmina_protocol_widget.h2
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);
diff --git a/src/rcw.c b/src/rcw.c
index 04a9028c2..a4f00ddc1 100644
--- a/src/rcw.c
+++ b/src/rcw.c
@@ -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);