From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonathon Jongsma Date: Fri, 22 Jul 2016 16:43:41 -0500 Subject: [virt-viewer] Fix resizing problem with recent gtk versions When using client-side decorations, as well as in certain other situations (wayland, and windows in some cases), the window gradually resizes larger and larger. This is caused by a change in how gtk interprets the sizes passed to gtk_window_resize(), particularly when client-side decorations (CSD) are involved. For example, In the past this size was assumed to include the size of the CSD, but now it it assumes that the sizes only represent the size of the window's content, without any decorations. However, gtk_widget_get_preferred_size() (when called on a GtkWindow*), returns a size that includes the size of the CSD. So virt_viewer_window_queue_resize() was essentially growing the window by the size of the CSD every time it was called. To work around this issue, we need to calculate the preferred size of the window's child, not the size of the entire window (including CSD). Then we add the width of the window's border (just to be safe) and pass those values to gtk_window_resize(). --- src/virt-viewer-window.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index 7e6b93f..99fd102 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -411,10 +411,14 @@ virt_viewer_window_queue_resize(VirtViewerWindow *self) { VirtViewerWindowPrivate *priv = self->priv; GtkRequisition nat; + GtkWidget *child; + guint border; + border = gtk_container_get_border_width(GTK_CONTAINER(priv->window)); + child = gtk_bin_get_child(GTK_BIN(priv->window)); gtk_window_set_default_size(GTK_WINDOW(priv->window), -1, -1); - gtk_widget_get_preferred_size(priv->window, NULL, &nat); - gtk_window_resize(GTK_WINDOW(priv->window), nat.width, nat.height); + gtk_widget_get_preferred_size(child, NULL, &nat); + gtk_window_resize(GTK_WINDOW(priv->window), nat.width + border, nat.height + border); } static void