From 6b00a085e38ba8a910b1157b02562c7976bed021 Mon Sep 17 00:00:00 2001 From: eabdullin Date: Wed, 27 Sep 2023 13:42:24 +0000 Subject: [PATCH] import CS mutter-3.32.2-71.el8 --- ...WaylandTextInput-event-forwarding-to.patch | 163 +++++++++++++++++ ...Queue-fail-safe-callbacks-when-mode-.patch | 172 ++++++++++++++++++ SPECS/mutter.spec | 15 +- 3 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 SOURCES/0001-core-Change-MetaWaylandTextInput-event-forwarding-to.patch create mode 100644 SOURCES/0001-renderer-native-Queue-fail-safe-callbacks-when-mode-.patch diff --git a/SOURCES/0001-core-Change-MetaWaylandTextInput-event-forwarding-to.patch b/SOURCES/0001-core-Change-MetaWaylandTextInput-event-forwarding-to.patch new file mode 100644 index 0000000..aa414ac --- /dev/null +++ b/SOURCES/0001-core-Change-MetaWaylandTextInput-event-forwarding-to.patch @@ -0,0 +1,163 @@ +From bfd49687aa862a7e69d0d7fe76f803ae180d40c2 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Wed, 7 Jun 2023 11:04:15 +0200 +Subject: [PATCH] core: Change MetaWaylandTextInput event forwarding to IMs + +We need to juggle with some things here to keep key event ordering +and accounting consistent. + +The keyboard internal state changes (and maybe modifier event emission) +happening through meta_wayland_seat_update() should ideally happen +from the same key events that reach the client through wl_keyboard.key, +so that wl_keyboard.modifier events are emitted in the right relative +order to other key events. + +In order to fix this, we need to decide at an earlier point whether +the event will get processed through IM (and maybe be reinjected), +thus ignored in wait of IM-postprocessed events. + +This means we pay less attention to whether events are first-hand +hardware events for some things and go with the event that does +eventually reach to us (hardware or IM). + +Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5890 +--- + src/core/events.c | 8 ++++++++ + src/wayland/meta-wayland-keyboard.c | 8 -------- + src/wayland/meta-wayland-seat.c | 30 ++++++++++++++++++++++------- + src/wayland/meta-wayland-seat.h | 3 +++ + src/wayland/meta-wayland.c | 7 +++++++ + src/wayland/meta-wayland.h | 4 ++++ + 6 files changed, 45 insertions(+), 15 deletions(-) + +diff --git a/src/core/events.c b/src/core/events.c +index 5b8e49fc79..19d701779b 100644 +--- a/src/core/events.c ++++ b/src/core/events.c +@@ -207,6 +207,14 @@ meta_display_handle_event (MetaDisplay *display, + if (meta_is_wayland_compositor ()) + { + compositor = meta_wayland_compositor_get_default (); ++ ++ if (display->event_route == META_EVENT_ROUTE_NORMAL && ++ meta_wayland_compositor_handle_text_input_event (compositor, event)) ++ { ++ bypass_wayland = bypass_clutter = TRUE; ++ goto out; ++ } ++ + meta_wayland_compositor_update (compositor, event); + } + #endif +diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c +index 8b23d76ce7..84f46bcf8e 100644 +--- a/src/wayland/meta-wayland-keyboard.c ++++ b/src/wayland/meta-wayland-keyboard.c +@@ -753,14 +753,6 @@ meta_wayland_keyboard_update (MetaWaylandKeyboard *keyboard, + { + gboolean is_press = event->type == CLUTTER_KEY_PRESS; + +- /* Only handle real, non-synthetic, events here. The IM is free to reemit +- * key events (incl. modifiers), handling those additionally will result +- * in doubly-pressed keys. +- */ +- if ((event->flags & +- (CLUTTER_EVENT_FLAG_SYNTHETIC | CLUTTER_EVENT_FLAG_INPUT_METHOD)) != 0) +- 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 + * send that state right away so that the new key event can be +diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c +index 91fe376ffe..dcf420201f 100644 +--- a/src/wayland/meta-wayland-seat.c ++++ b/src/wayland/meta-wayland-seat.c +@@ -362,6 +362,29 @@ meta_wayland_seat_update (MetaWaylandSeat *seat, + } + } + ++gboolean ++meta_wayland_seat_handle_text_input_event (MetaWaylandSeat *seat, ++ const ClutterEvent *event) ++{ ++ switch (event->type) ++ { ++ case CLUTTER_KEY_PRESS: ++ case CLUTTER_KEY_RELEASE: ++ if (meta_wayland_text_input_handle_event (seat->text_input, event)) ++ return TRUE; ++ ++ if (meta_wayland_gtk_text_input_handle_event (seat->gtk_text_input, ++ event)) ++ return TRUE; ++ ++ break; ++ default: ++ break; ++ } ++ ++ return FALSE; ++} ++ + gboolean + meta_wayland_seat_handle_event (MetaWaylandSeat *seat, + const ClutterEvent *event) +@@ -384,13 +407,6 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat, + break; + case CLUTTER_KEY_PRESS: + case CLUTTER_KEY_RELEASE: +- if (meta_wayland_text_input_handle_event (seat->text_input, event)) +- return TRUE; +- +- if (meta_wayland_gtk_text_input_handle_event (seat->gtk_text_input, +- event)) +- return TRUE; +- + if (meta_wayland_seat_has_keyboard (seat)) + return meta_wayland_keyboard_handle_event (seat->keyboard, + (const ClutterKeyEvent *) event); +diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h +index 3a744d0580..da20e69d8d 100644 +--- a/src/wayland/meta-wayland-seat.h ++++ b/src/wayland/meta-wayland-seat.h +@@ -82,4 +82,7 @@ gboolean meta_wayland_seat_has_pointer (MetaWaylandSeat *seat); + + gboolean meta_wayland_seat_has_touch (MetaWaylandSeat *seat); + ++gboolean meta_wayland_seat_handle_text_input_event (MetaWaylandSeat *seat, ++ const ClutterEvent *event); ++ + #endif /* META_WAYLAND_SEAT_H */ +diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c +index a593f0a7b7..24a68f1e06 100644 +--- a/src/wayland/meta-wayland.c ++++ b/src/wayland/meta-wayland.c +@@ -565,3 +565,10 @@ meta_wayland_compositor_notify_surface_id (MetaWaylandCompositor *compositor, + meta_wayland_compositor_remove_surface_association (compositor, id); + } + } ++ ++gboolean ++meta_wayland_compositor_handle_text_input_event (MetaWaylandCompositor *compositor, ++ const ClutterEvent *event) ++{ ++ return meta_wayland_seat_handle_text_input_event (compositor->seat, event); ++} +diff --git a/src/wayland/meta-wayland.h b/src/wayland/meta-wayland.h +index 2a0aa11400..b5281d2014 100644 +--- a/src/wayland/meta-wayland.h ++++ b/src/wayland/meta-wayland.h +@@ -87,6 +87,10 @@ META_EXPORT_TEST + void meta_wayland_compositor_schedule_surface_association (MetaWaylandCompositor *compositor, + int id, + MetaWindow *window); ++ ++gboolean meta_wayland_compositor_handle_text_input_event (MetaWaylandCompositor *compositor, ++ const ClutterEvent *event); ++ + META_EXPORT_TEST + void meta_wayland_compositor_notify_surface_id (MetaWaylandCompositor *compositor, + int id, +-- +2.40.1 + diff --git a/SOURCES/0001-renderer-native-Queue-fail-safe-callbacks-when-mode-.patch b/SOURCES/0001-renderer-native-Queue-fail-safe-callbacks-when-mode-.patch new file mode 100644 index 0000000..ce822fb --- /dev/null +++ b/SOURCES/0001-renderer-native-Queue-fail-safe-callbacks-when-mode-.patch @@ -0,0 +1,172 @@ +From 66e2e438b8796351a72bfec2024ee41bbde77780 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Thu, 6 Apr 2023 18:40:41 +0200 +Subject: [PATCH] renderer-native: Queue fail safe callbacks when mode set + failed + +This allows to recover, e.g. Ctrl-Alt-F# and using any other monitor +that managed to turn on. +--- + src/backends/native/meta-crtc-kms.c | 19 ++++++++++ + src/backends/native/meta-crtc-kms.h | 5 +++ + src/backends/native/meta-gpu-kms.c | 10 +++++ + src/backends/native/meta-renderer-native.c | 43 ++++++++++++++++++++++ + 4 files changed, 77 insertions(+) + +diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c +index 8374376d5..44f271eb5 100644 +--- a/src/backends/native/meta-crtc-kms.c ++++ b/src/backends/native/meta-crtc-kms.c +@@ -52,6 +52,8 @@ typedef struct _MetaCrtcKms + * value: owned GArray* (uint64_t modifier), or NULL + */ + GHashTable *formats_modifiers; ++ ++ gboolean is_active; + } MetaCrtcKms; + + /** +@@ -540,3 +542,20 @@ meta_create_kms_crtc (MetaGpuKms *gpu_kms, + + return crtc; + } ++ ++void ++meta_crtc_kms_set_active (MetaCrtc *crtc, ++ gboolean is_active) ++{ ++ MetaCrtcKms *crtc_kms = crtc->driver_private; ++ ++ crtc_kms->is_active = is_active; ++} ++ ++gboolean ++meta_crtc_kms_is_active (MetaCrtc *crtc) ++{ ++ MetaCrtcKms *crtc_kms = crtc->driver_private; ++ ++ return crtc_kms->is_active; ++} +diff --git a/src/backends/native/meta-crtc-kms.h b/src/backends/native/meta-crtc-kms.h +index 456f4400a..666aebcaf 100644 +--- a/src/backends/native/meta-crtc-kms.h ++++ b/src/backends/native/meta-crtc-kms.h +@@ -58,4 +58,9 @@ MetaCrtc * meta_create_kms_crtc (MetaGpuKms *gpu_kms, + drmModeCrtc *drm_crtc, + unsigned int crtc_index); + ++void meta_crtc_kms_set_active (MetaCrtc *crtc, ++ gboolean is_active); ++ ++gboolean meta_crtc_kms_is_active (MetaCrtc *crtc); ++ + #endif /* META_CRTC_KMS_H */ +diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c +index dc93abb7b..5f7a48730 100644 +--- a/src/backends/native/meta-gpu-kms.c ++++ b/src/backends/native/meta-gpu-kms.c +@@ -169,9 +169,12 @@ meta_gpu_kms_apply_crtc_mode (MetaGpuKms *gpu_kms, + else + g_warning ("Failed to disable CRTC"); + g_free (connectors); ++ meta_crtc_kms_set_active (crtc, FALSE); + return FALSE; + } + ++ meta_crtc_kms_set_active (crtc, !!mode); ++ + g_free (connectors); + + return TRUE; +@@ -278,6 +281,13 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms, + g_assert (meta_monitor_manager_get_power_save_mode (monitor_manager) == + META_POWER_SAVE_ON); + ++ if (!meta_crtc_kms_is_active (crtc)) ++ { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, ++ "CRTC is not active"); ++ return FALSE; ++ } ++ + get_crtc_drm_connectors (gpu, crtc, &connectors, &n_connectors); + g_assert (n_connectors > 0); + g_free (connectors); +diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c +index 62ca4bcbd..76e311508 100644 +--- a/src/backends/native/meta-renderer-native.c ++++ b/src/backends/native/meta-renderer-native.c +@@ -217,6 +217,9 @@ struct _MetaRendererNative + + GList *power_save_page_flip_closures; + guint power_save_page_flip_source_id; ++ ++ GList *fail_safe_page_flip_closures; ++ guint fail_safe_page_flip_source_id; + }; + + static void +@@ -2048,6 +2051,34 @@ flip_crtc (MetaLogicalMonitor *logical_monitor, + } + } + ++static gboolean ++fail_safe_page_flip_cb (gpointer user_data) ++{ ++ MetaRendererNative *renderer_native = user_data; ++ ++ g_list_free_full (renderer_native->fail_safe_page_flip_closures, ++ (GDestroyNotify) g_closure_unref); ++ renderer_native->fail_safe_page_flip_closures = NULL; ++ renderer_native->fail_safe_page_flip_source_id = 0; ++ ++ return G_SOURCE_REMOVE; ++} ++ ++static void ++queue_fail_safe_page_flip (MetaRendererNative *renderer_native, ++ GClosure *flip_closure) ++{ ++ if (!renderer_native->fail_safe_page_flip_source_id) ++ { ++ renderer_native->fail_safe_page_flip_source_id = ++ g_idle_add (fail_safe_page_flip_cb, renderer_native); ++ } ++ ++ renderer_native->fail_safe_page_flip_closures = ++ g_list_prepend (renderer_native->fail_safe_page_flip_closures, ++ g_closure_ref (flip_closure)); ++} ++ + static void + meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen) + { +@@ -2093,6 +2124,11 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen) + */ + if (!data.did_flip && data.did_mode_set) + meta_onscreen_native_swap_drm_fb (onscreen); ++ else if (!data.did_flip) ++ { ++ meta_onscreen_native_swap_drm_fb (onscreen); ++ queue_fail_safe_page_flip (renderer_native, flip_closure); ++ } + } + else + { +@@ -4549,6 +4585,13 @@ meta_renderer_native_finalize (GObject *object) + g_source_remove (renderer_native->power_save_page_flip_source_id); + } + ++ if (renderer_native->fail_safe_page_flip_closures) ++ { ++ g_list_free_full (renderer_native->fail_safe_page_flip_closures, ++ (GDestroyNotify) g_closure_unref); ++ g_source_remove (renderer_native->fail_safe_page_flip_source_id); ++ } ++ + g_hash_table_destroy (renderer_native->gpu_datas); + g_clear_object (&renderer_native->gles3); + +-- +2.39.2 + diff --git a/SPECS/mutter.spec b/SPECS/mutter.spec index 0d4491e..dc9bc63 100644 --- a/SPECS/mutter.spec +++ b/SPECS/mutter.spec @@ -8,7 +8,7 @@ Name: mutter Version: 3.32.2 -Release: 68%{?dist} +Release: 71%{?dist} Summary: Window and compositing manager based on Clutter License: GPLv2+ @@ -210,6 +210,11 @@ Patch529: 0001-workspace-Downgrade-assert-to-warning-when-adding-wi.patch # Don't add common modes if panel already has (#2125031) Patch530: 0001-output-kms-Add-more-heuristics-to-decide-when-to-off.patch +# Queue fail safe page flip callbacks (#2172057) +Patch531: 0001-renderer-native-Queue-fail-safe-callbacks-when-mode-.patch + +Patch532: 0001-core-Change-MetaWaylandTextInput-event-forwarding-to.patch + BuildRequires: chrpath BuildRequires: pango-devel BuildRequires: startup-notification-devel @@ -351,6 +356,14 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop %{_datadir}/mutter-%{mutter_api_version}/tests %changelog +* Thu Aug 17 2023 Carlos Garnacho - 3.32.2-71 +- Fix ordering of keyboard modifiers relative to other keyboard events + Resolves: #2170830 + +* Thu Apr 06 2023 Jonas Ã…dahl ) - 3.32.2-69 +- Queue fail safe page flip callbacks + Resolves: #2172057 + * Wed Dec 21 2022 Olivier Fourdan - 3.32.2-68 - Fix downstream synaptics patches breaking xdmcp Resolves: #2092450