49 lines
2.1 KiB
Diff
49 lines
2.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jonathon Jongsma <jjongsma@redhat.com>
|
|
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
|