Author: kelnos Date: 2009-05-15 04:06:01 +0000 (Fri, 15 May 2009) New Revision: 29962
Modified: xfconf/trunk/NEWS xfconf/trunk/xfconf/Makefile.am xfconf/trunk/xfconf/xfconf-binding.c Log: hopefully speed up app start time (for apps that do a decent number of property bindings) by making the initial property fetch async Modified: xfconf/trunk/NEWS =================================================================== --- xfconf/trunk/NEWS 2009-05-15 01:00:30 UTC (rev 29961) +++ xfconf/trunk/NEWS 2009-05-15 04:06:01 UTC (rev 29962) @@ -1,3 +1,10 @@ +Xfce 4.6.2 +========== + + * Speed up startup of many apps that use bindings by retrieving the + initial value of the binding asynchronously. + + Xfce 4.6.1 ========== Modified: xfconf/trunk/xfconf/Makefile.am =================================================================== --- xfconf/trunk/xfconf/Makefile.am 2009-05-15 01:00:30 UTC (rev 29961) +++ xfconf/trunk/xfconf/Makefile.am 2009-05-15 04:06:01 UTC (rev 29962) @@ -52,6 +52,9 @@ xfconf-dbus-bindings.h: $(top_srcdir)/common/xfconf-dbus.xml Makefile dbus-binding-tool --mode=glib-client $< > $@ + sed -i -e 's/^\([[:space:]]\+GValue[[:space:]]\+[^=]\)\+;$/\1 = { 0, };/' $@ +# the above line fixes a bug in dbus-binding-tool's output +# dbus-binding-tool doesn't initialise GValues to { 0, } properly if HAVE_GNUC_VISIBILITY TESTS = abicheck.sh Modified: xfconf/trunk/xfconf/xfconf-binding.c =================================================================== --- xfconf/trunk/xfconf/xfconf-binding.c 2009-05-15 01:00:30 UTC (rev 29961) +++ xfconf/trunk/xfconf/xfconf-binding.c 2009-05-15 04:06:01 UTC (rev 29962) @@ -31,6 +31,7 @@ #include "xfconf-private.h" #include "xfconf-alias.h" #include "xfconf-common-private.h" +#include "xfconf-dbus-bindings.h" typedef struct { @@ -43,6 +44,9 @@ GObject *object; gchar *object_property; GType object_property_type; + + /* async call to get initial value */ + DBusGProxyCall *call; } XfconfGBinding; typedef struct @@ -76,6 +80,9 @@ if(G_UNLIKELY(!binding)) return; + if(G_UNLIKELY(binding->call)) + dbus_g_proxy_cancel_call(_xfconf_get_dbus_g_proxy(), binding->call); + if(binding->object) { g_signal_handlers_disconnect_by_func(G_OBJECT(binding->object), G_CALLBACK(xfconf_g_binding_object_property_changed), @@ -282,6 +289,31 @@ g_value_unset(&dst_val); } +static void +xfconf_g_binding_initial_value_received(DBusGProxy *proxy, + GValue value, + GError *error, + gpointer user_data) +{ + XfconfGBinding *binding = user_data; + + binding->call = NULL; + + if(error) { + g_warning("Initial query for property \"%s\" failed: %s", + binding->xfconf_property, error->message); + g_error_free(error); + return; + } + + xfconf_g_binding_channel_property_changed(binding->channel, + binding->xfconf_property, + &value, + binding); + g_value_unset(&value); +} + + static XfconfGBinding * xfconf_g_binding_init(XfconfChannel *channel, const gchar *xfconf_property, @@ -291,9 +323,8 @@ GType object_property_type) { XfconfGBinding *binding; - gchar buf[1024]; + gchar buf[1024], *channel_name = NULL; GSList *bindings; - GValue value = { 0, }; binding = g_slice_new0(XfconfGBinding); binding->channel = channel; @@ -340,11 +371,13 @@ bindings, (GDestroyNotify)g_slist_free); } - if(xfconf_channel_get_property(channel, xfconf_property, &value)) { - xfconf_g_binding_channel_property_changed(channel, xfconf_property, - &value, binding); - g_value_unset(&value); - } + g_object_get(G_OBJECT(channel), "channel-name", &channel_name, NULL); + binding->call = xfconf_client_get_property_async(_xfconf_get_dbus_g_proxy(), + channel_name, + xfconf_property, + xfconf_g_binding_initial_value_received, + binding); + g_free(channel_name); binding->id = ++__last_binding_id; if(G_UNLIKELY(binding->id == 0)) { _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits