[virt-tools-list] [PATCH virt-viewer 1/3] display: repurpose zoom property, rename it scale

Marc-André Lureau mlureau at redhat.com
Thu Feb 27 16:24:41 UTC 2014



----- Original Message -----
> I'm not convinced that this 'scaling' option is really a useful feature.
> I find it a bit confusing to have these two checkboxes with very similar
> names right next to eachother in the menu ("scale display" / "resize
> display").  It's not intuitive what the effect of each option would be.
> It also seems like very few people would ever want to disable automatic
> scaling...

In some cases, the guest can't be resized, and scaling can introduce undesired bluriness and artifacts. The bug that triggered this: https://bugzilla.redhat.com/show_bug.cgi?id=1054757

> 
> On top of the above issues, the support for this feature is incomplete
> because of several issues.  Reference this screenshot:
> 
>   http://jjongsma.fedorapeople.org/vv-no-scaling.png
> 
> As you can see, if you resize the window smaller than the guest display
> size, it becomes unusable because:
> A) there are no scrollbars to access the parts of the display outside of
> the window

Right, I didn't think enough about that. Perhaps it could embed the display in GtkScrolledWindow.

> B) instead of displaying as much of the unscaled display as possible, it
> maintains the aspect ratio of the guest display, which makes no sense in
> this case.

that sounds also like a bug that could be easily fixable

