[virt-tools-list] [PATCH virt-viewer] Fix resizing problem with recent gtk versions

Fabiano Fidêncio fidencio at redhat.com
Sat Jul 23 08:55:53 UTC 2016


On Sat, Jul 23, 2016 at 1:14 AM, Fabiano Fidêncio <fidencio at redhat.com> wrote:
> On Sat, Jul 23, 2016 at 12:05 AM, Jonathon Jongsma <jjongsma at redhat.com> wrote:
>> 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().
>
> Acked-by: Fabiano Fidêncio <fidencio at redhat.com>

And this patch must be pushed to the 4.0-maint branch as well.

>
>> ---
>>  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 695bfaf..ca3c4b2 100644
>> --- a/src/virt-viewer-window.c
>> +++ b/src/virt-viewer-window.c
>> @@ -462,10 +462,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
>> --
>> 2.7.4
>>
>> _______________________________________________
>> virt-tools-list mailing list
>> virt-tools-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/virt-tools-list




More information about the virt-tools-list mailing list