diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2021-07-05 16:19:05 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2021-08-27 13:58:25 +0200 |
commit | 6d02102c4f4cde8b13b310226f7f8bde8ab3b612 (patch) | |
tree | 475ab35e2d23cfc81a9b3befe07fb4610d0d860a | |
parent | 3d2dcb9dfebf05e90e31358c2a14ea8b30f93283 (diff) | |
download | mutter-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.c | 21 | ||||
-rw-r--r-- | src/backends/meta-cursor.h | 10 | ||||
-rw-r--r-- | src/core/display.c | 8 | ||||
-rw-r--r-- | src/wayland/meta-wayland-cursor-surface.c | 16 | ||||
-rw-r--r-- | src/wayland/meta-wayland-tablet-tool.c | 9 | ||||
-rw-r--r-- | src/wayland/meta-wayland-tablet-tool.h | 1 |
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; |