This flag will help to track whether the display has been removed/closed and whether it really has a valid display. Ready in contrast, is used to "hide" temporarily the display (when starting or redrawing the display, to avoid artifacts) --- src/virt-viewer-app.c | 12 +++++++----- src/virt-viewer-display-spice.c | 20 ++++++++++++++++++++ src/virt-viewer-display.c | 15 +++++++++++++++ src/virt-viewer-display.h | 2 ++ src/virt-viewer-window.c | 12 ++++++++++++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c index 3057116..727eb81 100644 --- a/src/virt-viewer-app.c +++ b/src/virt-viewer-app.c @@ -622,15 +622,17 @@ display_show_hint(VirtViewerDisplay *display, "show-hint", &hint, NULL); - if (hint == 0) { + if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED) { + virt_viewer_window_hide(win); + } else if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY) { + virt_viewer_notebook_show_display(nb); + virt_viewer_window_show(win); + gtk_window_present(virt_viewer_window_get_window(win)); + } else { if (win != self->priv->main_window && g_getenv("VIRT_VIEWER_HIDE")) virt_viewer_window_hide(win); virt_viewer_notebook_show_status(nb, _("Waiting for display %d..."), nth + 1); - } else { - virt_viewer_notebook_show_display(nb); - virt_viewer_window_show(win); - gtk_window_present(virt_viewer_window_get_window(win)); } g_object_unref(self); diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c index 7bf9a9a..101abc5 100644 --- a/src/virt-viewer-display-spice.c +++ b/src/virt-viewer-display-spice.c @@ -75,9 +75,26 @@ virt_viewer_display_spice_class_init(VirtViewerDisplaySpiceClass *klass) } static void +show_hint_changed(VirtViewerDisplay *self) +{ + SpiceMainChannel *main_channel = virt_viewer_session_spice_get_main_channel( + VIRT_VIEWER_SESSION_SPICE(virt_viewer_display_get_session(self))); + guint enabled = TRUE; + guint nth; + + g_object_get(self, "nth-display", &nth, NULL); + if (virt_viewer_display_get_show_hint(self) & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED) + enabled = FALSE; + + spice_main_set_display_enabled(main_channel, nth, enabled); +} + +static void virt_viewer_display_spice_init(VirtViewerDisplaySpice *self G_GNUC_UNUSED) { self->priv = VIRT_VIEWER_DISPLAY_SPICE_GET_PRIVATE(self); + + g_signal_connect(self, "notify::show-hint", G_CALLBACK(show_hint_changed), NULL); } static void @@ -166,6 +183,9 @@ virt_viewer_display_spice_size_allocate(VirtViewerDisplaySpice *self, if (virt_viewer_display_get_auto_resize(VIRT_VIEWER_DISPLAY(self)) == FALSE) return; + if (virt_viewer_display_get_show_hint(VIRT_VIEWER_DISPLAY(self)) & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED) + return; + if (virt_viewer_display_get_zoom(VIRT_VIEWER_DISPLAY(self))) { zoom = virt_viewer_display_get_zoom_level(VIRT_VIEWER_DISPLAY(self)); diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c index a954671..18fed19 100644 --- a/src/virt-viewer-display.c +++ b/src/virt-viewer-display.c @@ -553,6 +553,21 @@ void virt_viewer_display_set_show_hint(VirtViewerDisplay *self, guint hint) g_object_notify(G_OBJECT(self), "show-hint"); } +void virt_viewer_display_set_enabled(VirtViewerDisplay *self, gboolean enabled) +{ + guint hint; + + g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self)); + + hint = virt_viewer_display_get_show_hint(self); + if (enabled) + hint &= ~VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED; + else + hint |= VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED; + + virt_viewer_display_set_show_hint(self, hint); +} + VirtViewerSession* virt_viewer_display_get_session(VirtViewerDisplay *self) { g_return_val_if_fail(VIRT_VIEWER_IS_DISPLAY(self), NULL); diff --git a/src/virt-viewer-display.h b/src/virt-viewer-display.h index 225080d..89b4817 100644 --- a/src/virt-viewer-display.h +++ b/src/virt-viewer-display.h @@ -57,6 +57,7 @@ typedef struct _VirtViewerDisplayChannel VirtViewerDisplayChannel; typedef enum { VIRT_VIEWER_DISPLAY_SHOW_HINT_READY = 1 << 0, + VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED = 1 << 1, } VirtViewerDisplayShowHintFlags; /* perhaps this become an interface, and be pushed in gtkvnc and spice? */ @@ -116,6 +117,7 @@ gboolean virt_viewer_display_get_auto_resize(VirtViewerDisplay *display); void virt_viewer_display_release_cursor(VirtViewerDisplay *display); void virt_viewer_display_close(VirtViewerDisplay *display); +void virt_viewer_display_set_enabled(VirtViewerDisplay *display, gboolean enabled); G_END_DECLS diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index 3f7cbbe..46e44be 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -1062,6 +1062,9 @@ virt_viewer_window_show(VirtViewerWindow *self) { gtk_widget_show(self->priv->window); + if (self->priv->display) + virt_viewer_display_set_enabled(self->priv->display, TRUE); + if (self->priv->desktop_resize_pending) { virt_viewer_window_resize(self); self->priv->desktop_resize_pending = FALSE; @@ -1072,6 +1075,15 @@ void virt_viewer_window_hide(VirtViewerWindow *self) { gtk_widget_hide(self->priv->window); + + if (self->priv->display) { + VirtViewerDisplay *display = self->priv->display; + guint nth; + + g_object_get(display, "nth-display", &nth, NULL); + if (nth != 0) + virt_viewer_display_set_enabled(display, FALSE); + } } void -- 1.7.10.4