diff options
author | Charles Kerr <charles.kerr@canonical.com> | 2012-03-29 11:33:24 -0700 |
---|---|---|
committer | Charles Kerr <charles.kerr@canonical.com> | 2012-03-29 11:33:24 -0700 |
commit | bc392e208fa1f9b46c77ea8142dadd629722663a (patch) | |
tree | 360ea9101d0ae45fdba3e3a15d4eaab7de587793 /libdbusmenu-glib | |
parent | ebab055ed741101f59c320367eb8be7484555a48 (diff) | |
parent | 86df02fa5a703cacd492db1b999f9449c3247c6b (diff) | |
download | libdbusmenu-bc392e208fa1f9b46c77ea8142dadd629722663a.tar.gz libdbusmenu-bc392e208fa1f9b46c77ea8142dadd629722663a.tar.bz2 libdbusmenu-bc392e208fa1f9b46c77ea8142dadd629722663a.zip |
Import upstream version 0.5.96
Diffstat (limited to 'libdbusmenu-glib')
-rw-r--r-- | libdbusmenu-glib/Makefile.am | 1 | ||||
-rw-r--r-- | libdbusmenu-glib/Makefile.in | 5 | ||||
-rw-r--r-- | libdbusmenu-glib/dbus-menu-clean.xml | 125 | ||||
-rw-r--r-- | libdbusmenu-glib/server.c | 66 |
4 files changed, 187 insertions, 10 deletions
diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index 6fc3fb8..fa7c8cb 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -6,6 +6,7 @@ EXTRA_DIST = \ clean-namespaces.xslt \ dbusmenu-glib-0.4.pc.in \ dbus-menu.xml \ + dbus-menu-clean.xml \ client-marshal.list \ menuitem-marshal.list \ server-marshal.list diff --git a/libdbusmenu-glib/Makefile.in b/libdbusmenu-glib/Makefile.in index de06a31..050b720 100644 --- a/libdbusmenu-glib/Makefile.in +++ b/libdbusmenu-glib/Makefile.in @@ -348,8 +348,9 @@ CLEANFILES = stamp-enum-types dbus-menu-clean.xml $(BUILT_SOURCES) \ DISTCLEANFILES = $(glib_enum_h) $(glib_enum_c) enum-types.c \ enum-types.h EXTRA_DIST = clean-namespaces.xslt dbusmenu-glib-0.4.pc.in \ - dbus-menu.xml client-marshal.list menuitem-marshal.list \ - server-marshal.list $(enum_tmpl_h) $(enum_tmpl_c) + dbus-menu.xml dbus-menu-clean.xml client-marshal.list \ + menuitem-marshal.list server-marshal.list $(enum_tmpl_h) \ + $(enum_tmpl_c) enum_tmpl_h = $(glib_enum_h:.h=.h.in) enum_tmpl_c = $(glib_enum_c:.c=.c.in) lib_LTLIBRARIES = \ diff --git a/libdbusmenu-glib/dbus-menu-clean.xml b/libdbusmenu-glib/dbus-menu-clean.xml new file mode 100644 index 0000000..1550c5b --- /dev/null +++ b/libdbusmenu-glib/dbus-menu-clean.xml @@ -0,0 +1,125 @@ +<?xml version="1.0"?> +<node name="/"> + + <interface name="com.canonical.dbusmenu"> + + + + <property name="Version" type="u" access="read"> + + </property> + + <property name="TextDirection" type="s" access="read"> + + </property> + + <property name="Status" type="s" access="read"> + + </property> + + <property name="IconThemePath" type="as" access="read"> + + </property> + + + + <method name="GetLayout"> + + <arg type="i" name="parentId" direction="in"> + + </arg> + <arg type="i" name="recursionDepth" direction="in"> + + </arg> + <arg type="as" name="propertyNames" direction="in"> + + </arg> + <arg type="u" name="revision" direction="out"> + + </arg> + <arg type="(ia{sv}av)" name="layout" direction="out"> + + </arg> + </method> + + <method name="GetGroupProperties"> + + <arg type="ai" name="ids" direction="in"> + + </arg> + <arg type="as" name="propertyNames" direction="in"> + + </arg> + <arg type="a(ia{sv})" name="properties" direction="out"> + + </arg> + </method> + + <method name="GetProperty"> + + <arg type="i" name="id" direction="in"> + + </arg> + <arg type="s" name="name" direction="in"> + + </arg> + <arg type="v" name="value" direction="out"> + + </arg> + </method> + + <method name="Event"> + + <arg type="i" name="id" direction="in"> + + </arg> + <arg type="s" name="eventId" direction="in"> + + </arg> + <arg type="v" name="data" direction="in"> + + </arg> + <arg type="u" name="timestamp" direction="in"> + + </arg> + </method> + + <method name="AboutToShow"> + + <arg type="i" name="id" direction="in"> + + </arg> + <arg type="b" name="needUpdate" direction="out"> + + </arg> + </method> + + + <signal name="ItemsPropertiesUpdated"> + + <arg type="a(ia{sv})" name="updatedProps" direction="out"/> + <arg type="a(ias)" name="removedProps" direction="out"/> + </signal> + <signal name="LayoutUpdated"> + + <arg type="u" name="revision" direction="out"> + + </arg> + <arg type="i" name="parent" direction="out"> + + </arg> + </signal> + <signal name="ItemActivationRequested"> + + <arg type="i" name="id" direction="out"> + + </arg> + <arg type="u" name="timestamp" direction="out"> + + </arg> + </signal> + + + + </interface> +</node> diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 524e777..1b4ce95 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -64,6 +64,8 @@ struct _DbusmenuServerPrivate GArray * prop_array; guint property_idle; + + GHashTable * lookup_cache; }; #define DBUSMENU_SERVER_GET_PRIVATE(o) (DBUSMENU_SERVER(o)->priv) @@ -378,6 +380,8 @@ dbusmenu_server_init (DbusmenuServer *self) priv->find_server_signal = 0; priv->dbus_registration = 0; + priv->lookup_cache = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); + default_text_direction(self); priv->status = DBUSMENU_STATUS_NORMAL; priv->icon_dirs = NULL; @@ -450,10 +454,50 @@ dbusmenu_server_finalize (GObject *object) priv->icon_dirs = NULL; } + if (priv->lookup_cache) { + g_hash_table_destroy(priv->lookup_cache); + priv->lookup_cache = NULL; + } + G_OBJECT_CLASS (dbusmenu_server_parent_class)->finalize (object); return; } +static DbusmenuMenuitem * +lookup_menuitem_by_id (DbusmenuServer * server, gint id) +{ + DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); + + DbusmenuMenuitem *res = (DbusmenuMenuitem *) g_hash_table_lookup(priv->lookup_cache, GINT_TO_POINTER(id)); + if (!res && id == 0) { + return priv->root; + } + + return res; +} + +static void +cache_remove_entries_for_menuitem (GHashTable * cache, DbusmenuMenuitem * item) +{ + g_hash_table_remove(cache, GINT_TO_POINTER(dbusmenu_menuitem_get_id(item))); + + GList *child, *children = dbusmenu_menuitem_get_children(item); + for (child = children; child != NULL; child = child->next) { + cache_remove_entries_for_menuitem(cache, child->data); + } +} + +static void +cache_add_entries_for_menuitem (GHashTable * cache, DbusmenuMenuitem * item) +{ + g_hash_table_insert(cache, GINT_TO_POINTER(dbusmenu_menuitem_get_id(item)), g_object_ref(item)); + + GList *child, *children = dbusmenu_menuitem_get_children(item); + for (child = children; child != NULL; child = child->next) { + cache_add_entries_for_menuitem(cache, child->data); + } +} + static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) { @@ -480,6 +524,7 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) if (priv->root != NULL) { dbusmenu_menuitem_foreach(priv->root, menuitem_signals_remove, obj); dbusmenu_menuitem_set_root(priv->root, FALSE); + cache_remove_entries_for_menuitem(priv->lookup_cache, priv->root); GList * properties = dbusmenu_menuitem_properties_list(priv->root); GList * iter; @@ -495,6 +540,7 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) priv->root = DBUSMENU_MENUITEM(g_value_get_object(value)); if (priv->root != NULL) { g_object_ref(G_OBJECT(priv->root)); + cache_add_entries_for_menuitem(priv->lookup_cache, priv->root); dbusmenu_menuitem_set_root(priv->root, TRUE); dbusmenu_menuitem_foreach(priv->root, menuitem_signals_create, obj); @@ -1161,6 +1207,7 @@ static void menuitem_child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint pos, DbusmenuServer * server) { menuitem_signals_create(child, server); + cache_add_entries_for_menuitem(server->priv->lookup_cache, child); g_list_foreach(dbusmenu_menuitem_get_children(child), added_check_children, server); layout_update_signal(server); @@ -1171,6 +1218,7 @@ static void menuitem_child_removed (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server) { menuitem_signals_remove(child, server); + cache_remove_entries_for_menuitem(server->priv->lookup_cache, child); layout_update_signal(server); return; } @@ -1259,7 +1307,7 @@ bus_get_layout (DbusmenuServer * server, GVariant * params, GDBusMethodInvocatio GVariant * items = NULL; if (priv->root != NULL) { - DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, parent); + DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, parent); if (mi != NULL) { items = dbusmenu_menuitem_build_variant(mi, props, recurse); @@ -1318,7 +1366,7 @@ bus_get_property (DbusmenuServer * server, GVariant * params, GDBusMethodInvocat g_variant_get(params, "(i&s)", &id, &property); - DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); + DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id); if (mi == NULL) { g_dbus_method_invocation_return_error(invocation, @@ -1361,7 +1409,7 @@ bus_get_properties (DbusmenuServer * server, GVariant * params, GDBusMethodInvoc gint32 id; g_variant_get(params, "(i)", &id); - DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); + DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id); if (mi == NULL) { g_dbus_method_invocation_return_error(invocation, @@ -1424,7 +1472,7 @@ bus_get_group_properties (DbusmenuServer * server, GVariant * params, GDBusMetho gint32 id; while (g_variant_iter_loop(ids, "i", &id)) { - DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); + DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id); if (mi == NULL) continue; if (!builder_init) { @@ -1523,7 +1571,7 @@ bus_get_children (DbusmenuServer * server, GVariant * params, GDBusMethodInvocat return; } - DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); + DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id); if (mi == NULL) { g_dbus_method_invocation_return_error(invocation, @@ -1606,7 +1654,7 @@ bus_event (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * i g_variant_get(params, "(isvu)", &id, &etype, &data, &ts); - DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); + DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id); if (mi == NULL) { g_dbus_method_invocation_return_error(invocation, @@ -1626,7 +1674,9 @@ bus_event (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * i g_timeout_add(0, event_local_handler, event_data); - g_dbus_method_invocation_return_value(invocation, NULL); + if (~g_dbus_message_get_flags (g_dbus_method_invocation_get_message (invocation)) & G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED) { + g_dbus_method_invocation_return_value(invocation, NULL); + } } return; @@ -1648,7 +1698,7 @@ bus_about_to_show (DbusmenuServer * server, GVariant * params, GDBusMethodInvoca gint32 id; g_variant_get(params, "(i)", &id); - DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); + DbusmenuMenuitem * mi = lookup_menuitem_by_id(server, id); if (mi == NULL) { g_dbus_method_invocation_return_error(invocation, |