[virt-tools-list] [PATCH 2/2] Set Spice display to fullscreen if owning window is pending fullscreen

Jonathon Jongsma jjongsma at redhat.com
Fri Oct 11 15:14:34 UTC 2013


----- Original Message -----
> From: "Marc-André Lureau" <marcandre.lureau at gmail.com>
> To: "Jonathon Jongsma" <jjongsma at redhat.com>
> Cc: "virt" <virt-tools-list at redhat.com>
> Sent: Wednesday, October 9, 2013 3:29:22 PM
> Subject: Re: [virt-tools-list] [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".  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;

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 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.

Jonathon



> On Wed, Oct 9, 2013 at 10:09 PM, Jonathon Jongsma <jjongsma at redhat.com>
> 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 at redhat.com
> > https://www.redhat.com/mailman/listinfo/virt-tools-list
> 
> 
> 
> --
> Marc-André Lureau
> 




More information about the virt-tools-list mailing list