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

Marc-André Lureau mlureau at redhat.com
Tue Oct 15 13:07:04 UTC 2013



----- Original Message -----
> 
> ----- 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".

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 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
> > 
> 
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list




More information about the virt-tools-list mailing list