diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2020-08-17 14:37:59 +0400 |
---|---|---|
committer | Frediano Ziglio <freddy77@gmail.com> | 2020-09-16 10:55:07 +0100 |
commit | 2e4f5d98f44e184bdd79ff269144eda13ec6d4a2 (patch) | |
tree | 41d866601c2e392d2f4daf19b83f7ea885615b1e | |
parent | b9754be1663adcbb217e73baa131f279f612685f (diff) |
widget: set physical display dimensions (with resize-guest=true)
Note that Gtk+ doesn't provide a convenient & reliable API to get the
dimensions of a widget. See the gitlab issue in the comment.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
-rw-r--r-- | src/spice-widget.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/spice-widget.c b/src/spice-widget.c index 9cb1273..eaf9e91 100644 --- a/src/spice-widget.c +++ b/src/spice-widget.c @@ -1358,23 +1358,43 @@ static void recalc_geometry(GtkWidget *widget) SpiceDisplay *display = SPICE_DISPLAY(widget); SpiceDisplayPrivate *d = display->priv; gdouble zoom = 1.0; - gint scale_factor; + gint scale_factor, height_mm = 0, width_mm = 0; + bool has_display_mm = false; if (spice_cairo_is_scaled(display)) zoom = (gdouble)d->zoom_level / 100; scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(display)); + if (gtk_widget_get_window(widget)) { + GdkRectangle geometry; + GdkMonitor *monitor = + gdk_display_get_monitor_at_window(gtk_widget_get_display(widget), + gtk_widget_get_window(widget)); + height_mm = gdk_monitor_get_height_mm(monitor); + width_mm = gdk_monitor_get_width_mm(monitor); + gdk_monitor_get_geometry(monitor, &geometry); + /* FIXME: gives wrong results atm: https://gitlab.gnome.org/GNOME/gtk/-/issues/3066 */ + width_mm = (width_mm * d->ww / geometry.width) / zoom * scale_factor; + height_mm = (height_mm * d->wh / geometry.height) / zoom * scale_factor; + has_display_mm = true; + } + DISPLAY_DEBUG(display, - "recalc geom: guest +%d+%d:%dx%d, window %dx%d, zoom %g, scale %d", + "recalc geom: guest +%d+%d:%dx%d, window %dx%d, zoom %g, scale %d, dim %dx%dmm", d->area.x, d->area.y, d->area.width, d->area.height, - d->ww, d->wh, zoom, scale_factor); + d->ww, d->wh, zoom, scale_factor, width_mm, height_mm); - if (d->resize_guest_enable) + if (d->resize_guest_enable) { + if (has_display_mm) { + spice_main_channel_update_display_mm(d->main, get_display_id(display), + width_mm, height_mm, TRUE); + } spice_main_channel_update_display(d->main, get_display_id(display), d->area.x, d->area.y, d->ww * scale_factor / zoom, d->wh * scale_factor / zoom, TRUE); + } } /* ---------------------------------------------------------------- */ |