File mutter-fix-pointer-recording.patch of Package mutter

From ceeae75c0821a284d800cdbee92490f38258842b Mon Sep 17 00:00:00 2001
From: Joan Torres <joan.torres@suse.com>
Date: Tue, 25 Feb 2025 10:02:05 +0100
Subject: [PATCH 1/2] seat/x11: Update properly has_pointer_focus

1. On grab/ungrab, enter/leave events are not handled, so
   has_pointer_focus is not updated.
   When the pointer from overview goes directly to a client,
   it was considered still on the stage, not emulating a pointer motion.

2. When the pointer is on the background (guard window), it needs to
   inform enter/leave events to properly update the has_pointer_focus.
   Otherwise an emulated pointer motion event would be created
   duplicating the real motion event.
---
 src/backends/x11/meta-seat-x11.c | 4 ++++
 src/x11/meta-x11-display.c       | 2 ++
 2 files changed, 6 insertions(+)

diff --git a/src/backends/x11/meta-seat-x11.c b/src/backends/x11/meta-seat-x11.c
index 5532458e1b..c5be98f7e9 100644
--- a/src/backends/x11/meta-seat-x11.c
+++ b/src/backends/x11/meta-seat-x11.c
@@ -1847,6 +1847,8 @@ meta_seat_x11_grab (ClutterSeat *seat,

   seat_x11->grab_state = state;

+  seat_x11->has_pointer_focus = TRUE;
+
   return state;
 }

@@ -1871,6 +1873,8 @@ meta_seat_x11_ungrab (ClutterSeat *seat,
                                   time);
     }

+  seat_x11->has_pointer_focus = FALSE;
+
   seat_x11->grab_state = CLUTTER_GRAB_STATE_NONE;
 }

diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c
index 0b372e3dfa..425b27e28e 100644
--- a/src/x11/meta-x11-display.c
+++ b/src/x11/meta-x11-display.c
@@ -1818,6 +1818,8 @@ create_guard_window (MetaX11Display *x11_display)
         XISetMask (mask.mask, XI_ButtonPress);
         XISetMask (mask.mask, XI_ButtonRelease);
         XISetMask (mask.mask, XI_Motion);
