diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/virt-viewer-display-spice.c | 29 | ||||
-rw-r--r-- | src/virt-viewer-display.c | 31 | ||||
-rw-r--r-- | src/virt-viewer-display.h | 4 | ||||
-rw-r--r-- | src/virt-viewer-window.c | 6 |
4 files changed, 63 insertions, 7 deletions
diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c index f5e66a2..c3dbd75 100644 --- a/src/virt-viewer-display-spice.c +++ b/src/virt-viewer-display-spice.c @@ -58,6 +58,8 @@ static GdkPixbuf *virt_viewer_display_spice_get_pixbuf(VirtViewerDisplay *displa static void virt_viewer_display_spice_release_cursor(VirtViewerDisplay *display); static void virt_viewer_display_spice_close(VirtViewerDisplay *display G_GNUC_UNUSED); static gboolean virt_viewer_display_spice_selectable(VirtViewerDisplay *display); +static void virt_viewer_display_spice_enable(VirtViewerDisplay *display); +static void virt_viewer_display_spice_disable(VirtViewerDisplay *display); static void virt_viewer_display_spice_class_init(VirtViewerDisplaySpiceClass *klass) @@ -69,6 +71,8 @@ virt_viewer_display_spice_class_init(VirtViewerDisplaySpiceClass *klass) dclass->release_cursor = virt_viewer_display_spice_release_cursor; dclass->close = virt_viewer_display_spice_close; dclass->selectable = virt_viewer_display_spice_selectable; + dclass->enable = virt_viewer_display_spice_enable; + dclass->disable = virt_viewer_display_spice_disable; g_type_class_add_private(klass, sizeof(VirtViewerDisplaySpicePrivate)); } @@ -89,11 +93,9 @@ virt_viewer_display_spice_monitor_geometry_changed(VirtViewerDisplaySpice *self) g_signal_emit_by_name(self, "monitor-geometry-changed", NULL); } -static void -show_hint_changed(VirtViewerDisplay *self) +static void update_enabled(VirtViewerDisplay *self, gboolean enabled, gboolean send) { SpiceMainChannel *main_channel = get_main(self); - guint enabled = virt_viewer_display_get_enabled(self); guint nth; /* this may happen when finalizing */ @@ -101,7 +103,26 @@ show_hint_changed(VirtViewerDisplay *self) return; g_object_get(self, "nth-display", &nth, NULL); - spice_main_set_display_enabled(main_channel, nth, enabled); + spice_main_update_display_enabled(main_channel, nth, enabled, send); +} + +static void +show_hint_changed(VirtViewerDisplay *self) +{ + /* just keep spice-gtk state up-to-date, but don't send change anything */ + update_enabled(self, virt_viewer_display_get_enabled(self), FALSE); +} + +static void virt_viewer_display_spice_enable(VirtViewerDisplay *self) +{ + virt_viewer_display_set_enabled(self, TRUE); + update_enabled(self, TRUE, TRUE); +} + +static void virt_viewer_display_spice_disable(VirtViewerDisplay *self) +{ + virt_viewer_display_set_enabled(self, FALSE); + update_enabled(self, FALSE, TRUE); } static void diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c index 8431ae4..d8b3312 100644 --- a/src/virt-viewer-display.c +++ b/src/virt-viewer-display.c @@ -682,6 +682,37 @@ void virt_viewer_display_set_show_hint(VirtViewerDisplay *self, guint mask, gboo g_object_notify(G_OBJECT(self), "show-hint"); } +/* This function attempts to enable the display if supported by the backend */ +void virt_viewer_display_enable(VirtViewerDisplay *self) +{ + VirtViewerDisplayClass *klass; + + g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self)); + + klass = VIRT_VIEWER_DISPLAY_GET_CLASS(self); + if (!klass->enable) + return; + + klass->enable(self); +} + +/* This function attempts to disable the display if supported by the backend */ +void virt_viewer_display_disable(VirtViewerDisplay *self) +{ + VirtViewerDisplayClass *klass; + + g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self)); + + klass = VIRT_VIEWER_DISPLAY_GET_CLASS(self); + if (!klass->disable) + return; + + klass->disable(self); +} + +/* this function simply informs the display that it is enabled. see + * virt_viewer_display_enable()/disable() if you want to attempt to change the + * state of the display */ void virt_viewer_display_set_enabled(VirtViewerDisplay *self, gboolean enabled) { g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self)); diff --git a/src/virt-viewer-display.h b/src/virt-viewer-display.h index 9829617..a899bb4 100644 --- a/src/virt-viewer-display.h +++ b/src/virt-viewer-display.h @@ -90,6 +90,8 @@ struct _VirtViewerDisplayClass { void (*display_keyboard_ungrab)(VirtViewerDisplay *display); void (*display_desktop_resize)(VirtViewerDisplay *display); + void (*enable)(VirtViewerDisplay *display); + void (*disable)(VirtViewerDisplay *display); }; GType virt_viewer_display_get_type(void); @@ -125,6 +127,8 @@ 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); +void virt_viewer_display_enable(VirtViewerDisplay *display); +void virt_viewer_display_disable(VirtViewerDisplay *display); gboolean virt_viewer_display_get_enabled(VirtViewerDisplay *display); gboolean virt_viewer_display_get_selectable(VirtViewerDisplay *display); void virt_viewer_display_queue_resize(VirtViewerDisplay *display); diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index e067162..a1b9940 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -1353,8 +1353,8 @@ virt_viewer_window_enable_kiosk(VirtViewerWindow *self) void virt_viewer_window_show(VirtViewerWindow *self) { - if (self->priv->display) - virt_viewer_display_set_enabled(self->priv->display, TRUE); + if (self->priv->display && !virt_viewer_display_get_enabled(self->priv->display)) + virt_viewer_display_enable(self->priv->display); if (self->priv->desktop_resize_pending) { virt_viewer_window_queue_resize(self); @@ -1382,7 +1382,7 @@ virt_viewer_window_hide(VirtViewerWindow *self) if (self->priv->display) { VirtViewerDisplay *display = self->priv->display; - virt_viewer_display_set_enabled(display, FALSE); + virt_viewer_display_disable(display); } } |