import CS mutter-40.9-24.el9
This commit is contained in:
parent
c3b6b4ccc6
commit
6208210bb9
@ -0,0 +1,51 @@
|
||||
From d71294da2282fe9a82cc8661d3110c8020a5069a Mon Sep 17 00:00:00 2001
|
||||
From: Jocelyn Falempe <jfalempe@redhat.com>
|
||||
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 <jfalempe@redhat.com>
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3659>
|
||||
(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
|
||||
|
26
SOURCES/0001-display-Make-cgroup-constructor-local.patch
Normal file
26
SOURCES/0001-display-Make-cgroup-constructor-local.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 088644fb1773b64ca45dec497589517e1774eac1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
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
|
||||
|
@ -0,0 +1,48 @@
|
||||
From 0fe26e5b6d1e6f03a99623edf6a6f4c6caa2e142 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,27 @@
|
||||
From 37b4b8dd63851e97b507008fe1028a259c0419c7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
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
|
||||
|
24
SOURCES/0002-window-Avoid-SIGFPE-on-bogus-window-size.patch
Normal file
24
SOURCES/0002-window-Avoid-SIGFPE-on-bogus-window-size.patch
Normal file
@ -0,0 +1,24 @@
|
||||
From e434615ed1d4ba506e0282ad5cdc94303310c682 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@redhat.com>
|
||||
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
|
||||
|
36
SOURCES/0003-window-Unregister-cgroup-on-unmanage.patch
Normal file
36
SOURCES/0003-window-Unregister-cgroup-on-unmanage.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From dd887dcf4770309fca127217660c5142a463e2c1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
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
|
||||
|
@ -0,0 +1,30 @@
|
||||
From 6cdfc8abe25fccfd06cac99ae82c0f2acbbdb7c2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@redhat.com>
|
||||
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
|
||||
|
@ -0,0 +1,166 @@
|
||||
From 50d0355bda637a2b214e14c23e767e80066c1084 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@redhat.com>
|
||||
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
|
||||
|
264
SOURCES/double-key-event-handling.patch
Normal file
264
SOURCES/double-key-event-handling.patch
Normal file
@ -0,0 +1,264 @@
|
||||
From 0085197f2b5084109fd9c8f05e3504a73d3da183 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2657>
|
||||
---
|
||||
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 <carlosg@gnome.org>
|
||||
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3044>
|
||||
---
|
||||
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?= <jadahl@gmail.com>
|
||||
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2657>
|
||||
---
|
||||
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
|
||||
|
@ -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 <jadahl@redhat.com>) - 40.9-20
|
||||
* Tue Jan 28 2025 Carlos Garnacho <cgarnach@redhat.com> - 40.9-24
|
||||
- Fix stuck modifier keys
|
||||
Resolves: RHEL-21286
|
||||
|
||||
* Fri Nov 01 2024 Jonas Ådahl <jadahl@redhat.com> - 40.9-23
|
||||
- Backport fix for flicker-free login
|
||||
Resolves: RHEL-10895
|
||||
|
||||
* Fri Oct 18 2024 Jonas Ådahl <jadahl@redhat.com> - 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 <jadahl@redhat.com> - 40.9-21
|
||||
- Fix regression causing wl-copy to trigger a crash
|
||||
Resolves: RHEL-62993
|
||||
|
||||
* Mon Aug 05 2024 Jonas Ådahl <jadahl@redhat.com> - 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 <jadahl@redhat.com>) - 40.9-19
|
||||
* Mon Aug 05 2024 Jonas Ådahl <jadahl@redhat.com> - 40.9-19
|
||||
- Don't retry using cursor plane if it failed
|
||||
Resolves: RHEL-32622
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user