diff options
-rw-r--r-- | common/xfconf-dbus.xml | 1 | ||||
-rw-r--r-- | common/xfconf-marshal.list | 3 | ||||
-rw-r--r-- | xfconf/xfconf-binding.c | 18 | ||||
-rw-r--r-- | xfconf/xfconf-channel.c | 16 | ||||
-rw-r--r-- | xfconf/xfconf.c | 5 | ||||
-rw-r--r-- | xfconfd/xfconf-daemon.c | 16 |
6 files changed, 36 insertions, 23 deletions
diff --git a/common/xfconf-dbus.xml b/common/xfconf-dbus.xml index fe8a22d..ed01a44 100644 --- a/common/xfconf-dbus.xml +++ b/common/xfconf-dbus.xml @@ -108,6 +108,7 @@ <signal name="PropertyChanged"> <arg name="channel" type="s"/> <arg name="property" type="s"/> + <arg name="value" type="v"/> </signal> </interface> diff --git a/common/xfconf-marshal.list b/common/xfconf-marshal.list index 72f9937..81409d6 100644 --- a/common/xfconf-marshal.list +++ b/common/xfconf-marshal.list @@ -1 +1,2 @@ -VOID:STRING,STRING +VOID:STRING,STRING,BOXED +VOID:STRING,BOXED diff --git a/xfconf/xfconf-binding.c b/xfconf/xfconf-binding.c index c1f7d54..e484e7e 100644 --- a/xfconf/xfconf-binding.c +++ b/xfconf/xfconf-binding.c @@ -45,6 +45,7 @@ static void xfconf_g_binding_object_destroyed(gpointer data, GObject *where_the_object_was); static void xfconf_g_binding_channel_property_changed(XfconfChannel *channel, const gchar *property, + const GValue *value, gpointer user_data); static void xfconf_g_binding_object_property_changed(GObject *object, GParamSpec *pspec, @@ -110,17 +111,15 @@ xfconf_g_binding_object_destroyed(gpointer data, static void xfconf_g_binding_channel_property_changed(XfconfChannel *channel, const gchar *property, + const GValue *value, gpointer user_data) { XfconfGBinding *binding = user_data; - GValue src_val = { 0, }, dst_val = { 0, }; - - if(!xfconf_channel_get_property(channel, property, &src_val)) - return; + GValue dst_val = { 0, }; g_value_init(&dst_val, binding->object_property_type); - if(g_value_transform(&src_val, &dst_val)) { + if(g_value_transform(value, &dst_val)) { g_signal_handlers_block_by_func(binding->object, G_CALLBACK(xfconf_g_binding_object_property_changed), binding); @@ -131,7 +130,6 @@ xfconf_g_binding_channel_property_changed(XfconfChannel *channel, binding); } - g_value_unset(&src_val); g_value_unset(&dst_val); } @@ -194,6 +192,7 @@ xfconf_g_property_bind(XfconfChannel *channel, GParamSpec *pspec; gchar buf[1024]; GList *bindings; + GValue value = { 0, }; g_return_if_fail(XFCONF_IS_CHANNEL(channel) && xfconf_property && *xfconf_property @@ -263,8 +262,11 @@ xfconf_g_property_bind(XfconfChannel *channel, bindings, (GDestroyNotify)g_list_free); } - xfconf_g_binding_channel_property_changed(channel, xfconf_property, - binding); + if(xfconf_channel_get_property(channel, xfconf_property, &value)) { + xfconf_g_binding_channel_property_changed(channel, xfconf_property, + &value, binding); + g_value_unset(&value); + } } /** diff --git a/xfconf/xfconf-channel.c b/xfconf/xfconf-channel.c index 5d6d2bc..9bc06e4 100644 --- a/xfconf/xfconf-channel.c +++ b/xfconf/xfconf-channel.c @@ -74,7 +74,8 @@ typedef struct _XfconfChannelClass /*< signals >*/ void (*property_changed)(XfconfChannel *channel, - const gchar *property); + const gchar *property, + const GValue *value); } XfconfChannelClass; enum @@ -105,6 +106,7 @@ static void xfconf_channel_finalize(GObject *obj); static void xfconf_channel_property_changed(DBusGProxy *proxy, const gchar *channel_name, const gchar *property, + const GValue *value, gpointer user_data); static guint signals[N_SIGS] = { 0, }; @@ -137,9 +139,10 @@ xfconf_channel_class_init(XfconfChannelClass *klass) property_changed), NULL, NULL, - g_cclosure_marshal_VOID__STRING, + xfconf_marshal_VOID__STRING_BOXED, G_TYPE_NONE, - 1, G_TYPE_STRING); + 2, G_TYPE_STRING, + G_TYPE_VALUE); /** * XfconfChannel::channel-name: @@ -153,10 +156,6 @@ xfconf_channel_class_init(XfconfChannelClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - - dbus_g_object_register_marshaller(xfconf_marshal_VOID__STRING_STRING, - G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); } static void @@ -223,6 +222,7 @@ static void xfconf_channel_property_changed(DBusGProxy *proxy, const gchar *channel_name, const gchar *property, + const GValue *value, gpointer user_data) { /* FIXME: optimise this by keeping track of all channels in a big hashtable @@ -233,7 +233,7 @@ xfconf_channel_property_changed(DBusGProxy *proxy, return; g_signal_emit(G_OBJECT(channel), signals[SIG_PROPERTY_CHANGED], - g_quark_from_string(property), property); + g_quark_from_string(property), property, value); } diff --git a/xfconf/xfconf.c b/xfconf/xfconf.c index ec79ce9..7ebdc6e 100644 --- a/xfconf/xfconf.c +++ b/xfconf/xfconf.c @@ -125,13 +125,14 @@ xfconf_init(GError **error) "/org/xfce/Xfconf", "org.xfce.Xfconf"); - dbus_g_object_register_marshaller((GClosureMarshal)xfconf_marshal_VOID__STRING_STRING, + dbus_g_object_register_marshaller((GClosureMarshal)xfconf_marshal_VOID__STRING_STRING_BOXED, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_VALUE, G_TYPE_INVALID); dbus_g_proxy_add_signal(dbus_proxy, "PropertyChanged", - G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); gui_dbus_proxy = dbus_g_proxy_new_for_name(dbus_conn, diff --git a/xfconfd/xfconf-daemon.c b/xfconfd/xfconf-daemon.c index 3e7cf22..12b5825 100644 --- a/xfconfd/xfconf-daemon.c +++ b/xfconfd/xfconf-daemon.c @@ -110,10 +110,11 @@ xfconf_daemon_class_init(XfconfDaemonClass *klass) G_SIGNAL_RUN_LAST, 0, NULL, NULL, - xfconf_marshal_VOID__STRING_STRING, + xfconf_marshal_VOID__STRING_STRING_BOXED, G_TYPE_NONE, - 2, G_TYPE_STRING, - G_TYPE_STRING); + 3, G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_VALUE); dbus_g_object_type_install_info(G_TYPE_FROM_CLASS(klass), &dbus_glib_xfconf_object_info); @@ -155,8 +156,15 @@ xfconf_daemon_backend_property_changed(XfconfBackend *backend, gpointer user_data) { XfconfDaemon *xfconfd = user_data; + GValue value = { 0, }; + + xfconf_backend_get(backend, channel, property, &value, NULL); + g_signal_emit(G_OBJECT(xfconfd), signals[SIG_PROPERTY_CHANGED], 0, - channel, property); + channel, property, &value); + + if(G_VALUE_TYPE(&value)) + g_value_unset(&value); } static gboolean |