[virt-tools-list] [PATCH virt-viewer v2 5/7] Configure display before adding it to the session

Pavel Grunt pgrunt at redhat.com
Wed Apr 22 14:28:33 UTC 2015


> 
> Hi,
> 
> Ack. Thanks a lot for this, seems that it fixed all the issues I reported.
> I have just a small cosmetic comment below, feel free to ignore it.
> 
> > 
> > Due to the fullscreen auto-conf changes that cause the application to
> > wait to process monitor updates until the server configuration
> > matches
> > the client's requested configuration, The display channel's "ready"
> > property can become TRUE before the VirtViewerDisplay object gets
> > created. When this happens, virt_viewer_session_add_display() can
> > trigger a notify::show-hint on the display, which will cause us to
> > calculate its minimum zoom level before any of the desktop sizes for
> > the
> > display have been set. This results in an erroneous zoom level, which
> > results in undesirable behavior. For example, leaving fullscreen mode
> > caused the first display to unexpectedly resize to approximately half
> > the width of the client monitor because its minimum zoom level was
> > 190%.
> > To avoid this, we guarantee that all displays are configured
> > (_set_desktop(), _set_enabled()) before we add the display to the
> > session.
> > ---
> >  src/virt-viewer-session-spice.c | 33
> >  +++++++++++++++++++--------------
> >  1 file changed, 19 insertions(+), 14 deletions(-)
> > 
> > diff --git a/src/virt-viewer-session-spice.c
> > b/src/virt-viewer-session-spice.c
> > index d0a7ab5..9a9a337 100644
> > --- a/src/virt-viewer-session-spice.c
> > +++ b/src/virt-viewer-session-spice.c
> > @@ -731,28 +731,33 @@
> > virt_viewer_session_spice_process_monitors_for_display_channel(VirtViewerSession
> >      g_ptr_array_set_size(displays, monitors_max);
> >  
> >      for (i = 0; i < monitors_max; i++) {
> > +        gboolean create = FALSE;
> >          display = g_ptr_array_index(displays, i);
> > -        if (display == NULL) {
> > +
> > +        create = (display == NULL);
> 
> It is possible to move the 'display' variable here and have just this:
> 
>         GtkWidget *display = g_ptr_array_index(displays, i);
>         gboolean create = (display == NULL);
> 
> >
> > +        if (create) {
> >              display = virt_viewer_display_spice_new(self, channel,
> >              i);
> >              g_debug("creating spice display (#:%d)", i);
> >              g_ptr_array_index(displays, i) =
> >              g_object_ref_sink(display);
> > -
> >            virt_viewer_session_add_display(VIRT_VIEWER_SESSION(self),
> > -
> >                                            VIRT_VIEWER_DISPLAY(display));
> >          }
> > -    }
> > -
> > -    for (i = 0; i < monitors->len; i++) {
> > -        SpiceDisplayMonitorConfig *monitor =
> > &g_array_index(monitors, SpiceDisplayMonitorConfig, i);
> > -        display = g_ptr_array_index(displays, monitor->id);

As Fabiano mentioned there are some issues, probably because i != monitor->id.
Before this patch there were two cycles, the first one was creating the display#i.
The second cycle was setting the display#monitor->id as enabled, setting its dimensions.
Now the the monitor config of the display#monitor->id is used for the display#i.

> >          g_return_if_fail(display != NULL);
> >  
> > -        if (monitor->width == 0 || monitor->height == 0)
> > -            continue;
> > +        if (i < monitors->len) {
> > +            SpiceDisplayMonitorConfig *monitor =
> > &g_array_index(monitors, SpiceDisplayMonitorConfig, i);
> >  
> > -
> >        virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display),
> > TRUE);
> > -
> >        virt_viewer_display_spice_set_desktop(VIRT_VIEWER_DISPLAY(display),
> > -                                              monitor->x,
> > monitor->y,
> > -                                              monitor->width,
> > monitor->height);
> > +            if (monitor->width == 0 || monitor->height == 0)
> > +                continue;
> > +
> > +
> >            virt_viewer_display_spice_set_desktop(VIRT_VIEWER_DISPLAY(display),
> > +                                                  monitor->x,
> > monitor->y,
> > +                                                  monitor->width,
> > monitor->height);
> > +
> >            virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display),
> > TRUE);
> > +        }
> > +
> > +        if (create) {
> > +
> >            virt_viewer_session_add_display(VIRT_VIEWER_SESSION(self),
> > +
> >                                            VIRT_VIEWER_DISPLAY(display));
> > +        }
> >      }
> >  
> >      g_clear_pointer(&monitors, g_array_unref);
> > --
> > 2.1.0
> > 
> 




More information about the virt-tools-list mailing list