From 8b939b237eb993a3329426c5ccc9d408b2873b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Sat, 3 Nov 2012 18:41:38 +0100 Subject: [PATCH 4/5] XfceXSettingsHelper gets a property "cursor-hide" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This property set overrides overrides cursor theme to "xfce-invisible". Signed-off-by: Andreas Müller --- xfsettingsd/xsettings.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 114 insertions(+), 1 deletions(-) diff --git a/xfsettingsd/xsettings.c b/xfsettingsd/xsettings.c index 7657465..a6278df 100644 --- a/xfsettingsd/xsettings.c +++ b/xfsettingsd/xsettings.c @@ -73,6 +73,15 @@ typedef struct _XfceXSettingsNotify XfceXSettingsNotify; +/* Property identifiers */ +enum +{ + PROP_0, + PROP_CURSOR_HIDE, +}; + + + static void xfce_xsettings_helper_finalize (GObject *object); static void xfce_xsettings_helper_fc_free (XfceXSettingsHelper *helper); static gboolean xfce_xsettings_helper_fc_init (gpointer data); @@ -86,6 +95,10 @@ static void xfce_xsettings_helper_load (XfceXSettingsHelper *helper) static void xfce_xsettings_helper_screen_free (XfceXSettingsScreen *screen); static void xfce_xsettings_helper_notify_xft (XfceXSettingsHelper *helper); static void xfce_xsettings_helper_notify (XfceXSettingsHelper *helper); +static void xfce_xsettings_helper_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); @@ -120,6 +133,13 @@ struct _XfceXSettingsHelper GPtrArray *fc_monitors; guint fc_notify_timeout_id; guint fc_init_id; + + /* keeper for invisible cursor theme / last set */ + GValue *invisib_cursor_value; + GValue *lastset_cursor_value; + + /* properties */ + gboolean cursor_hide; }; struct _XfceXSetting @@ -157,6 +177,16 @@ xfce_xsettings_helper_class_init (XfceXSettingsHelperClass *klass) gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = xfce_xsettings_helper_finalize; + gobject_class->set_property = xfce_xsettings_helper_set_property; + + g_object_class_install_property (gobject_class, + PROP_CURSOR_HIDE, + g_param_spec_boolean ("cursor-hide", + "cursor-hide", + "cursor-hide", + FALSE, + G_PARAM_WRITABLE | + G_PARAM_STATIC_STRINGS)); } @@ -169,6 +199,14 @@ xfce_xsettings_helper_init (XfceXSettingsHelper *helper) helper->settings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, xfce_xsettings_helper_setting_free); + helper->lastset_cursor_value = g_new0 (GValue, 1); + g_value_init(helper->lastset_cursor_value, G_TYPE_STRING); + g_value_set_string (helper->lastset_cursor_value, "default"); + + helper->invisib_cursor_value = g_new0 (GValue, 1); + g_value_init(helper->invisib_cursor_value, G_TYPE_STRING); + g_value_set_string (helper->invisib_cursor_value, "xfce-invisible"); + xfce_xsettings_helper_load (helper); g_signal_connect (G_OBJECT (helper->channel), "property-changed", @@ -202,6 +240,9 @@ xfce_xsettings_helper_finalize (GObject *object) g_hash_table_destroy (helper->settings); + g_free (helper->lastset_cursor_value); + g_free (helper->invisib_cursor_value); + (*G_OBJECT_CLASS (xfce_xsettings_helper_parent_class)->finalize) (object); } @@ -387,6 +428,53 @@ xfce_xsettings_helper_notify_xft_idle (gpointer data) +static void +xfce_xsettings_helper_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + gboolean hide; + XfceXSetting *setting; + XfceXSettingsHelper *helper = XFCE_XSETTINGS_HELPER (object); + + switch (prop_id) + { + case PROP_CURSOR_HIDE: + hide = g_value_get_boolean (value); + if (helper->cursor_hide != hide) + { + helper->cursor_hide = hide; + setting = g_hash_table_lookup (helper->settings, "/Gtk/CursorThemeName"); + if (G_LIKELY (setting != NULL)) + { + /* update the serial */ + setting->last_change_serial = helper->serial; + /* update value */ + g_value_reset (setting->value); + g_value_copy (hide ? + helper->invisib_cursor_value : + helper->lastset_cursor_value, + setting->value); + + /* schedule xsettings update */ + if (helper->notify_idle_id == 0) + helper->notify_idle_id = g_idle_add (xfce_xsettings_helper_notify_idle, helper); + if (helper->notify_xft_idle_id == 0) + helper->notify_xft_idle_id = g_idle_add (xfce_xsettings_helper_notify_xft_idle, helper); + } + else + g_critical("Setting not found for /Gtk/CursorThemeName"); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + + static gboolean xfce_xsettings_helper_prop_valid (const gchar *prop_name, const GValue *value) @@ -413,6 +501,28 @@ xfce_xsettings_helper_prop_valid (const gchar *prop_name, +static void +xfce_xsettings_helper_check_cursor (const gchar *prop_name, + GValue *value, + XfceXSettingsHelper *helper) +{ + if (g_strcmp0 (prop_name, "/Gtk/CursorThemeName") == 0) + { + /* Keep last cursor theme set */ + g_value_reset (helper->lastset_cursor_value); + g_value_copy (value, helper->lastset_cursor_value); + + /* invisible replacement required ? */ + if (helper->cursor_hide) + { + g_value_reset (value); + g_value_copy (helper->invisib_cursor_value, value); + } + } +} + + + static gboolean xfce_xsettings_helper_prop_load (gchar *prop_name, GValue *value, @@ -426,6 +536,7 @@ xfce_xsettings_helper_prop_load (gchar *prop_name, setting = g_slice_new0 (XfceXSetting); setting->value = value; + xfce_xsettings_helper_check_cursor (prop_name, setting->value, helper); setting->last_change_serial = helper->serial; xfsettings_dbg_filtered (XFSD_DEBUG_XSETTINGS, "prop \"%s\" loaded (type=%s)", @@ -462,6 +573,7 @@ xfce_xsettings_helper_prop_changed (XfconfChannel *channel, * it first */ g_value_reset (setting->value); g_value_copy (value, setting->value); + xfce_xsettings_helper_check_cursor (prop_name, setting->value, helper); /* update the serial */ setting->last_change_serial = helper->serial; @@ -475,6 +587,7 @@ xfce_xsettings_helper_prop_changed (XfconfChannel *channel, g_value_init (setting->value, G_VALUE_TYPE (value)); g_value_copy (value, setting->value); + xfce_xsettings_helper_check_cursor (prop_name, setting->value, helper); g_hash_table_insert (helper->settings, g_strdup (prop_name), setting); } @@ -649,6 +762,7 @@ xfce_xsettings_helper_notify_xft (XfceXSettingsHelper *helper) XfceXSetting *setting; guint i; GValue bool_val = { 0, }; + const gchar *props[][2] = { /* { xfconf name}, { xft name } */ @@ -700,7 +814,6 @@ xfce_xsettings_helper_notify_xft (XfceXSettingsHelper *helper) PropModeReplace, (guchar *) resource->str, resource->len); - XCloseDisplay (xdisplay); if (gdk_error_trap_pop () != 0) -- 1.7.6.5