x11-toolkits/gtk30: backport 2 patches for wayland

Those 2 patches are fixing a bug shown by firefox under wayland:
when running a wayland desktop with dual screen and different settings
for the 2 screens, the combobox were not functionnal if firefox is on
the second screen.
This commit is contained in:
Baptiste Daroussin 2021-12-03 08:42:23 +01:00
parent 8171d4ca0c
commit 57c50ac376
3 changed files with 97 additions and 0 deletions

View file

@ -4,6 +4,7 @@
PORTNAME= gtk
PORTVERSION= 3.24.30
PORTREVISION= 1
CATEGORIES= x11-toolkits
MASTER_SITES= GNOME/sources/gtk+/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}
PKGNAMESUFFIX= 3
@ -13,6 +14,9 @@ DIST_SUBDIR= gnome
MAINTAINER= desktop@FreeBSD.org
COMMENT= Gimp Toolkit for X11 GUI (current stable version)
EXTRA_PATCHES= ${FILESDIR}/0001-Check-if-size-changed-before-hiding-a-surface.patch:-p1 \
${FILESDIR}/0001-Ignore-wl_output-globals-not-bound-by-us.patch:-p1
LICENSE= LGPL20
PORTSCOUT= limit:1,even

View file

@ -0,0 +1,59 @@
From 23c7e6e13bbe2c6b736e817f501dc0dd5b242787 Mon Sep 17 00:00:00 2001
From: Ronan Pigott <rpigott@berkeley.edu>
Date: Mon, 13 Sep 2021 17:14:14 -0700
Subject: [PATCH] Check if size changed before hiding a surface
Commit 68188fc948 introduces a workaround for clients that try to
change the size of a popup after it is created, but inadvertently
introduces an infinite loop of surface creation when the popup enters
two or more wl_outputs with different scales on creation.
This commit checks if the size actually changed before applying the
workaround and avoids the loop.
---
gdk/wayland/gdkwindow-wayland.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 1e82dcae3e..5d300a94ce 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -1199,6 +1199,7 @@ gdk_wayland_window_maybe_configure (GdkWindow *window,
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
gboolean is_xdg_popup;
gboolean is_visible;
+ gboolean size_changed;
impl->unconfigured_width = calculate_width_without_margin (window, width);
impl->unconfigured_height = calculate_height_without_margin (window, height);
@@ -1206,9 +1207,8 @@ gdk_wayland_window_maybe_configure (GdkWindow *window,
if (should_inhibit_resize (window))
return;
- if (window->width == width &&
- window->height == height &&
- impl->scale == scale)
+ size_changed = (window->width != width || window->height != height);
+ if (!size_changed && impl->scale == scale)
return;
/* For xdg_popup using an xdg_positioner, there is a race condition if
@@ -1222,6 +1222,7 @@ gdk_wayland_window_maybe_configure (GdkWindow *window,
if (is_xdg_popup &&
is_visible &&
+ size_changed &&
!impl->initial_configure_received &&
!impl->configuring_popup)
gdk_window_hide (window);
@@ -1230,6 +1231,7 @@ gdk_wayland_window_maybe_configure (GdkWindow *window,
if (is_xdg_popup &&
is_visible &&
+ size_changed &&
!impl->initial_configure_received &&
!impl->configuring_popup)
gdk_window_show (window);
--
2.33.1

View file

@ -0,0 +1,34 @@
From 9a4e32892896ce1d0a92f413845f6f7f18f9b456 Mon Sep 17 00:00:00 2001
From: Ronan Pigott <rpigott@berkeley.edu>
Date: Sat, 11 Sep 2021 17:22:12 -0700
Subject: [PATCH] Ignore wl_output globals not bound by us
Gdk doesn't know the scale of output globals it didn't bind. This
keeps them from entering the output list and triggering erroneous
changes in surface scales.
---
gdk/wayland/gdkwindow-wayland.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 2d7c42bd7a..1e82dcae3e 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -1520,6 +1520,14 @@ surface_enter (void *data,
{
GdkWindow *window = GDK_WINDOW (data);
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+ GdkWaylandDisplay *display_wayland =
+ GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
+ gboolean output_is_unmanaged;
+
+ output_is_unmanaged =
+ _gdk_wayland_screen_get_output_scale (display_wayland->screen, output) == 0;
+ if (output_is_unmanaged)
+ return;
GDK_NOTE (EVENTS,
g_message ("surface enter, window %p output %p", window, output));
--
2.33.1