[virt-tools-list] [PATCH virt-viewer v3] virt-viewer-window: Change zoom of the display only when it is possible

Fabiano Fidêncio fabiano at fidencio.org
Thu Apr 2 07:23:15 UTC 2015


On Wed, Apr 1, 2015 at 8:25 AM, Pavel Grunt <pgrunt at redhat.com> wrote:
>
>>
>> On Tue, Mar 31, 2015 at 3:03 PM, Pavel Grunt <pgrunt at redhat.com>
>> wrote:
>> > Do not allow to zoom out if it is not possible due to the width of
>> > the top menu. It avoids emitting size allocation events that will
>> > change the display resolution of the spice guest.
>> >
>> > Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1206460
>> > ---
>> > v3:
>> >  - return when zoom level doesn't change
>> >  - more comments
>> > v2:
>> >  - treatment of zoom level moved to _window_set_zoom_level() in
>> >  order to make it work in all cases (ie. with the command line
>> >  option '-z')
>> >  - _get_minimal_zoom_level() instead of _can_zoom_out()
>> >  - more debug logs
>> > ---
>> >  src/virt-viewer-window.c | 72
>> >  +++++++++++++++++++++++++++++++++++++++++++++++-
>> >  1 file changed, 71 insertions(+), 1 deletion(-)
>> >
>> > diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
>> > index 799adce..75966c3 100644
>> > --- a/src/virt-viewer-window.c
>> > +++ b/src/virt-viewer-window.c
>> > @@ -34,9 +34,11 @@
>> >  #include <locale.h>
>> >  #include <glib/gprintf.h>
>> >  #include <glib/gi18n.h>
>> > +#include <math.h>
>> >
>> >  #include "virt-gtk-compat.h"
>> >  #include "virt-viewer-window.h"
>> > +#include "virt-viewer-display.h"
>> >  #include "virt-viewer-session.h"
>> >  #include "virt-viewer-app.h"
>> >  #include "virt-viewer-util.h"
>> > @@ -67,6 +69,8 @@ static void
>> > virt_viewer_window_disable_modifiers(VirtViewerWindow *self);
>> >  static void virt_viewer_window_resize(VirtViewerWindow *self,
>> >  gboolean keep_win_size);
>> >  static void virt_viewer_window_toolbar_setup(VirtViewerWindow
>> >  *self);
>> >  static GtkMenu*
>> >  virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self);
>> > +static void
>> > virt_viewer_window_get_minimal_dimensions(VirtViewerWindow *self,
>> > guint *width, guint *height);
>> > +static gint
>> > virt_viewer_window_get_minimal_zoom_level(VirtViewerWindow *self);
>> >
>> >  G_DEFINE_TYPE (VirtViewerWindow, virt_viewer_window,
>> >  G_TYPE_OBJECT)
>> >
>> > @@ -1306,7 +1310,7 @@
>> > virt_viewer_window_set_display(VirtViewerWindow *self,
>> > VirtViewerDisplay *displa
>> >      if (display != NULL) {
>> >          priv->display = g_object_ref(display);
>> >
>> > -
>> >        virt_viewer_display_set_zoom_level(VIRT_VIEWER_DISPLAY(priv->display),
>> > priv->zoomlevel);
>> > +        virt_viewer_window_set_zoom_level(self, priv->zoomlevel);
>> >          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);
>> >
>> > @@ -1402,9 +1406,11 @@ void
>> >  virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint
>> >  zoom_level)
>> >  {
>> >      VirtViewerWindowPrivate *priv;
>> > +    gint min_zoom, old_zoom;
>> >
>> >      g_return_if_fail(VIRT_VIEWER_IS_WINDOW(self));
>> >      priv = self->priv;
>> > +    old_zoom = priv->zoomlevel;
>> >
>> >      if (zoom_level < MIN_ZOOM_LEVEL)
>> >          zoom_level = MIN_ZOOM_LEVEL;
>> > @@ -1415,6 +1421,17 @@
>> > virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint
>> > zoom_level)
>> >      if (!priv->display)
>> >          return;
>> >
>> > +    min_zoom = virt_viewer_window_get_minimal_zoom_level(self);
>> > +    if (min_zoom > priv->zoomlevel) {
>> > +        g_debug("Cannot set zoom level %d, using %d",
>> > priv->zoomlevel, min_zoom);
>> > +        priv->zoomlevel = min_zoom;
>> > +    }
>> > +
>> > +    if (priv->zoomlevel == old_zoom) {
>> > +        g_debug("Zoom level not changed, using: %d",
>> > priv->zoomlevel);
>> > +        return;
>> > +    }
>> > +
>> >      virt_viewer_display_set_zoom_level(VIRT_VIEWER_DISPLAY(priv->display),
>> >      priv->zoomlevel);
>> >
>> >      virt_viewer_window_queue_resize(self);
>> > @@ -1467,6 +1484,59 @@
>> > virt_viewer_window_set_kiosk(VirtViewerWindow *self, gboolean
>> > enabled)
>> >          g_debug("disabling kiosk not implemented yet");
>> >  }
>> >
>> > +static void
>> > +virt_viewer_window_get_minimal_dimensions(VirtViewerWindow *self,
>> > +                                          guint *width,
>> > +                                          guint *height)
>> > +{
>> > +    GtkRequisition req;
>> > +    GtkWidget *top_menu;
>> > +
>> > +    top_menu =
>> > GTK_WIDGET(gtk_builder_get_object(virt_viewer_window_get_builder(self),
>> > "top-menu"));
>> > +#if !GTK_CHECK_VERSION(3, 0, 0)
>> > +    gtk_widget_get_child_requisition(top_menu, &req);
>> > +#else
>> > +    gtk_widget_get_preferred_size(top_menu, &req, NULL);
>> > +#endif
>> > +    /* minimal dimensions of the window are the maximum of
>> > dimensions of the top-menu
>> > +     * and minimal dimension of the display
>> > +     */
>> > +    *height = MAX(MIN_DISPLAY_HEIGHT, req.height);
>>
>> height can be MIN_DISPLAY_HEIGHT, no?
>>
>>
>> > +    *width = MAX(MIN_DISPLAY_WIDTH, req.width);
>> > +}
>> > +
>> > +/**
>> > + * virt_viewer_window_get_minimal_zoom_level:
>> > + * @self: a #VirtViewerWindow
>> > + *
>> > + * Calculates the zoom level with respect to the desktop
>> > dimensions
>> > + *
>> > + * Returns: minimal possible zoom level (multiple of ZOOM_STEP)
>> > + */
>> > +static gint
>> > +virt_viewer_window_get_minimal_zoom_level(VirtViewerWindow *self)
>> > +{
>> > +    guint min_width, min_height;
>> > +    guint width, height; /* desktop dimensions */
>> > +    gint zoom;
>> > +    double width_ratio, height_ratio;
>> > +
>> > +    g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(self) &&
>> > +                         self->priv->display != NULL,
>> > MIN_ZOOM_LEVEL);
>> > +
>> > +    virt_viewer_window_get_minimal_dimensions(self, &min_width,
>> > &min_height);
>> > +
>> >    virt_viewer_display_get_desktop_size(virt_viewer_window_get_display(self),
>> > &width, &height);
>> > +
>> > +    /* e.g. minimal width = 200, desktop width = 550 => width
>> > ratio = 0.36
>> > +     * which means that the minimal zoom level is 40 (4 *
>> > ZOOM_STEP)
>> > +     */
>> > +    width_ratio = (double) min_width / width;
>> > +    height_ratio = (double) min_height / height;
>> > +    zoom = ceil(10 * MAX(width_ratio, height_ratio));
>> > +
>> > +    return MAX(MIN_ZOOM_LEVEL, zoom * ZOOM_STEP);
>> > +}
>> > +
>> >  /*
>> >   * Local variables:
>> >   *  c-indent-level: 4
>> > --
>> > 2.3.4
>> >
>> > _______________________________________________
>> > virt-tools-list mailing list
>> > virt-tools-list at redhat.com
>> > https://www.redhat.com/mailman/listinfo/virt-tools-list
>>
>>
>> ACK!
>>
>> Let me know if the height comment makes sense. If it does I will
>> change it here and push the patch.
>>
>> Best Regards,
>> --
>> Fabiano Fidêncio
>>
>
> Hi, of course it makes sense, but I am paranoid :). Someone can change the font and then the req,height can be greater than MIN_DISPLAY_HEIGHT...
>
> Thanks,
> Pavel
>
>

I just pushed the whole series!

-- 
Fabiano Fidêncio




More information about the virt-tools-list mailing list