Hi Jonathon, On Mon, 2015-08-03 at 15:59 -0500, Jonathon Jongsma wrote: > Previously, there was a single function for controlling the enabled > state of a display: virt_viewer_display_set_enabled(). Unfortunately, > this function is used for two slightly different things: > > A. It informs the local display widget that the display has become > disabled or enabled on the server. In other words, it tries to > synchronize the 'enabled' state of the local widget with the actual > state of the remote display. > > OR > > B. It tries to actively enable a currently-disabled display (or vice > versa) due to some action by the user in the client application. > This causes the client to send a new configuration down to the > server. In other words, it tries to change the state of the remote > display. > > There is some conflict between these two scenarios. If the change is due > to a notification from the server, there is no need to send a new > configuration back down to the server, so this results in unnecessary > monitor configuration messages and can in fact cause issues that are a > little bit hard to track down. Because of this, I decided that it was > really necessary to have two separate functions for these two different > scenarios. so the existing _set_enabled() function will be used for > scenario A mentioned above. I added two new > functiions (_enable() and _disable()) that are used to send new typo ^ > configurations down to the server. > --- > configure.ac | 2 +- > src/virt-viewer-display-spice.c | 29 +++++++++++++++++++++++++---- > src/virt-viewer-display.c | 31 +++++++++++++++++++++++++++++++ > src/virt-viewer-display.h | 4 ++++ > src/virt-viewer-window.c | 6 +++--- > 5 files changed, 64 insertions(+), 8 deletions(-) > > diff --git a/configure.ac b/configure.ac > index d37863b..a7b7140 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -19,7 +19,7 @@ GTK2_REQUIRED="2.18.0" > GTK3_REQUIRED="3.0" > GTK_VNC1_REQUIRED="0.3.8" > GTK_VNC2_REQUIRED="0.4.0" > -SPICE_GTK_REQUIRED="0.28" > +SPICE_GTK_REQUIRED="0.29.17" It should be "0.30" So this commit depends on your spice-gtk series ? http://lists.freedesktop.org/archives/spice-devel/2015-July/020873.html or just on the patch 2/4 of that series http://lists.freedesktop.org/archives/spice-devel/2015-July/020875.html imho it would be better to split this patch otherwise the change from spice_main_set_display_enabled() to spice_main_update_display_enabled() will be "hidden". Pavel > SPICE_PROTOCOL_REQUIRED="0.12.7" > GOVIRT_REQUIRED="0.3.2" > > 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 3efe24c..5a5a6c2 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); > } > } > _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list