From f787480fda40cd3cf80c84ffa82223c23416c0dc Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Mon, 24 Mar 2025 15:11:16 +0100 Subject: [PATCH] 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: --- src/backends/meta-cursor-sprite-xcursor.c | 15 +++++++++++ src/backends/meta-cursor-tracker.c | 31 +++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/backends/meta-cursor-sprite-xcursor.c b/src/backends/meta-cursor-sprite-xcursor.c index 7e6283e6c..ae5c8ca0c 100644 --- a/src/backends/meta-cursor-sprite-xcursor.c +++ b/src/backends/meta-cursor-sprite-xcursor.c @@ -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; } diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c index a983a11f0..a67fc873f 100644 --- a/src/backends/meta-cursor-tracker.c +++ b/src/backends/meta-cursor-tracker.c @@ -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