Rebuild menu when agent is connected. Only when the agent is running may a display be enabled/disabled. --- src/virt-viewer-app.c | 9 +++++++++ src/virt-viewer-session-spice.c | 18 ++++++++++++++---- src/virt-viewer-session.c | 10 ++++++++++ src/virt-viewer-session.h | 1 + 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c index a88264b..def52c5 100644 --- a/src/virt-viewer-app.c +++ b/src/virt-viewer-app.c @@ -685,6 +685,13 @@ virt_viewer_app_display_removed(VirtViewerSession *session G_GNUC_UNUSED, virt_viewer_app_remove_nth_window(self, nth); } +static void +virt_viewer_app_display_updated(VirtViewerSession *session G_GNUC_UNUSED, + VirtViewerApp *self) +{ + virt_viewer_app_update_menu_displays(self); +} + int virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type) { @@ -735,6 +742,8 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type) G_CALLBACK(virt_viewer_app_display_added), self); g_signal_connect(priv->session, "session-display-removed", G_CALLBACK(virt_viewer_app_display_removed), self); + g_signal_connect(priv->session, "session-display-updated", + G_CALLBACK(virt_viewer_app_display_updated), self); g_signal_connect(priv->session, "session-cut-text", G_CALLBACK(virt_viewer_app_server_cut_text), self); diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c index a728cb1..5fcd7fb 100644 --- a/src/virt-viewer-session-spice.c +++ b/src/virt-viewer-session-spice.c @@ -406,12 +406,21 @@ virt_viewer_session_spice_usb_device_selection(VirtViewerSession *session, } static void -agent_connected_changed(SpiceChannel *cmain, +agent_connected_changed(SpiceChannel *cmain G_GNUC_UNUSED, GParamSpec *pspec G_GNUC_UNUSED, VirtViewerSessionSpice *self) { + // this will force refresh of application menu + g_signal_emit_by_name(self, "session-display-updated"); +} + +static void +agent_connected_fullscreen_auto_conf(SpiceChannel *cmain, + GParamSpec *pspec G_GNUC_UNUSED, + VirtViewerSessionSpice *self) +{ if (virt_viewer_session_spice_fullscreen_auto_conf(self)) - g_signal_handlers_disconnect_by_func(cmain, agent_connected_changed, self); + g_signal_handlers_disconnect_by_func(cmain, agent_connected_fullscreen_auto_conf, self); } static void @@ -512,8 +521,9 @@ virt_viewer_session_spice_channel_new(SpiceSession *s, G_CALLBACK(virt_viewer_session_spice_main_channel_event), self); self->priv->main_channel = SPICE_MAIN_CHANNEL(channel); - g_signal_connect(channel, "notify::agent-connected", G_CALLBACK(agent_connected_changed), self); - agent_connected_changed(channel, NULL, self); + g_signal_connect(channel, "notify::agent-connected", G_CALLBACK(agent_connected_changed), self); + g_signal_connect(channel, "notify::agent-connected", G_CALLBACK(agent_connected_fullscreen_auto_conf), self); + agent_connected_fullscreen_auto_conf(channel, NULL, self); g_signal_emit_by_name(session, "session-connected"); } diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c index 9249a1f..a1d96c2 100644 --- a/src/virt-viewer-session.c +++ b/src/virt-viewer-session.c @@ -233,6 +233,16 @@ virt_viewer_session_class_init(VirtViewerSessionClass *class) 1, VIRT_VIEWER_TYPE_DISPLAY); + g_signal_new("session-display-updated", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_HOOKS, + G_STRUCT_OFFSET(VirtViewerSessionClass, session_display_updated), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + g_signal_new("session-cut-text", G_OBJECT_CLASS_TYPE(object_class), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_HOOKS, diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h index 44e4674..38ed988 100644 --- a/src/virt-viewer-session.h +++ b/src/virt-viewer-session.h @@ -88,6 +88,7 @@ struct _VirtViewerSessionClass { VirtViewerDisplay *display); void (*session_display_removed)(VirtViewerSession *session, VirtViewerDisplay *display); + void (*session_display_updated)(VirtViewerSession *session); void (*session_cut_text)(VirtViewerSession *session, const gchar *str); void (*session_bell)(VirtViewerSession *session); -- 1.7.10.4