summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-07-05 16:19:05 +0200
committerCarlos Garnacho <carlosg@gnome.org>2021-08-27 13:58:25 +0200
commit6d02102c4f4cde8b13b310226f7f8bde8ab3b612 (patch)
tree475ab35e2d23cfc81a9b3befe07fb4610d0d860a
parent3d2dcb9dfebf05e90e31358c2a14ea8b30f93283 (diff)
downloadmutter-6d02102c4f4cde8b13b310226f7f8bde8ab3b612.tar.gz
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.
-rw-r--r--src/backends/meta-cursor.c21
-rw-r--r--src/backends/meta-cursor.h10
-rw-r--r--src/core/display.c8
-rw-r--r--src/wayland/meta-wayland-cursor-surface.c16
-rw-r--r--src/wayland/meta-wayland-tablet-tool.c9
-rw-r--r--src/wayland/meta-wayland-tablet-tool.h1
6 files changed, 48 insertions, 17 deletions
diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c
index a0abd9cd6..539d037fe 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,
@@ -188,12 +191,28 @@ meta_cursor_sprite_get_texture_transform (MetaCursorSprite *sprite)
}
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);
+
+ if (priv->prepare_func)
+ 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 214394dd4..1bf63f107 100644
--- a/src/backends/meta-cursor.h
+++ b/src/backends/meta-cursor.h
@@ -43,6 +43,16 @@ struct _MetaCursorSpriteClass
unsigned int (* get_current_frame_time) (MetaCursorSprite *sprite);
};
+typedef void (* MetaCursorPrepareFunc) (MetaCursorSprite *sprite,
+ float 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 5d4a4da21..969988af4 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -1692,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 d1f521818..f4b288812 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 a8de868bc..8455affec 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 e9ad7db40..9fc704851 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;