With gtk-2 we have a special hack, where at first we make the virt-viewer-display request its actual size, and then once the window is mapped, we request a size of 50x50 to allow the user to resize the window to something smaller. With the latest gtk-3 this is broken, and the window gets resized to a smaller size as soon as we change the size request to 50x50. gtk-3 has a much better way of dealing with this in the form of widgets being able to specify both a minimal and a natural size. This patch changes virt-viewer to use this with gtk-3, instead of the gtk-2 hack. Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- src/virt-viewer-display.c | 49 ++++++++++++++++++++++++++++++++++++----------- src/virt-viewer-window.c | 26 ++++++++++++++++++++----- 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c index cdbaf45..b7bf6ef 100644 --- a/src/virt-viewer-display.c +++ b/src/virt-viewer-display.c @@ -36,7 +36,9 @@ struct _VirtViewerDisplayPrivate { +#if !GTK_CHECK_VERSION(3, 0, 0) gboolean dirty; +#endif guint desktopWidth; guint desktopHeight; guint zoom_level; @@ -48,9 +50,10 @@ struct _VirtViewerDisplayPrivate gboolean auto_resize; }; +#if !GTK_CHECK_VERSION(3, 0, 0) static void virt_viewer_display_size_request(GtkWidget *widget, GtkRequisition *requisition); -#if GTK_CHECK_VERSION(3, 0, 0) +#else static void virt_viewer_display_get_preferred_width(GtkWidget *widget, int *minwidth, int *defwidth); @@ -255,8 +258,10 @@ virt_viewer_display_init(VirtViewerDisplay *display) display->priv->desktopHeight = 100; display->priv->zoom_level = 100; display->priv->zoom = TRUE; - display->priv->dirty = TRUE; display->priv->auto_resize = TRUE; +#if !GTK_CHECK_VERSION(3, 0, 0) + display->priv->dirty = TRUE; +#endif } GtkWidget* @@ -350,6 +355,7 @@ virt_viewer_display_grab_focus(GtkWidget *widget) } +#if !GTK_CHECK_VERSION(3, 0, 0) static gboolean virt_viewer_display_idle(gpointer opaque) { @@ -390,17 +396,24 @@ virt_viewer_display_size_request(GtkWidget *widget, priv->desktopWidth, priv->desktopHeight); } +#else -#if GTK_CHECK_VERSION(3, 0, 0) static void virt_viewer_display_get_preferred_width(GtkWidget *widget, int *minwidth, int *defwidth) { - GtkRequisition req; + VirtViewerDisplay *display = VIRT_VIEWER_DISPLAY(widget); + VirtViewerDisplayPrivate *priv = display->priv; + int border_width = gtk_container_get_border_width(GTK_CONTAINER(widget)); - virt_viewer_display_size_request(widget, &req); + *minwidth = 50 + 2 * border_width; - *minwidth = *defwidth = req.width; + if (priv->zoom) { + *defwidth = round(priv->desktopWidth * priv->zoom_level / 100.0) + + 2 * border_width; + } else { + *defwidth = priv->desktopWidth + 2 * border_width; + } } @@ -408,11 +421,18 @@ static void virt_viewer_display_get_preferred_height(GtkWidget *widget, int *minheight, int *defheight) { - GtkRequisition req; + VirtViewerDisplay *display = VIRT_VIEWER_DISPLAY(widget); + VirtViewerDisplayPrivate *priv = display->priv; + int border_height = gtk_container_get_border_width(GTK_CONTAINER(widget)); - virt_viewer_display_size_request(widget, &req); + *minheight = 50 + 2 * border_height; - *minheight = *defheight = req.height; + if (priv->zoom) { + *defheight = round(priv->desktopHeight * priv->zoom_level / 100.0) + + 2 * border_height; + } else { + *defheight = priv->desktopHeight + 2 * border_height; + } } #endif @@ -436,7 +456,11 @@ virt_viewer_display_size_allocate(GtkWidget *widget, if (priv->desktopWidth == 0 || priv->desktopHeight == 0) +#if !GTK_CHECK_VERSION(3, 0, 0) goto end; +#else + return; +#endif desktopAspect = (double)priv->desktopWidth / (double)priv->desktopHeight; @@ -462,6 +486,7 @@ virt_viewer_display_size_allocate(GtkWidget *widget, gtk_widget_size_allocate(child, &child_allocation); } +#if !GTK_CHECK_VERSION(3, 0, 0) end: /* This unsets the size request, so that the user can * manually resize the window smaller again @@ -471,6 +496,7 @@ end: if (gtk_widget_get_mapped(widget)) priv->dirty = FALSE; } +#endif } @@ -505,11 +531,12 @@ void virt_viewer_display_get_desktop_size(VirtViewerDisplay *display, void virt_viewer_display_queue_resize(VirtViewerDisplay *display) { - VirtViewerDisplayPrivate *priv = display->priv; GtkWidget *child = gtk_bin_get_child(GTK_BIN(display)); if (child && gtk_widget_get_visible(child)) { - priv->dirty = TRUE; +#if !GTK_CHECK_VERSION(3, 0, 0) + display->priv->dirty = TRUE; +#endif gtk_widget_queue_resize(GTK_WIDGET(display)); } } diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index 4a17626..67333f2 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -372,6 +372,22 @@ virt_viewer_window_menu_view_zoom_reset(GtkWidget *menu G_GNUC_UNUSED, virt_viewer_window_set_zoom_level(self, 100); } +/* Kick GtkWindow to tell it to adjust to our new widget sizes */ +static void +virt_viewer_window_queue_resize(VirtViewerWindow *self) +{ + VirtViewerWindowPrivate *priv = self->priv; +#if GTK_CHECK_VERSION(3, 0, 0) + GtkRequisition nat; + + gtk_window_set_default_size(GTK_WINDOW(priv->window), -1, -1); + gtk_widget_get_preferred_size(GTK_WIDGET(priv->window), NULL, &nat); + gtk_window_resize(GTK_WINDOW(priv->window), nat.width, nat.height); +#else + gtk_window_resize(GTK_WINDOW(priv->window), 1, 1); +#endif +} + /* * This code attempts to resize the top level window to be large enough * to contain the entire display desktop at 1:1 ratio. If the local desktop @@ -399,9 +415,6 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) return; } - if (!keep_win_size) - gtk_window_resize(GTK_WINDOW(priv->window), 1, 1); - virt_viewer_display_get_desktop_size(VIRT_VIEWER_DISPLAY(priv->display), &desktopWidth, &desktopHeight); @@ -441,6 +454,9 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) virt_viewer_display_set_desktop_size(VIRT_VIEWER_DISPLAY(priv->display), width, height); + + if (!keep_win_size) + virt_viewer_window_queue_resize(self); } static void @@ -1192,9 +1208,9 @@ virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level) if (!priv->display) return; - gtk_window_resize(GTK_WINDOW(priv->window), 1, 1); - virt_viewer_display_set_zoom_level(VIRT_VIEWER_DISPLAY(priv->display), priv->zoomlevel); + + virt_viewer_window_queue_resize(self); } gint virt_viewer_window_get_zoom_level(VirtViewerWindow *self) -- 1.8.2 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list