----- Original Message ----- > > ----- Original Message ----- > > From: "Marc-André Lureau" <marcandre.lureau@xxxxxxxxx> > > To: "Jonathon Jongsma" <jjongsma@xxxxxxxxxx> > > Cc: "virt" <virt-tools-list@xxxxxxxxxx> > > Sent: Wednesday, October 9, 2013 3:29:22 PM > > Subject: Re: [PATCH 2/2] Set Spice display to fullscreen > > if owning window is pending fullscreen > > > > To avoid introducing a new pending state, we could set > > > > priv->fullscreen = TRUE; > > > > before the delayed map-event, and in the handler, set it back to > > FALSE. That really shouldn't be a problem, and since it's a > > special/temporary case, I think that would be simpler. > > > I'm not quite sure what you mean by "in the handler, set it back to FALSE". static gboolean mapped(GtkWidget *widget, GdkEvent *event G_GNUC_UNUSED, VirtViewerWindow *self) { g_signal_handlers_disconnect_by_func(widget, mapped, self); priv->fullscreen = FALSE; virt_viewer_window_enter_fullscreen(self, self->priv->fullscreen_monitor); return FALSE; } > But in general I don't think it will really work to use a single boolean > for this case. virt_viewer_enter_fullscreen() actually has an early return > at the start of the function: > > if (priv->fullscreen) > return; That's why we set it back in the map event. > > As far as I can tell, this is here because after we enter fullscreen mode, we > end up calling gtk_check_menu_item_set_active(check, TRUE), which can result > in another call to _enter_fullscreen(). So this protects us from running No, this loop can't happen, as gtk_check_menu_item_set_active() only activates when the value changes. > this handler twice. I could work around this in a few ways (e.g. blocking > that signal handler while we call gtk_check_menu_item_set_active(), or > turning priv->fullscreen into a tri-state variable rather than a boolean), > but neither of those seemed obviously better to me than simply adding a new > priv->pending_fullscreen state. I still prefer not adding another object state when this one can be easily confined locally. > > Jonathon > > > > > On Wed, Oct 9, 2013 at 10:09 PM, Jonathon Jongsma <jjongsma@xxxxxxxxxx> > > wrote: > > > When you call virt_viewer_window_enter_fullscreen() on a hidden window, > > > it > > > doesn't actually change its fullscreen state. Instead, it sets up a > > > map-event > > > handler to enter fullscreen after it is shown. When _set_display() is > > > called on > > > a window that is pending fullscreen status, it initially sets the > > > fullscreen > > > state of the display to FALSE, which can cause an unwanted resize to be > > > sent > > > down to the guest. > > > --- > > > src/virt-viewer-window.c | 6 +++++- > > > 1 file changed, 5 insertions(+), 1 deletion(-) > > > > > > diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c > > > index 0f62feb..7108aa0 100644 > > > --- a/src/virt-viewer-window.c > > > +++ b/src/virt-viewer-window.c > > > @@ -96,6 +96,7 @@ struct _VirtViewerWindowPrivate { > > > GSList *accel_list; > > > gboolean enable_mnemonics_save; > > > gboolean grabbed; > > > + gboolean fullscreen_pending; > > > gint fullscreen_monitor; > > > gboolean desktop_resize_pending; > > > gboolean kiosk; > > > @@ -294,6 +295,7 @@ virt_viewer_window_init (VirtViewerWindow *self) > > > self->priv = GET_PRIVATE(self); > > > priv = self->priv; > > > > > > + priv->fullscreen_pending = FALSE; > > > priv->fullscreen_monitor = -1; > > > priv->auto_resize = TRUE; > > > g_value_init(&priv->accel_setting, G_TYPE_STRING); > > > @@ -533,11 +535,13 @@ > > > virt_viewer_window_enter_fullscreen(VirtViewerWindow > > > *self, gint monitor) > > > priv->fullscreen_monitor = monitor; > > > > > > if (!gtk_widget_get_mapped(priv->window)) { > > > + priv->fullscreen_pending = TRUE; > > > g_signal_connect(priv->window, "map-event", G_CALLBACK(mapped), > > > self); > > > return; > > > } > > > > > > priv->fullscreen = TRUE; > > > + priv->fullscreen_pending = FALSE; > > > > > > gtk_check_menu_item_set_active(check, TRUE); > > > gtk_widget_hide(menu); > > > @@ -1232,7 +1236,7 @@ virt_viewer_window_set_display(VirtViewerWindow > > > *self, VirtViewerDisplay *displa > > > virt_viewer_display_set_zoom_level(VIRT_VIEWER_DISPLAY(priv->display), > > > priv->zoomlevel); > > > virt_viewer_display_set_auto_resize(VIRT_VIEWER_DISPLAY(priv->display), > > > priv->auto_resize); > > > virt_viewer_display_set_monitor(VIRT_VIEWER_DISPLAY(priv->display), > > > priv->fullscreen_monitor); > > > - > > > virt_viewer_display_set_fullscreen(VIRT_VIEWER_DISPLAY(priv->display), > > > priv->fullscreen); > > > + > > > virt_viewer_display_set_fullscreen(VIRT_VIEWER_DISPLAY(priv->display), > > > priv->fullscreen_pending || priv->fullscreen); > > > > > > gtk_widget_show_all(GTK_WIDGET(display)); > > > gtk_notebook_append_page(GTK_NOTEBOOK(priv->notebook), > > > GTK_WIDGET(display), NULL); > > > -- > > > 1.8.3.1 > > > > > > _______________________________________________ > > > virt-tools-list mailing list > > > virt-tools-list@xxxxxxxxxx > > > https://www.redhat.com/mailman/listinfo/virt-tools-list > > > > > > > > -- > > Marc-André Lureau > > > > _______________________________________________ > virt-tools-list mailing list > virt-tools-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/virt-tools-list _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list