[mutter/wip/carlosg/unthrottled-wayland: 177/180] backends: Replace MetaCursorSprite::prepare-at with in-place function




commit c6ffbdc8459dc788afdd1e5269afaee931df2db1
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Jul 5 16:19:05 2021 +0200

    backends: Replace MetaCursorSprite::prepare-at with in-place function
    
    Since this signal is in a hot path during input handling, it makes sense
    not to have this be a signal at all, currently most of the time spent in
    it is in GLib signal machinery itself.
    
    Replace it with a function/user data pair that are set on the sprite
    itself. Only the places that create an sprite are interested in hooking
    one ::prepare-at behavior per sprite, so we can do with a single pair.
    
    This makes meta_cursor_sprite_prepare_at() inexpensive enough.

 src/backends/meta-cursor.c                | 20 +++++++++++++++++++-
 src/backends/meta-cursor.h                | 10 ++++++++++
 src/core/display.c                        | 11 ++++-------
 src/wayland/meta-wayland-cursor-surface.c | 16 ++++++++++------
 src/wayland/meta-wayland-tablet-tool.c    |  9 +++++----
 src/wayland/meta-wayland-tablet-tool.h    |  1 -
 6 files changed, 48 insertions(+), 19 deletions(-)
---
diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c
index 6cdd46e1e9..f26f7e169d 100644
--- a/src/backends/meta-cursor.c
+++ b/src/backends/meta-cursor.c
@@ -45,6 +45,9 @@ typedef struct _MetaCursorSpritePrivate
   float texture_scale;
   MetaMonitorTransform texture_transform;
   int hot_x, hot_y;
+
+  MetaCursorPrepareFunc prepare_func;
+  gpointer prepare_func_data;
 } MetaCursorSpritePrivate;
 
 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaCursorSprite,
@@ -178,13 +181,28 @@ meta_cursor_sprite_get_texture_transform (MetaCursorSprite *sprite)
   return priv->texture_transform;
 }
 
+void
+meta_cursor_sprite_set_prepare_func (MetaCursorSprite      *sprite,
+                                     MetaCursorPrepareFunc  func,
+                                     gpointer               user_data)
+{
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  priv->prepare_func = func;
+  priv->prepare_func_data = user_data;
+}
+
 void
 meta_cursor_sprite_prepare_at (MetaCursorSprite   *sprite,
                                float               best_scale,
                                int                 x,
                                int                 y)
 {
-  g_signal_emit (sprite, signals[PREPARE_AT], 0, best_scale, x, y);
+  MetaCursorSpritePrivate *priv =
+    meta_cursor_sprite_get_instance_private (sprite);
+
+  priv->prepare_func (sprite, best_scale, x, y, priv->prepare_func_data);
 }
 
 gboolean
diff --git a/src/backends/meta-cursor.h b/src/backends/meta-cursor.h
index e62f3c8057..7bd4cf5770 100644
--- a/src/backends/meta-cursor.h
+++ b/src/backends/meta-cursor.h
@@ -42,6 +42,16 @@ struct _MetaCursorSpriteClass
   unsigned int (* get_current_frame_time) (MetaCursorSprite *sprite);
 };
 
+typedef void (* MetaCursorPrepareFunc) (MetaCursorSprite *sprite,
+                                        double            scale,
+                                        int               x,
+                                        int               y,
+                                        gpointer          user_data);
+
+void meta_cursor_sprite_set_prepare_func (MetaCursorSprite      *sprite,
+                                          MetaCursorPrepareFunc  func,
+                                          gpointer               user_data);
+
 void meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
                                     float             best_scale,
                                     int               x,
diff --git a/src/core/display.c b/src/core/display.c
index 54fdc76d35..969988af4d 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -1651,11 +1651,10 @@ root_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
                         float                    best_scale,
                         int                      x,
                         int                      y,
-                        gpointer                 user_data)
+                        MetaDisplay             *display)
 {
   MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_xcursor);
   MetaBackend *backend = meta_get_backend ();
