[virt-tools-list] [PATCH virt-viewer 11/25] Add a DISABLED display hint

Marc-André Lureau marcandre.lureau at gmail.com
Tue Jul 17 19:24:53 UTC 2012


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




More information about the virt-tools-list mailing list