diff --git a/SOURCES/0001-backend-native-Use-drmModeCloseFB-for-flicker-free-l.patch b/SOURCES/0001-backend-native-Use-drmModeCloseFB-for-flicker-free-l.patch new file mode 100644 index 0000000..7741a2b --- /dev/null +++ b/SOURCES/0001-backend-native-Use-drmModeCloseFB-for-flicker-free-l.patch @@ -0,0 +1,51 @@ +From d71294da2282fe9a82cc8661d3110c8020a5069a Mon Sep 17 00:00:00 2001 +From: Jocelyn Falempe +Date: Wed, 13 Mar 2024 15:34:14 +0100 +Subject: [PATCH] backend/native: Use drmModeCloseFB for flicker-free login + +When logging in from gdm to gnome, the main plane is deactivated, and +leads to the screen going blank before gnome is able to enable it +again. +Using the new CloseFB ioctl, allows to keep the gdm login screen +displayed until gnome-shell replace it. + +Signed-off-by: Jocelyn Falempe +Part-of: +(cherry picked from commit a775241efd8b840e7789077fb2224f0df2361d54) +--- + meson.build | 3 ++- + src/backends/native/meta-drm-buffer.c | 4 +++- + 2 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/meson.build b/meson.build +index 613aa67792..0c342ed335 100644 +--- a/meson.build ++++ b/meson.build +@@ -45,7 +45,8 @@ wayland_protocols_req = '>= 1.19' + + # native backend version requirements + libinput_req = '>= 1.15.0' +-gbm_req = '>= 17.3' ++gbm_req = '>= 21.3' ++libdrm_req = '>= 2.4.118' + + # screen cast version requirements + libpipewire_req = '>= 0.3.21' +diff --git a/src/backends/native/meta-drm-buffer.c b/src/backends/native/meta-drm-buffer.c +index a0f8055b31..c650484552 100644 +--- a/src/backends/native/meta-drm-buffer.c ++++ b/src/backends/native/meta-drm-buffer.c +@@ -211,7 +211,9 @@ rm_fb_in_impl (MetaKmsImpl *impl, + int ret; + + fd = meta_kms_impl_device_get_fd (impl_device); +- ret = drmModeRmFB (fd, fb_id); ++ ret = drmModeCloseFB (fd, fb_id); ++ if (ret == -EINVAL) ++ ret = drmModeRmFB (fd, fb_id); + if (ret != 0) + g_warning ("drmModeRmFB: %s", g_strerror (-ret)); + +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/0001-display-Make-cgroup-constructor-local.patch b/SOURCES/0001-display-Make-cgroup-constructor-local.patch new file mode 100644 index 0000000..13f8425 --- /dev/null +++ b/SOURCES/0001-display-Make-cgroup-constructor-local.patch @@ -0,0 +1,26 @@ +From 088644fb1773b64ca45dec497589517e1774eac1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Tue, 27 Aug 2024 11:33:14 +0200 +Subject: [PATCH 1/5] display: Make cgroup constructor local + +This silences a warning about a missing function declaration. +--- + src/core/display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/core/display.c b/src/core/display.c +index 4c9038e627..97f591a876 100644 +--- a/src/core/display.c ++++ b/src/core/display.c +@@ -1619,7 +1619,7 @@ extract_app_id_from_cgroup (const char *cgroup) + return g_steal_pointer (&app_id); + } + +-MetaCGroup* ++static MetaCGroup* + meta_cgroup_new (const char *path) + { + MetaCGroup *cgroup; +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/0001-wayland-wl-shell-Make-sure-created-window-has-a-prop.patch b/SOURCES/0001-wayland-wl-shell-Make-sure-created-window-has-a-prop.patch new file mode 100644 index 0000000..910034c --- /dev/null +++ b/SOURCES/0001-wayland-wl-shell-Make-sure-created-window-has-a-prop.patch @@ -0,0 +1,48 @@ +From 0fe26e5b6d1e6f03a99623edf6a6f4c6caa2e142 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Tue, 15 Oct 2024 14:56:33 +0200 +Subject: [PATCH 1/2] wayland/wl-shell: Make sure created window has a proper + size + +The wl_shell_window construction is a bit messy, and was not properly +resizing when a window was created after a buffer was attached. This, +when the window was the dummy window in wl-paste, caused a SIGFPE as the +window was incorrectly assumed to be 0x0, i.e. size being 0. +--- + src/wayland/meta-wayland-wl-shell.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/wayland/meta-wayland-wl-shell.c b/src/wayland/meta-wayland-wl-shell.c +index 964c185b23..51d88cea2b 100644 +--- a/src/wayland/meta-wayland-wl-shell.c ++++ b/src/wayland/meta-wayland-wl-shell.c +@@ -481,7 +481,7 @@ sync_wl_shell_parent_relationship (MetaWaylandSurface *surface, + } + } + +-static void ++static MetaWindow * + create_wl_shell_surface_window (MetaWaylandSurface *surface) + { + MetaWaylandWlShellSurface *wl_shell_surface = +@@ -513,6 +513,8 @@ create_wl_shell_surface_window (MetaWaylandSurface *surface) + if (meta_wayland_surface_get_window (child)) + sync_wl_shell_parent_relationship (child, surface); + } ++ ++ return window; + } + + static void +@@ -597,7 +599,7 @@ wl_shell_surface_role_apply_state (MetaWaylandSurfaceRole *surface_role, + * convenient for us. */ + if (surface->buffer_ref->buffer && !window) + { +- create_wl_shell_surface_window (surface); ++ window = create_wl_shell_surface_window (surface); + } + else if (!surface->buffer_ref->buffer && window) + { +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/0002-display-Also-set-window-cgroup-on-cgroup-creation.patch b/SOURCES/0002-display-Also-set-window-cgroup-on-cgroup-creation.patch new file mode 100644 index 0000000..d05c281 --- /dev/null +++ b/SOURCES/0002-display-Also-set-window-cgroup-on-cgroup-creation.patch @@ -0,0 +1,27 @@ +From 37b4b8dd63851e97b507008fe1028a259c0419c7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Tue, 27 Aug 2024 11:33:22 +0200 +Subject: [PATCH 2/5] display: Also set window cgroup on cgroup creation + +We'd register the cgroup for a window twice, because the firs time +didn't update the MetaWindow::cgroup pointer. This meant the cgroups +were never removed. +--- + src/core/display.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/core/display.c b/src/core/display.c +index 97f591a876..e99e787fbe 100644 +--- a/src/core/display.c ++++ b/src/core/display.c +@@ -1704,6 +1704,7 @@ meta_display_register_cgroup (MetaDisplay *display, + + cgroup = meta_cgroup_new (path); + g_hash_table_insert (display->cgroups, g_file_get_path (cgroup->path), cgroup); ++ window->cgroup = cgroup; + } + + void +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/0002-window-Avoid-SIGFPE-on-bogus-window-size.patch b/SOURCES/0002-window-Avoid-SIGFPE-on-bogus-window-size.patch new file mode 100644 index 0000000..b951c38 --- /dev/null +++ b/SOURCES/0002-window-Avoid-SIGFPE-on-bogus-window-size.patch @@ -0,0 +1,24 @@ +From e434615ed1d4ba506e0282ad5cdc94303310c682 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Wed, 16 Oct 2024 14:26:28 +0200 +Subject: [PATCH 2/2] window: Avoid SIGFPE on bogus window size + +--- + src/core/window.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/core/window.c b/src/core/window.c +index 512ef9312f..142aa0eca1 100644 +--- a/src/core/window.c ++++ b/src/core/window.c +@@ -2393,6 +2393,7 @@ window_would_mostly_be_covered_by_always_above_window (MetaWindow *window) + } + + window_area = window->rect.width * window->rect.height; ++ g_return_val_if_fail (window_area > 0, FALSE); + + cairo_region_intersect_rectangle (region, &window->rect); + intersection_area = calculate_region_area (region); +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/0003-window-Unregister-cgroup-on-unmanage.patch b/SOURCES/0003-window-Unregister-cgroup-on-unmanage.patch new file mode 100644 index 0000000..aa8427e --- /dev/null +++ b/SOURCES/0003-window-Unregister-cgroup-on-unmanage.patch @@ -0,0 +1,36 @@ +From dd887dcf4770309fca127217660c5142a463e2c1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Tue, 27 Aug 2024 11:33:23 +0200 +Subject: [PATCH 3/5] window: Unregister cgroup on unmanage() + +This means any potential reference held by gjs will not hold the cgroup +alive longer than necessary. +--- + src/core/window.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/core/window.c b/src/core/window.c +index 142aa0eca1..272d664965 100644 +--- a/src/core/window.c ++++ b/src/core/window.c +@@ -339,8 +339,6 @@ meta_window_finalize (GObject *object) + g_free (window->sm_client_id); + g_free (window->wm_client_machine); + +- meta_display_unregister_cgroup (window->display, window); +- + g_free (window->startup_id); + g_free (window->role); + g_free (window->res_class); +@@ -1467,6 +1465,8 @@ meta_window_unmanage (MetaWindow *window, + meta_verbose ("Unmanaging %s", window->desc); + window->unmanaging = TRUE; + ++ meta_display_unregister_cgroup (window->display, window); ++ + g_clear_handle_id (&window->unmanage_idle_id, g_source_remove); + + g_signal_emit (window, window_signals[UNMANAGING], 0); +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/0004-window-Don-t-use-cgroup-workspace-if-there-already-i.patch b/SOURCES/0004-window-Don-t-use-cgroup-workspace-if-there-already-i.patch new file mode 100644 index 0000000..dce3eb7 --- /dev/null +++ b/SOURCES/0004-window-Don-t-use-cgroup-workspace-if-there-already-i.patch @@ -0,0 +1,30 @@ +From 6cdfc8abe25fccfd06cac99ae82c0f2acbbdb7c2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Thu, 17 Oct 2024 11:49:26 +0200 +Subject: [PATCH 4/5] window: Don't use cgroup workspace if there already is + one + +This fixes a re-entry issue where calling 'meta_window_activate()' +assumed it'd activate on the current workspace. +--- + src/core/window.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/core/window.c b/src/core/window.c +index 272d664965..8ad8e5c4c4 100644 +--- a/src/core/window.c ++++ b/src/core/window.c +@@ -3812,7 +3812,9 @@ meta_window_activate_full (MetaWindow *window, + if (workspace == NULL) + { + meta_window_read_cgroup (window); +- if (window->cgroup && ++ if (!window->workspace && ++ !window->on_all_workspaces && ++ window->cgroup && + window->cgroup->last_active_workspace != NULL && + !window->cgroup->has_startup_sequence && + (!window->cgroup->app_info || +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/0005-cgroup-Get-app-info-from-gnome-shell-when-possible.patch b/SOURCES/0005-cgroup-Get-app-info-from-gnome-shell-when-possible.patch new file mode 100644 index 0000000..c760791 --- /dev/null +++ b/SOURCES/0005-cgroup-Get-app-info-from-gnome-shell-when-possible.patch @@ -0,0 +1,166 @@ +From 50d0355bda637a2b214e14c23e767e80066c1084 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Fri, 18 Oct 2024 13:23:01 +0200 +Subject: [PATCH 5/5] cgroup: Get app info from gnome-shell when possible + +Using cgroups alone for getting the app-id is flawed, as there are many +situations where the cgroup isn't set up properly, e.g. opening via +xdg-open or equivalent. gnome-shell already has a system for associating +windows with apps, so reuse this for the cgroup app info. +--- + src/core/display-private.h | 2 ++ + src/core/display.c | 56 +++++++++++++++++++++++++++++++------- + src/core/window.c | 6 ++++ + 3 files changed, 54 insertions(+), 10 deletions(-) + +diff --git a/src/core/display-private.h b/src/core/display-private.h +index 3c7e0898bf..9836e560b3 100644 +--- a/src/core/display-private.h ++++ b/src/core/display-private.h +@@ -304,6 +304,8 @@ gboolean meta_cgroup_unref (MetaCGroup *cgroup); + void meta_cgroup_update_workspace (MetaCGroup *cgroup, + MetaWorkspace *workspace, + guint32 timestamp); ++void meta_cgroup_update_app_info (MetaCGroup *cgroup, ++ MetaWindow *window); + + /* A "stack id" is a XID or a stamp */ + #define META_STACK_ID_IS_X11(id) ((id) < G_GUINT64_CONSTANT(0x100000000)) +diff --git a/src/core/display.c b/src/core/display.c +index e99e787fbe..637bc006d8 100644 +--- a/src/core/display.c ++++ b/src/core/display.c +@@ -162,6 +162,7 @@ enum + WORKAREAS_CHANGED, + CLOSING, + INIT_XSERVER, ++ FIND_APP_INFO, + LAST_SIGNAL + }; + +@@ -515,6 +516,12 @@ meta_display_class_init (MetaDisplayClass *klass) + 0, g_signal_accumulator_first_wins, + NULL, NULL, + G_TYPE_BOOLEAN, 1, G_TYPE_TASK); ++ display_signals[FIND_APP_INFO] = ++ g_signal_new ("find-app-info", ++ G_TYPE_FROM_CLASS (klass), ++ G_SIGNAL_RUN_LAST, ++ 0, NULL, NULL, NULL, ++ G_TYPE_DESKTOP_APP_INFO, 1, META_TYPE_WINDOW); + + g_object_class_install_property (object_class, + PROP_COMPOSITOR_MODIFIERS, +@@ -1620,25 +1627,32 @@ extract_app_id_from_cgroup (const char *cgroup) + } + + static MetaCGroup* +-meta_cgroup_new (const char *path) ++meta_cgroup_new (const char *path, ++ GAppInfo *app_info) + { + MetaCGroup *cgroup; +- g_autofree char *app_id = NULL; + + cgroup = g_new0 (MetaCGroup, 1); + cgroup->path = g_file_new_for_path (path); + g_ref_count_init (&cgroup->ref_count); + +- app_id = extract_app_id_from_cgroup (path); +- +- if (app_id) ++ if (!app_info) + { +- g_autoptr (GDesktopAppInfo) app_info = NULL; ++ g_autofree char *app_id = NULL; + +- app_info = g_desktop_app_info_new (app_id); ++ app_id = extract_app_id_from_cgroup (path); ++ if (app_id) ++ { ++ GDesktopAppInfo *desktop_app_info; + +- if (app_info) +- cgroup->app_info = G_APP_INFO (g_steal_pointer (&app_info)); ++ desktop_app_info = g_desktop_app_info_new (app_id); ++ if (desktop_app_info) ++ cgroup->app_info = G_APP_INFO (desktop_app_info); ++ } ++ } ++ else if (app_info) ++ { ++ cgroup->app_info = g_object_ref (app_info); + } + + return cgroup; +@@ -1687,12 +1701,30 @@ meta_cgroup_update_workspace (MetaCGroup *cgroup, + (gpointer *) &cgroup->last_active_workspace); + } + ++void ++meta_cgroup_update_app_info (MetaCGroup *cgroup, ++ MetaWindow *window) ++{ ++ g_autoptr (GDesktopAppInfo) app_info = NULL; ++ ++ g_signal_emit (window->display, ++ display_signals[FIND_APP_INFO], 0, ++ window, &app_info); ++ ++ if (app_info) ++ { ++ g_clear_object (&cgroup->app_info); ++ cgroup->app_info = G_APP_INFO (g_steal_pointer (&app_info)); ++ } ++} ++ + void + meta_display_register_cgroup (MetaDisplay *display, + MetaWindow *window, + const char *path) + { + MetaCGroup *cgroup; ++ g_autoptr (GDesktopAppInfo) app_info = NULL; + + cgroup = g_hash_table_lookup (display->cgroups, path); + +@@ -1702,7 +1734,11 @@ meta_display_register_cgroup (MetaDisplay *display, + return; + } + +- cgroup = meta_cgroup_new (path); ++ g_signal_emit (display, ++ display_signals[FIND_APP_INFO], 0, ++ window, &app_info); ++ ++ cgroup = meta_cgroup_new (path, app_info ? G_APP_INFO (app_info) : NULL); + g_hash_table_insert (display->cgroups, g_file_get_path (cgroup->path), cgroup); + window->cgroup = cgroup; + } +diff --git a/src/core/window.c b/src/core/window.c +index 8ad8e5c4c4..6de815839f 100644 +--- a/src/core/window.c ++++ b/src/core/window.c +@@ -8131,6 +8131,9 @@ meta_window_set_wm_class (MetaWindow *window, + window->res_class = g_strdup (wm_class); + + g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_WM_CLASS]); ++ ++ if (window->cgroup) ++ meta_cgroup_update_app_info (window->cgroup, window); + } + + void +@@ -8169,6 +8172,9 @@ meta_window_set_gtk_dbus_properties (MetaWindow *window, + g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_GTK_WINDOW_OBJECT_PATH]); + + g_object_thaw_notify (G_OBJECT (window)); ++ ++ if (window->cgroup) ++ meta_cgroup_update_app_info (window->cgroup, window); + } + + static gboolean +-- +2.44.0.501.g19981daefd.dirty + diff --git a/SOURCES/double-key-event-handling.patch b/SOURCES/double-key-event-handling.patch new file mode 100644 index 0000000..6c48449 --- /dev/null +++ b/SOURCES/double-key-event-handling.patch @@ -0,0 +1,264 @@ +From 0085197f2b5084109fd9c8f05e3504a73d3da183 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Thu, 13 Oct 2022 11:51:00 +0200 +Subject: [PATCH 1/3] Revert "wayland-keyboard: Don't send pressed keys on + enter" + +Back in 2014 sending pressed keys to Wayland clients caused issues, +because at least Xwayland didn't handle that gracefully, causing issues +like ghost-pressed keys. A way it was reproduced was quickly alt-tab:ing +to and from a Firefox window, which would cause the File menu bar +incorrectly appearing. + +While this was reported to the Xwayland component back then, it was, +probably by mistake, assumed to be an issue in mutter, and mutter +stopped sending pressed key events on enter. + +The following year, Xwayland was eventually fixed, but the work around +in mutter has been kept around until it was again noticed as an +inconsistency between compositor implementations. + +Lets remove the work around, and follow the spec, again. + +This reverts commit c39f18c2d438efe3a866767c9546a6140dd5aaad. + +Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2457 +Part-of: +--- + src/wayland/meta-wayland-keyboard.c | 67 ++++++++++++++++++++--------- + src/wayland/meta-wayland-keyboard.h | 2 + + 2 files changed, 48 insertions(+), 21 deletions(-) + +diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c +index 460d9e9..526da18 100644 +--- a/src/wayland/meta-wayland-keyboard.c ++++ b/src/wayland/meta-wayland-keyboard.c +@@ -516,6 +516,9 @@ meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard) + ClutterBackend *clutter_backend = clutter_get_default_backend (); + + keyboard->settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard"); ++ ++ wl_array_init (&keyboard->pressed_keys); ++ + g_signal_connect (keyboard->settings, "changed", + G_CALLBACK (settings_changed), keyboard); + +@@ -555,15 +558,57 @@ meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard) + wl_list_remove (&keyboard->focus_resource_list); + wl_list_init (&keyboard->focus_resource_list); + ++ wl_array_release (&keyboard->pressed_keys); ++ + g_clear_object (&keyboard->settings); + } + ++static void ++update_pressed_keys (struct wl_array *keys, ++ uint32_t evdev_code, ++ gboolean is_press) ++{ ++ uint32_t *end = (void *) ((char *) keys->data + keys->size); ++ uint32_t *k; ++ ++ if (is_press) ++ { ++ /* Make sure we don't already have this key. */ ++ for (k = keys->data; k < end; k++) ++ { ++ if (*k == evdev_code) ++ return; ++ } ++ ++ /* Otherwise add the key to the list of pressed keys */ ++ k = wl_array_add (keys, sizeof (*k)); ++ *k = evdev_code; ++ } ++ else ++ { ++ /* Remove the key from the array */ ++ for (k = keys->data; k < end; k++) ++ { ++ if (*k == evdev_code) ++ { ++ *k = *(end - 1); ++ keys->size -= sizeof (*k); ++ return; ++ } ++ } ++ ++ g_warning ("unexpected key release event for key 0x%x", evdev_code); ++ } ++} ++ + void + meta_wayland_keyboard_update (MetaWaylandKeyboard *keyboard, + const ClutterKeyEvent *event) + { + gboolean is_press = event->type == CLUTTER_KEY_PRESS; + ++ update_pressed_keys (&keyboard->pressed_keys, event->evdev_code, is_press); ++ + /* If we get a key event but still have pending modifier state + * changes from a previous event that didn't get cleared, we need to + * send that state right away so that the new key event can be +@@ -668,30 +713,10 @@ static void + broadcast_focus (MetaWaylandKeyboard *keyboard, + struct wl_resource *resource) + { +- struct wl_array fake_keys; +- +- /* We never want to send pressed keys to wayland clients on +- * enter. The protocol says that we should send them, presumably so +- * that clients can trigger their own key repeat routine in case +- * they are given focus and a key is physically pressed. +- * +- * Unfortunately this causes some clients, in particular Xwayland, +- * to register key events that they really shouldn't handle, +- * e.g. on an Alt+Tab keybinding, where Alt is released before Tab, +- * clients would see Tab being pressed on enter followed by a key +- * release event for Tab, meaning that Tab would be processed by +- * the client when it really shouldn't. +- * +- * Since the use case for the pressed keys array on enter seems weak +- * to us, we'll just fake that there are no pressed keys instead +- * which should be spec compliant even if it might not be true. +- */ +- wl_array_init (&fake_keys); +- + keyboard_send_modifiers (keyboard, resource, keyboard->focus_serial); + wl_keyboard_send_enter (resource, keyboard->focus_serial, + keyboard->focus_surface->resource, +- &fake_keys); ++ &keyboard->pressed_keys); + } + + void +diff --git a/src/wayland/meta-wayland-keyboard.h b/src/wayland/meta-wayland-keyboard.h +index ac57d76..2377d83 100644 +--- a/src/wayland/meta-wayland-keyboard.h ++++ b/src/wayland/meta-wayland-keyboard.h +@@ -95,6 +95,8 @@ struct _MetaWaylandKeyboard + uint32_t key_up_keycode; + uint32_t key_up_serial; + ++ struct wl_array pressed_keys; ++ + MetaWaylandXkbInfo xkb_info; + enum xkb_state_component mods_changed; + xkb_mod_mask_t kbd_a11y_latched_mods; +-- +2.47.0 + + +From ea401fe0c2993d110301bd8e24bc649260f003bc Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Wed, 7 Jun 2023 12:52:46 +0200 +Subject: [PATCH 2/3] wayland: Account for doubly pressed/released keys in + MetaWaylandKeyboard + +Given the presence of IMs and the different paths in event handling to reach +one of them, we cannot make guesses about whether should stick to the original +hardware-triggered event, or wait/prefer a second hand IM event that might or +might not arrive. We also have no say for other IM foci unrelated to wayland +(e.g. ClutterText) triggering the double event emission. + +So go with it and maintain our own internal state for keys, we already kinda +do, but mainly for warning purposes, at the time of updating the +MetaWaylandKeyboard state. + +Part-of: +--- + src/wayland/meta-wayland-keyboard.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c +index 526da18..9ee3fb4 100644 +--- a/src/wayland/meta-wayland-keyboard.c ++++ b/src/wayland/meta-wayland-keyboard.c +@@ -563,7 +563,7 @@ meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard) + g_clear_object (&keyboard->settings); + } + +-static void ++static gboolean + update_pressed_keys (struct wl_array *keys, + uint32_t evdev_code, + gboolean is_press) +@@ -577,12 +577,13 @@ update_pressed_keys (struct wl_array *keys, + for (k = keys->data; k < end; k++) + { + if (*k == evdev_code) +- return; ++ return FALSE; + } + + /* Otherwise add the key to the list of pressed keys */ + k = wl_array_add (keys, sizeof (*k)); + *k = evdev_code; ++ return TRUE; + } + else + { +@@ -593,11 +594,11 @@ update_pressed_keys (struct wl_array *keys, + { + *k = *(end - 1); + keys->size -= sizeof (*k); +- return; ++ return TRUE; + } + } + +- g_warning ("unexpected key release event for key 0x%x", evdev_code); ++ return FALSE; + } + } + +@@ -607,7 +608,8 @@ meta_wayland_keyboard_update (MetaWaylandKeyboard *keyboard, + { + gboolean is_press = event->type == CLUTTER_KEY_PRESS; + +- update_pressed_keys (&keyboard->pressed_keys, event->evdev_code, is_press); ++ if (!update_pressed_keys (&keyboard->pressed_keys, event->evdev_code, is_press)) ++ return; + + /* If we get a key event but still have pending modifier state + * changes from a previous event that didn't get cleared, we need to +-- +2.47.0 + + +From 69eb3d3bfa39b53ab0143f01d248b159eaeec241 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Thu, 13 Oct 2022 11:56:06 +0200 +Subject: [PATCH 3/3] wayland/seat: Don't double-disable input classes + +We'd set the capabilities to 'none', meaning all previously enabled +device classes would be disabled. That means we shouldn't re-disable +them directly after. + +This ensures '..disable()' is only called once for every '..enable()'. + +Part-of: +--- + src/wayland/meta-wayland-seat.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c +index 27d8fe3..1214b12 100644 +--- a/src/wayland/meta-wayland-seat.c ++++ b/src/wayland/meta-wayland-seat.c +@@ -270,11 +270,8 @@ meta_wayland_seat_free (MetaWaylandSeat *seat) + g_signal_handlers_disconnect_by_data (clutter_seat, seat); + meta_wayland_seat_set_capabilities (seat, 0); + +- meta_wayland_pointer_disable (seat->pointer); + g_object_unref (seat->pointer); +- meta_wayland_keyboard_disable (seat->keyboard); + g_object_unref (seat->keyboard); +- meta_wayland_touch_disable (seat->touch); + g_object_unref (seat->touch); + + meta_wayland_gtk_text_input_destroy (seat->gtk_text_input); +-- +2.47.0 + diff --git a/SPECS/mutter.spec b/SPECS/mutter.spec index 03bc4b8..4b2f192 100644 --- a/SPECS/mutter.spec +++ b/SPECS/mutter.spec @@ -10,7 +10,7 @@ Name: mutter Version: 40.9 -Release: 20%{?dist} +Release: 24%{?dist} Summary: Window and compositing manager based on Clutter License: GPLv2+ @@ -135,6 +135,23 @@ Patch57: 0001-cursor-renderer-native-Don-t-retry-forever-after-GBM.patch # RHEL-45998 & RHEL-45366 Patch58: sticky-or-on-top-dialog-fixes.patch +# RHEL-62988 +Patch59: 0001-wayland-wl-shell-Make-sure-created-window-has-a-prop.patch +Patch60: 0002-window-Avoid-SIGFPE-on-bogus-window-size.patch + +# RHEL-62997, RHEL-63000 +Patch61: 0001-display-Make-cgroup-constructor-local.patch +Patch62: 0002-display-Also-set-window-cgroup-on-cgroup-creation.patch +Patch63: 0003-window-Unregister-cgroup-on-unmanage.patch +Patch64: 0004-window-Don-t-use-cgroup-workspace-if-there-already-i.patch +Patch65: 0005-cgroup-Get-app-info-from-gnome-shell-when-possible.patch + +# RHEL-10895 +Patch66: 0001-backend-native-Use-drmModeCloseFB-for-flicker-free-l.patch + +# RHEL-21286 +Patch67: double-key-event-handling.patch + BuildRequires: chrpath BuildRequires: pango-devel BuildRequires: startup-notification-devel @@ -282,13 +299,31 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop %{_datadir}/mutter-%{mutter_api_version}/tests %changelog -* Mon Aug 05 2024 Jonas Ådahl ) - 40.9-20 +* Tue Jan 28 2025 Carlos Garnacho - 40.9-24 +- Fix stuck modifier keys + Resolves: RHEL-21286 + +* Fri Nov 01 2024 Jonas Ådahl - 40.9-23 +- Backport fix for flicker-free login + Resolves: RHEL-10895 + +* Fri Oct 18 2024 Jonas Ådahl - 40.9-22 +- Fix crash when moving window while switching workspace + Resolves: RHEL-62997 +- Improve app discovery for workspace logic + Resolves: RHEL-63000 + +* Fri Oct 18 2024 Jonas Ådahl - 40.9-21 +- Fix regression causing wl-copy to trigger a crash + Resolves: RHEL-62993 + +* Mon Aug 05 2024 Jonas Ådahl - 40.9-20 - Fix positioning when using always-on-top windows Resolves: RHEL-45998 - Improve handling of always-on-visible-workspace windows Resolves: RHEL-45366 -* Mon Aug 05 2024 Jonas Ådahl ) - 40.9-19 +* Mon Aug 05 2024 Jonas Ådahl - 40.9-19 - Don't retry using cursor plane if it failed Resolves: RHEL-32622