backends/cursor: Propagate cursor theme and size pref changes

This means the cursor will immediately respond to preference changes and
make the right cursor visible.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4359>
This commit is contained in:
Sebastian Wick 2025-03-24 15:11:16 +01:00 committed by Bruce Leidl
parent facc5e9563
commit f787480fda
2 changed files with 46 additions and 0 deletions

View File

@ -547,6 +547,16 @@ ensure_xcursor_color_state (MetaCursorTracker *cursor_tracker)
return color_state;
}
static void
on_prefs_changed (MetaCursorSprite *cursor,
gpointer user_data)
{
MetaCursorSpriteXcursor *sprite_xcursor =
META_CURSOR_SPRITE_XCURSOR (user_data);
sprite_xcursor->theme_dirty = TRUE;
}
MetaCursorSpriteXcursor *
meta_cursor_sprite_xcursor_new (MetaCursor cursor,
MetaCursorTracker *cursor_tracker)
@ -562,6 +572,11 @@ meta_cursor_sprite_xcursor_new (MetaCursor cursor,
NULL);
sprite_xcursor->cursor = cursor;
g_signal_connect_object (cursor_tracker, "cursor-prefs-changed",
G_CALLBACK (on_prefs_changed),
sprite_xcursor,
G_CONNECT_DEFAULT);
return sprite_xcursor;
}

View File

@ -86,6 +86,7 @@ enum
CURSOR_CHANGED,
POSITION_INVALIDATED,
VISIBILITY_CHANGED,
CURSOR_PREFS_CHANGED,
LAST_SIGNAL
};
@ -193,6 +194,17 @@ meta_cursor_tracker_real_get_sprite (MetaCursorTracker *tracker)
return priv->displayed_cursor;
}
static void
on_prefs_changed (MetaPreference pref,
gpointer user_data)
{
MetaCursorTracker *tracker = META_CURSOR_TRACKER (user_data);
if (pref == META_PREF_CURSOR_SIZE ||
pref == META_PREF_CURSOR_THEME)
g_signal_emit (tracker, signals[CURSOR_PREFS_CHANGED], 0);
}
void
meta_cursor_tracker_destroy (MetaCursorTracker *tracker)
{
@ -209,6 +221,8 @@ meta_cursor_tracker_init (MetaCursorTracker *tracker)
priv->is_showing = FALSE;
priv->x = -1.0;
priv->y = -1.0;
meta_prefs_add_listener (on_prefs_changed, tracker);
}
static void
@ -268,6 +282,16 @@ meta_cursor_tracker_dispose (GObject *object)
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->dispose (object);
}
static void
meta_cursor_tracker_finalize (GObject *object)
{
MetaCursorTracker *tracker = META_CURSOR_TRACKER (object);
meta_prefs_remove_listener (on_prefs_changed, tracker);
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
}
static void
meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
{
@ -276,6 +300,7 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
object_class->get_property = meta_cursor_tracker_get_property;
object_class->set_property = meta_cursor_tracker_set_property;
object_class->dispose = meta_cursor_tracker_dispose;
object_class->finalize = meta_cursor_tracker_finalize;
klass->set_force_track_position =
meta_cursor_tracker_real_set_force_track_position;
@ -309,6 +334,12 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[CURSOR_PREFS_CHANGED] = g_signal_new ("cursor-prefs-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL,
G_TYPE_NONE, 0);
}
static void