summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk3-throttle-system-bell-on-wayland.patch185
-rw-r--r--gtk3.spec9
2 files changed, 193 insertions, 1 deletions
diff --git a/gtk3-throttle-system-bell-on-wayland.patch b/gtk3-throttle-system-bell-on-wayland.patch
new file mode 100644
index 0000000..a8673c9
--- /dev/null
+++ b/gtk3-throttle-system-bell-on-wayland.patch
@@ -0,0 +1,185 @@
+From f78585b7c35cbe07b5cf921a871d59299dcfa355 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
+Date: Mon, 13 Mar 2017 14:33:06 +0800
+Subject: [PATCH 1/2] wayland: Make beep requests go through the GdkDisplay
+
+This way we can add things like throttling.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=778188
+---
+ gdk/wayland/gdkdisplay-wayland.c | 19 ++++++++++++++++---
+ gdk/wayland/gdkprivate-wayland.h | 5 +++++
+ gdk/wayland/gdkwindow-wayland.c | 18 +++++++++---------
+ 3 files changed, 30 insertions(+), 12 deletions(-)
+
+diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
+index 784cfbecc411..d7fb684bd69b 100644
+--- a/gdk/wayland/gdkdisplay-wayland.c
++++ b/gdk/wayland/gdkdisplay-wayland.c
+@@ -656,10 +656,12 @@ gdk_wayland_display_get_default_screen (GdkDisplay *display)
+ return GDK_WAYLAND_DISPLAY (display)->screen;
+ }
+
+-static void
+-gdk_wayland_display_beep (GdkDisplay *display)
++void
++gdk_wayland_display_system_bell (GdkDisplay *display,
++ GdkWindow *window)
+ {
+ GdkWaylandDisplay *display_wayland;
++ struct gtk_surface1 *gtk_surface;
+
+ g_return_if_fail (GDK_IS_DISPLAY (display));
+
+@@ -668,7 +670,18 @@ gdk_wayland_display_beep (GdkDisplay *display)
+ if (!display_wayland->gtk_shell)
+ return;
+
+- gtk_shell1_system_bell (display_wayland->gtk_shell, NULL);
++ if (window)
++ gtk_surface = gdk_wayland_window_get_gtk_surface (window);
++ else
++ gtk_surface = NULL;
++
++ gtk_shell1_system_bell (display_wayland->gtk_shell, gtk_surface);
++}
++
++static void
++gdk_wayland_display_beep (GdkDisplay *display)
++{
++ gdk_wayland_display_system_bell (display, NULL);
+ }
+
+ static void
+diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
+index a95c925ca138..fde7632d38f5 100644
+--- a/gdk/wayland/gdkprivate-wayland.h
++++ b/gdk/wayland/gdkprivate-wayland.h
+@@ -83,6 +83,9 @@ void _gdk_wayland_display_get_maximal_cursor_size (GdkDisplay *display,
+ gboolean _gdk_wayland_display_supports_cursor_alpha (GdkDisplay *display);
+ gboolean _gdk_wayland_display_supports_cursor_color (GdkDisplay *display);
+
++void gdk_wayland_display_system_bell (GdkDisplay *display,
++ GdkWindow *window);
++
+ struct wl_buffer *_gdk_wayland_cursor_get_buffer (GdkCursor *cursor,
+ guint image_index,
+ int *hotspot_x,
+@@ -271,6 +274,8 @@ EGLSurface gdk_wayland_window_get_egl_surface (GdkWindow *window,
+ EGLSurface gdk_wayland_window_get_dummy_egl_surface (GdkWindow *window,
+ EGLConfig config);
+
++struct gtk_surface1 * gdk_wayland_window_get_gtk_surface (GdkWindow *window);
++
+ void gdk_wayland_seat_set_global_cursor (GdkSeat *seat,
+ GdkCursor *cursor);
+
+diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
+index ffc9f94a009c..1f93f6c9c598 100644
+--- a/gdk/wayland/gdkwindow-wayland.c
++++ b/gdk/wayland/gdkwindow-wayland.c
+@@ -958,15 +958,8 @@ gdk_window_impl_wayland_end_paint (GdkWindow *window)
+ static gboolean
+ gdk_window_impl_wayland_beep (GdkWindow *window)
+ {
+- GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+- GdkWaylandDisplay *display_wayland =
+- GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
+-
+- if (!display_wayland->gtk_shell)
+- return FALSE;
+-
+- gtk_shell1_system_bell (display_wayland->gtk_shell,
+- impl->display_server.gtk_surface);
++ gdk_wayland_display_system_bell (gdk_window_get_display (window),
++ window);
+
+ return TRUE;
+ }
+@@ -3891,6 +3884,13 @@ gdk_wayland_window_get_dummy_egl_surface (GdkWindow *window,
+ return impl->dummy_egl_surface;
+ }
+
++struct gtk_surface1 *
++gdk_wayland_window_get_gtk_surface (GdkWindow *window)
++{
++ g_return_val_if_fail (GDK_IS_WAYLAND_WINDOW (window), NULL);
++
++ return GDK_WINDOW_IMPL_WAYLAND (window->impl)->display_server.gtk_surface;
++}
+
+ /**
+ * gdk_wayland_window_set_use_custom_surface:
+--
+2.9.4
+
+
+From 376ff1ae607db3e3ae47e8caeb8e8bce98c56f54 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
+Date: Mon, 13 Mar 2017 14:42:38 +0800
+Subject: [PATCH 2/2] wayland: Throttle system bell requests
+
+If a bad behaving application tries to make the window/display beep too
+often, throttle the beep requests so that we don't end up filling the
+Wayland socket queue.
+
+The throttle is set to 50 beeps per second, which far more beeps than
+will ever make any sense from a user experience point of view, but will
+avoid terminating due to an excessive amount of requests.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=778188
+---
+ gdk/wayland/gdkdisplay-wayland.c | 9 +++++++++
+ gdk/wayland/gdkdisplay-wayland.h | 2 ++
+ 2 files changed, 11 insertions(+)
+
+diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
+index d7fb684bd69b..3c8eedbfdae8 100644
+--- a/gdk/wayland/gdkdisplay-wayland.c
++++ b/gdk/wayland/gdkdisplay-wayland.c
+@@ -80,6 +80,8 @@
+ * ]|
+ */
+
++#define MIN_SYSTEM_BELL_DELAY_MS 20
++
+ static void _gdk_wayland_display_load_cursor_theme (GdkWaylandDisplay *display_wayland);
+
+ G_DEFINE_TYPE (GdkWaylandDisplay, gdk_wayland_display, GDK_TYPE_DISPLAY)
+@@ -662,6 +664,7 @@ gdk_wayland_display_system_bell (GdkDisplay *display,
+ {
+ GdkWaylandDisplay *display_wayland;
+ struct gtk_surface1 *gtk_surface;
++ gint64 now_ms;
+
+ g_return_if_fail (GDK_IS_DISPLAY (display));
+
+@@ -675,6 +678,12 @@ gdk_wayland_display_system_bell (GdkDisplay *display,
+ else
+ gtk_surface = NULL;
+
++ now_ms = g_get_monotonic_time () / 1000;
++ if (now_ms - display_wayland->last_bell_time_ms < MIN_SYSTEM_BELL_DELAY_MS)
++ return;
++
++ display_wayland->last_bell_time_ms = now_ms;
++
+ gtk_shell1_system_bell (display_wayland->gtk_shell, gtk_surface);
+ }
+
+diff --git a/gdk/wayland/gdkdisplay-wayland.h b/gdk/wayland/gdkdisplay-wayland.h
+index a9fd4831a49c..3ae114e048fb 100644
+--- a/gdk/wayland/gdkdisplay-wayland.h
++++ b/gdk/wayland/gdkdisplay-wayland.h
+@@ -110,6 +110,8 @@ struct _GdkWaylandDisplay
+
+ GPtrArray *monitors;
+
++ gint64 last_bell_time_ms;
++
+ /* egl info */
+ EGLDisplay egl_display;
+ int egl_major_version;
+--
+2.9.4
+
diff --git a/gtk3.spec b/gtk3.spec
index 2022dd8..440f3d6 100644
--- a/gtk3.spec
+++ b/gtk3.spec
@@ -22,13 +22,16 @@
Name: gtk3
Version: 3.22.17
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: GTK+ graphical user interface library
License: LGPLv2+
URL: http://www.gtk.org
Source0: http://download.gnome.org/sources/gtk+/3.22/gtk+-%{version}.tar.xz
+# https://bugzilla.redhat.com/show_bug.cgi?id=1466654
+Patch0: gtk3-throttle-system-bell-on-wayland.patch
+
BuildRequires: pkgconfig(atk) >= %{atk_version}
BuildRequires: pkgconfig(atk-bridge-2.0)
BuildRequires: pkgconfig(glib-2.0) >= %{glib2_version}
@@ -167,6 +170,7 @@ the functionality of the installed %{name} package.
%prep
%setup -q -n gtk+-%{version}
+%patch0 -p1
%build
export CFLAGS='-fno-strict-aliasing %optflags'
@@ -339,6 +343,9 @@ gtk-query-immodules-3.0-%{__isa_bits} --update-cache &>/dev/null || :
%{_datadir}/installed-tests
%changelog
+* Thu Jul 20 2017 Debarshi Ray <rishi@fedoraproject.org> - 3.22.17-2
+- Backport fix to throttle system bell requests on Wayland (RH #1466654)
+
* Wed Jul 19 2017 Kalev Lember <klember@redhat.com> - 3.22.17-1
- Update to 3.22.17
bgstack15