summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/virt-viewer-app.c12
-rw-r--r--src/virt-viewer-display-spice.c20
-rw-r--r--src/virt-viewer-display.c15
-rw-r--r--src/virt-viewer-display.h2
-rw-r--r--src/virt-viewer-window.c12
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