> 
> I haven't reviewed the code yet, I'd like to hear other's opinions on
> this feature first.
> 
> Jonathon
> 
> 
> 
> 
> On Thu, 2014-02-27 at 16:26 +0100, Marc-André Lureau wrote:
> > Currently "dead" property zoom can be used instead to control display
> > scaling behaviour (in fact, it was probably meant to do that).
> > ---
> >  src/virt-viewer-display.c | 41 +++++++++++++++++++++++++----------------
> >  src/virt-viewer-display.h |  4 ++--
> >  2 files changed, 27 insertions(+), 18 deletions(-)
> > 
> > diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c
> > index feefcca..3c893e2 100644
> > --- a/src/virt-viewer-display.c
> > +++ b/src/virt-viewer-display.c
> > @@ -42,7 +42,7 @@ struct _VirtViewerDisplayPrivate
> >      guint desktopWidth;
> >      guint desktopHeight;
> >      guint zoom_level;
> > -    gboolean zoom;
> > +    gboolean scale;
> >      gint nth_display; /* Monitor number inside the guest */
> >      gint monitor;     /* Monitor number on the client */
> >      guint show_hint;
> > @@ -84,7 +84,7 @@ enum {
> >      PROP_DESKTOP_HEIGHT,
> >      PROP_FULLSCREEN,
> >      PROP_NTH_DISPLAY,
> > -    PROP_ZOOM,
> > +    PROP_SCALE,
> >      PROP_ZOOM_LEVEL,
> >      PROP_SHOW_HINT,
> >      PROP_SESSION,
> > @@ -132,10 +132,10 @@ virt_viewer_display_class_init(VirtViewerDisplayClass
> > *class)
> >                                                       G_PARAM_READWRITE));
> >  
> >      g_object_class_install_property(object_class,
> > -                                    PROP_ZOOM,
> > -                                    g_param_spec_boolean("zoom",
> > -                                                         "Zoom",
> > -                                                         "Zoom",
> > +                                    PROP_SCALE,
> > +                                    g_param_spec_boolean("scale",
> > +                                                         "Scale",
> > +                                                         "Scale",
> >                                                           TRUE,
> >                                                           G_PARAM_READWRITE));
> >  
> > @@ -279,7 +279,7 @@ virt_viewer_display_init(VirtViewerDisplay *display)
> >      display->priv->desktopWidth = 100;
> >      display->priv->desktopHeight = 100;
> >      display->priv->zoom_level = 100;
> > -    display->priv->zoom = TRUE;
> > +    display->priv->scale = TRUE;
> >      display->priv->auto_resize = TRUE;
> >  #if !GTK_CHECK_VERSION(3, 0, 0)
> >      display->priv->dirty = TRUE;
> > @@ -322,6 +322,10 @@ virt_viewer_display_set_property(GObject *object,
> >      case PROP_MONITOR:
> >          priv->monitor = g_value_get_int(value);
> >          break;
> > +    case PROP_SCALE:
> > +        virt_viewer_display_set_scale(display,
> > +                                      g_value_get_boolean(value));
> > +    break;
> >  
> >      default:
> >          G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> > @@ -363,6 +367,9 @@ virt_viewer_display_get_property(GObject *object,
> >      case PROP_FULLSCREEN:
> >          g_value_set_boolean(value,
> >          virt_viewer_display_get_fullscreen(display));
> >          break;
> > +    case PROP_SCALE:
> > +        g_value_set_boolean(value,
> > virt_viewer_display_get_scale(display));
> > +        break;
> >  
> >      default:
> >          G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> > @@ -404,7 +411,7 @@ virt_viewer_display_size_request(GtkWidget *widget,
> >      requisition->height = border_width * 2;
> >  
> >      if (priv->dirty) {
> > -        if (priv->zoom) {
> > +        if (priv->scale) {
> >              requisition->width += round(priv->desktopWidth *
> >              priv->zoom_level / 100.0);
> >              requisition->height += round(priv->desktopHeight *
> >              priv->zoom_level / 100.0);
> >          } else {
> > @@ -456,7 +463,7 @@ static void
> > virt_viewer_display_get_preferred_width(GtkWidget *widget,
> >  
> >      *minwidth = 50 + 2 * border_width;
> >  
> > -    if (priv->zoom) {
> > +    if (priv->scale) {
> >          *defwidth = round(priv->desktopWidth * priv->zoom_level / 100.0) +
> >                      2 * border_width;
> >      } else {
> > @@ -475,7 +482,7 @@ static void
> > virt_viewer_display_get_preferred_height(GtkWidget *widget,
> >  
> >      *minheight = 50 + 2 * border_height;
> >  
> > -    if (priv->zoom) {
> > +    if (priv->scale) {
> >          *defheight = round(priv->desktopHeight * priv->zoom_level / 100.0)
> >          +
> >                      2 * border_height;
> >      } else {
> > @@ -609,20 +616,22 @@ guint
> > virt_viewer_display_get_zoom_level(VirtViewerDisplay *display)
> >  }
> >  
> > 
> > -void virt_viewer_display_set_zoom(VirtViewerDisplay *display,
> > -                                  gboolean zoom)
> > +void virt_viewer_display_set_scale(VirtViewerDisplay *display,
> > +                                   gboolean scale)
> >  {
> >      VirtViewerDisplayPrivate *priv = display->priv;
> >  
> > -    priv->zoom = zoom;
> > +    priv->scale = scale;
> > +    g_object_notify(G_OBJECT(display), "scale");
> > +
> >      virt_viewer_display_queue_resize(display);
> >  }
> >  
> > 
> > -gboolean virt_viewer_display_get_zoom(VirtViewerDisplay *display)
> > +gboolean virt_viewer_display_get_scale(VirtViewerDisplay *display)
> >  {
> >      VirtViewerDisplayPrivate *priv = display->priv;
> > -    return priv->zoom;
> > +    return priv->scale;
> >  }
> >  
> > 
> > @@ -822,7 +831,7 @@ void
> > virt_viewer_display_get_preferred_monitor_geometry(VirtViewerDisplay*
> > self,
> >              preferred->y = topy;
> >          }
> >  
> > -        if (virt_viewer_display_get_zoom(VIRT_VIEWER_DISPLAY(self))) {
> > +        if (virt_viewer_display_get_scale(VIRT_VIEWER_DISPLAY(self))) {
> >              guint zoom =
> >              virt_viewer_display_get_zoom_level(VIRT_VIEWER_DISPLAY(self));
> >  
> >              preferred->width = round(preferred->width * 100 / zoom);
> > diff --git a/src/virt-viewer-display.h b/src/virt-viewer-display.h
> > index 195eeee..f3e4bdd 100644
> > --- a/src/virt-viewer-display.h
> > +++ b/src/virt-viewer-display.h
> > @@ -104,9 +104,9 @@ void
> > virt_viewer_display_get_desktop_size(VirtViewerDisplay *display,
> >  void virt_viewer_display_set_zoom_level(VirtViewerDisplay *display,
> >                                          guint zoom);
> >  guint virt_viewer_display_get_zoom_level(VirtViewerDisplay *display);
> > -void virt_viewer_display_set_zoom(VirtViewerDisplay *display,
> > +void virt_viewer_display_set_scale(VirtViewerDisplay *display,
> >                                    gboolean zoom);
> > -gboolean virt_viewer_display_get_zoom(VirtViewerDisplay *display);
> > +gboolean virt_viewer_display_get_scale(VirtViewerDisplay *display);
> >  
> >  void virt_viewer_display_send_keys(VirtViewerDisplay *display,
> >                                     const guint *keyvals, int nkeyvals);
> 
> 
> _______________________________________________
> 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