-  MetaDisplay *display = user_data;
 
   if (meta_is_stage_views_scaled ())
     {
@@ -1693,11 +1692,9 @@ static void
 manage_root_cursor_sprite_scale (MetaDisplay             *display,
                                  MetaCursorSpriteXcursor *sprite_xcursor)
 {
-  g_signal_connect_object (sprite_xcursor,
-                           "prepare-at",
-                           G_CALLBACK (root_cursor_prepare_at),
-                           display,
-                           0);
+  meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (sprite_xcursor),
+                                       (MetaCursorPrepareFunc) root_cursor_prepare_at,
+                                       display);
 }
 
 void
diff --git a/src/wayland/meta-wayland-cursor-surface.c b/src/wayland/meta-wayland-cursor-surface.c
index d1f521818a..f4b2888125 100644
--- a/src/wayland/meta-wayland-cursor-surface.c
+++ b/src/wayland/meta-wayland-cursor-surface.c
@@ -223,7 +223,13 @@ meta_wayland_cursor_surface_dispose (GObject *object)
                                         cursor_sprite_prepare_at, cursor_surface);
 
   g_clear_object (&priv->cursor_renderer);
-  g_clear_object (&priv->cursor_sprite);
+
+  if (priv->cursor_sprite)
+    {
+      meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (priv->cursor_sprite),
+                                           NULL, NULL);
+      g_clear_object (&priv->cursor_sprite);
+    }
 
   if (priv->buffer)
     {
@@ -258,11 +264,9 @@ meta_wayland_cursor_surface_constructed (GObject *object)
     }
 
   priv->cursor_sprite = meta_cursor_sprite_wayland_new (surface);
-  g_signal_connect_object (priv->cursor_sprite,
-                           "prepare-at",
-                           G_CALLBACK (cursor_sprite_prepare_at),
-                           cursor_surface,
-                           0);
+  meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (priv->cursor_sprite),
+                                       (MetaCursorPrepareFunc) cursor_sprite_prepare_at,
+                                       cursor_surface);
 }
 
 static void
diff --git a/src/wayland/meta-wayland-tablet-tool.c b/src/wayland/meta-wayland-tablet-tool.c
index a8de868bc5..8455affec1 100644
--- a/src/wayland/meta-wayland-tablet-tool.c
+++ b/src/wayland/meta-wayland-tablet-tool.c
@@ -398,9 +398,9 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat  *seat,
   tool->cursor_surface_destroy_listener.notify = tablet_tool_handle_cursor_surface_destroy;
 
   tool->default_sprite = meta_cursor_sprite_xcursor_new (META_CURSOR_CROSSHAIR);
-  tool->prepare_at_signal_id =
-    g_signal_connect (tool->default_sprite, "prepare-at",
-                      G_CALLBACK (tool_cursor_prepare_at), tool);
+  meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (tool->default_sprite),
+                                       (MetaCursorPrepareFunc) tool_cursor_prepare_at,
+                                       tool);
 
   return tool;
 }
@@ -421,7 +421,8 @@ meta_wayland_tablet_tool_free (MetaWaylandTabletTool *tool)
       wl_list_init (wl_resource_get_link (resource));
     }
 
-  g_clear_signal_handler (&tool->prepare_at_signal_id, tool->default_sprite);
+  meta_cursor_sprite_set_prepare_func (META_CURSOR_SPRITE (tool->default_sprite),
+                                       NULL, NULL);
   g_object_unref (tool->default_sprite);
 
   g_free (tool);
diff --git a/src/wayland/meta-wayland-tablet-tool.h b/src/wayland/meta-wayland-tablet-tool.h
index e9ad7db40c..9fc7048519 100644
--- a/src/wayland/meta-wayland-tablet-tool.h
+++ b/src/wayland/meta-wayland-tablet-tool.h
@@ -44,7 +44,6 @@ struct _MetaWaylandTabletTool
   struct wl_listener cursor_surface_destroy_listener;
   MetaCursorRenderer *cursor_renderer;
   MetaCursorSpriteXcursor *default_sprite;
-  gulong prepare_at_signal_id;
 
   MetaWaylandSurface *current;
   guint32 pressed_buttons;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]