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?= +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?= +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 - 3.22.17-2 +- Backport fix to throttle system bell requests on Wayland (RH #1466654) + * Wed Jul 19 2017 Kalev Lember - 3.22.17-1 - Update to 3.22.17