diff --unified --recursive --text --new-file --color mutter-45.3/src/backends/meta-backend.c mutter-45.3.new/src/backends/meta-backend.c
--- mutter-45.3/src/backends/meta-backend.c	2024-01-07 07:34:55.000000000 +0800
+++ mutter-45.3.new/src/backends/meta-backend.c	2025-05-07 12:37:40.048826880 +0800
@@ -294,7 +294,9 @@
                                       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 --unified --recursive --text --new-file --color mutter-45.3/src/backends/meta-cursor-renderer.c mutter-45.3.new/src/backends/meta-cursor-renderer.c
--- mutter-45.3/src/backends/meta-cursor-renderer.c	2024-01-07 07:34:55.000000000 +0800
+++ mutter-45.3.new/src/backends/meta-cursor-renderer.c	2025-05-07 12:37:40.049075034 +0800
@@ -461,17 +461,24 @@
 }
 
 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 --unified --recursive --text --new-file --color mutter-45.3/src/backends/meta-cursor-renderer.h mutter-45.3.new/src/backends/meta-cursor-renderer.h
--- mutter-45.3/src/backends/meta-cursor-renderer.h	2024-01-07 07:34:55.000000000 +0800
+++ mutter-45.3.new/src/backends/meta-cursor-renderer.h	2025-05-07 12:37:40.049194760 +0800
@@ -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 @@
 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 --unified --recursive --text --new-file --color mutter-45.3/src/backends/x11/meta-seat-x11.c mutter-45.3.new/src/backends/x11/meta-seat-x11.c
--- mutter-45.3/src/backends/x11/meta-seat-x11.c	2024-01-07 07:34:55.000000000 +0800
+++ mutter-45.3.new/src/backends/x11/meta-seat-x11.c	2025-05-07 12:37:40.048039688 +0800
@@ -1847,6 +1847,8 @@
 
   seat_x11->grab_state = state;
 
+  seat_x11->has_pointer_focus = TRUE;
+
   return state;
 }
 
@@ -1871,6 +1873,8 @@
                                   time);
     }
 
+  seat_x11->has_pointer_focus = FALSE;
+
   seat_x11->grab_state = CLUTTER_GRAB_STATE_NONE;
 }
 
diff --unified --recursive --text --new-file --color mutter-45.3/src/core/events.c mutter-45.3.new/src/core/events.c
--- mutter-45.3/src/core/events.c	2024-01-07 07:34:55.000000000 +0800
+++ mutter-45.3.new/src/core/events.c	2025-05-07 12:37:40.049403281 +0800
@@ -346,19 +346,25 @@
   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)))
         {
