import CS mutter-3.32.2-71.el8
This commit is contained in:
		
							parent
							
								
									5e6e8f52c9
								
							
						
					
					
						commit
						6b00a085e3
					
				| @ -0,0 +1,163 @@ | ||||
| From bfd49687aa862a7e69d0d7fe76f803ae180d40c2 Mon Sep 17 00:00:00 2001 | ||||
| From: Carlos Garnacho <carlosg@gnome.org> | ||||
| 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 | ||||
| 
 | ||||
| @ -0,0 +1,172 @@ | ||||
| From 66e2e438b8796351a72bfec2024ee41bbde77780 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com> | ||||
| 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 | ||||
| 
 | ||||
| @ -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 <cgarnach@redhat.com> - 3.32.2-71 | ||||
| - Fix ordering of keyboard modifiers relative to other keyboard events | ||||
|   Resolves: #2170830 | ||||
| 
 | ||||
| * Thu Apr 06 2023 Jonas Ådahl <jadahl@redhat.com>) - 3.32.2-69 | ||||
| - Queue fail safe page flip callbacks | ||||
|   Resolves: #2172057 | ||||
| 
 | ||||
| * Wed Dec 21 2022 Olivier Fourdan <ofourdan@redhat.com> - 3.32.2-68 | ||||
| - Fix downstream synaptics patches breaking xdmcp | ||||
|   Resolves: #2092450 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user