+        XISetMask (mask.mask, XI_Enter);
+        XISetMask (mask.mask, XI_Leave);

         /* Sync on the connection we created the window on to
          * make sure it's created before we select on it on the
2.48.1


From 1554cf4a4097b2d36cbe9ca7314326640a488bd2 Mon Sep 17 00:00:00 2001
From: Joan Torres <joan.torres@suse.com>
Date: Wed, 19 Feb 2025 13:20:22 +0100
Subject: [PATCH 2/2] cursor-renderer: Split update cursor_renderer position
 and cursor

cursor_render is only updated on Wayland backend, because on
X11 backend some issues appear.

This made the cursor on X11 screen recording appear on the same position,
although its shapes are updated.

To fix this, update only the cursor_render position on X11 backend and
on wayland backend update the cursor too.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3182
---
 src/backends/meta-backend.c         |  4 +++-
 src/backends/meta-cursor-renderer.c | 19 +++++++++++++------
 src/backends/meta-cursor-renderer.h | 11 ++++++++++-
 src/core/events.c                   | 19 ++++++++++++-------
 4 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 27f837e573..4146c08ad2 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -294,7 +294,9 @@ init_pointer_position (MetaBackend *backend)
                                       primary->rect.y + primary->rect.height * 0.9);

   cursor_renderer = meta_backend_get_cursor_renderer (backend);
-  meta_cursor_renderer_update_position (cursor_renderer);
+  meta_cursor_renderer_update (cursor_renderer,
+                               META_CURSOR_RENDERER_UPDATE_FLAG_POSITION |
+                               META_CURSOR_RENDERER_UPDATE_FLAG_CURSOR);
 }

 static gboolean
diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
index ff9da04023..f5550fb60f 100644
--- a/src/backends/meta-cursor-renderer.c
+++ b/src/backends/meta-cursor-renderer.c
@@ -461,17 +461,24 @@ meta_cursor_renderer_force_update (MetaCursorRenderer *renderer)
 }

 void
-meta_cursor_renderer_update_position (MetaCursorRenderer *renderer)
+meta_cursor_renderer_update (MetaCursorRenderer            *renderer,
+                             MetaCursorRendererUpdateFlags  flags)
 {
   MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
   graphene_point_t pos;

-  clutter_seat_query_state (clutter_input_device_get_seat (priv->device),
-                            priv->device, NULL, &pos, NULL);
-  priv->current_x = pos.x;
-  priv->current_y = pos.y;
+  if (flags & META_CURSOR_RENDERER_UPDATE_FLAG_POSITION)
+    {
+      clutter_seat_query_state (clutter_input_device_get_seat (priv->device),
+                                priv->device, NULL, &pos, NULL);
+      priv->current_x = pos.x;
+      priv->current_y = pos.y;
+    }

-  meta_cursor_renderer_update_cursor (renderer, priv->displayed_cursor);
+  if (flags & META_CURSOR_RENDERER_UPDATE_FLAG_CURSOR)
+    {
+      meta_cursor_renderer_update_cursor (renderer, priv->displayed_cursor);
+    }
 }

 MetaCursorSprite *
diff --git a/src/backends/meta-cursor-renderer.h b/src/backends/meta-cursor-renderer.h
index b76f1b2798..0df0cd5db5 100644
--- a/src/backends/meta-cursor-renderer.h
+++ b/src/backends/meta-cursor-renderer.h
@@ -28,6 +28,13 @@
 #include "backends/meta-cursor.h"
 #include "core/util-private.h"

+typedef enum _MetaCursorRendererUpdateFlags
+{
+  META_CURSOR_RENDERER_UPDATE_FLAG_NONE = 0,
+  META_CURSOR_RENDERER_UPDATE_FLAG_POSITION = 1 << 0,
+  META_CURSOR_RENDERER_UPDATE_FLAG_CURSOR = 1 << 1,
+} MetaCursorRendererUpdateFlags;
+
 #define META_TYPE_HW_CURSOR_INHIBITOR (meta_hw_cursor_inhibitor_get_type ())
 G_DECLARE_INTERFACE (MetaHwCursorInhibitor, meta_hw_cursor_inhibitor,
                      META, HW_CURSOR_INHIBITOR, GObject)
@@ -59,7 +66,9 @@ MetaCursorRenderer * meta_cursor_renderer_new (MetaBackend        *backend,
 void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
                                       MetaCursorSprite   *cursor_sprite);

-void meta_cursor_renderer_update_position (MetaCursorRenderer *renderer);
+void meta_cursor_renderer_update (MetaCursorRenderer            *renderer,
+                                  MetaCursorRendererUpdateFlags  flags);
+
 void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);

 META_EXPORT_TEST
diff --git a/src/core/events.c b/src/core/events.c
index 9adaa18011..eb0fd80b6f 100644
--- a/src/core/events.c
+++ b/src/core/events.c
@@ -346,19 +346,25 @@ meta_display_handle_event (MetaDisplay        *display,
   if (event_type == CLUTTER_MOTION)
     {
       ClutterInputDevice *device;
+      MetaCursorRenderer *cursor_renderer;

       device = clutter_event_get_device (event);
+      cursor_renderer =
+        meta_backend_get_cursor_renderer_for_device (backend, device);

-#ifdef HAVE_WAYLAND
-      if (wayland_compositor)
+      if (cursor_renderer)
         {
-          MetaCursorRenderer *cursor_renderer =
-            meta_backend_get_cursor_renderer_for_device (backend, device);
+          MetaCursorRendererUpdateFlags flags =
+            META_CURSOR_RENDERER_UPDATE_FLAG_POSITION;
+
+#ifdef HAVE_WAYLAND
+          if (wayland_compositor)
+                flags |= META_CURSOR_RENDERER_UPDATE_FLAG_CURSOR;
+ #endif

           if (cursor_renderer)
-            meta_cursor_renderer_update_position (cursor_renderer);
+            meta_cursor_renderer_update (cursor_renderer, flags);
         }
-#endif

       if (device == clutter_seat_get_pointer (clutter_input_device_get_seat (device)))
         {
2.48.1

openSUSE Build Service is sponsored by