From b0b55b00b2460f3430b661e8cbc43e6a07759e66 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 8 Mar 2011 14:45:36 -0600 Subject: Add a callback for child-removed as well --- libdbusmenu-gtk/parser.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index cf2003f..bde460d 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -69,6 +69,9 @@ static void action_notify_cb (GtkAction * action, static void child_added_cb (GtkContainer * menu, GtkWidget * widget, gpointer data); +static void child_removed_cb (GtkContainer * menu, + GtkWidget * widget, + gpointer data); static void theme_changed_cb (GtkIconTheme * theme, gpointer data); static void item_activated (DbusmenuMenuitem * item, @@ -262,6 +265,10 @@ parse_menu_structure_helper (GtkWidget * widget, RecurseContext * recurse) "child-added", G_CALLBACK (child_added_cb), recurse->parent); + g_signal_connect (G_OBJECT (widget), + "child-removed", + G_CALLBACK (child_removed_cb), + recurse->parent); g_object_add_weak_pointer(G_OBJECT (widget), (gpointer*)&pdata->shell); } @@ -466,6 +473,10 @@ construct_dbusmenu_for_widget (GtkWidget * widget) "child-added", G_CALLBACK (child_added_cb), mi); + g_signal_connect (G_OBJECT (submenu), + "child-removed", + G_CALLBACK (child_removed_cb), + mi); g_object_add_weak_pointer(G_OBJECT(submenu), (gpointer*)&pdata->shell); } @@ -869,6 +880,14 @@ child_added_cb (GtkContainer *menu, GtkWidget *widget, gpointer data) parse_menu_structure_helper(widget, &recurse); } +/* A child item was added to a menu we're watching. Let's try to integrate it. */ +static void +child_removed_cb (GtkContainer *menu, GtkWidget *widget, gpointer data) +{ + + +} + static void theme_changed_cb (GtkIconTheme *theme, gpointer data) { -- cgit v1.2.3 From 3efb996d90178b9c0d615c5237c0e39328479bd2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 8 Mar 2011 14:53:54 -0600 Subject: Removing the dbusmenu menuitem from the parent if it gets removed on the GTK side --- libdbusmenu-gtk/parser.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index bde460d..b66aa46 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -884,8 +884,22 @@ child_added_cb (GtkContainer *menu, GtkWidget *widget, gpointer data) static void child_removed_cb (GtkContainer *menu, GtkWidget *widget, gpointer data) { + gpointer pmi = g_object_get_data(G_OBJECT(widget), CACHED_MENUITEM); + if (pmi == NULL) { + return; + } + DbusmenuMenuitem * child = DBUSMENU_MENUITEM(pmi); + pmi = g_object_get_data(G_OBJECT(menu), CACHED_MENUITEM); + if (pmi == NULL) { + return; + } + + DbusmenuMenuitem * parent = DBUSMENU_MENUITEM(pmi); + + dbusmenu_menuitem_child_delete(parent, child); + return; } static void -- cgit v1.2.3 From d108784a9b3b326e17bf1598123a9bf8f6a6c22b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 8 Mar 2011 15:03:24 -0600 Subject: Disconnecting the child removed handlers --- libdbusmenu-gtk/parser.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index b66aa46..b1fc9d9 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -144,6 +144,8 @@ parse_data_free (gpointer data) if (pdata != NULL && pdata->shell != NULL) { g_signal_handlers_disconnect_matched(pdata->shell, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, 0, 0, NULL, G_CALLBACK(child_added_cb), NULL); + g_signal_handlers_disconnect_matched(pdata->shell, (GSignalMatchType)G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, G_CALLBACK(child_removed_cb), NULL); g_object_remove_weak_pointer(G_OBJECT(pdata->shell), (gpointer*)&pdata->shell); } -- cgit v1.2.3 From 4e93ea396591cb11d092278014f8a38987610699 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 8 Mar 2011 16:07:39 -0600 Subject: If we call the parse function and we already have the menu item built for the passed in value let's just use that and not bother looking any further. --- libdbusmenu-gtk/parser.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index b1fc9d9..0634047 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -101,15 +101,25 @@ static void menuitem_notify_cb (GtkWidget * widget, DbusmenuMenuitem * dbusmenu_gtk_parse_menu_structure (GtkWidget * widget) { - g_return_val_if_fail(GTK_IS_MENU_ITEM(widget) || GTK_IS_MENU_SHELL(widget), NULL); + g_return_val_if_fail(GTK_IS_MENU_ITEM(widget) || GTK_IS_MENU_SHELL(widget), NULL); - RecurseContext recurse = {0}; + DbusmenuMenuitem * returnval = NULL; + gpointer data = g_object_get_data(G_OBJECT(widget), CACHED_MENUITEM); - recurse.toplevel = gtk_widget_get_toplevel(widget); + if (data == NULL) { + RecurseContext recurse = {0}; - parse_menu_structure_helper(widget, &recurse); + recurse.toplevel = gtk_widget_get_toplevel(widget); - return recurse.parent; + parse_menu_structure_helper(widget, &recurse); + + returnval = recurse.parent; + } else { + returnval = DBUSMENU_MENUITEM(data); + g_object_ref(G_OBJECT(returnval)); + } + + return returnval; } static void @@ -231,7 +241,6 @@ new_menuitem (GtkWidget * widget) static void parse_menu_structure_helper (GtkWidget * widget, RecurseContext * recurse) { - /* If this is a shell, then let's handle the items in it. */ if (GTK_IS_MENU_SHELL (widget)) { /* Okay, this is a little janky and all.. but some applications update some -- cgit v1.2.3 From 2b04d47ee2569bf434bf50a2d5f3329a2d95f805 Mon Sep 17 00:00:00 2001 From: Chris Coulson Date: Mon, 14 Mar 2011 19:30:23 +0000 Subject: The g_variant_get_* family of calls which return a GVariant actually return reference counted, non-floating variant. Ensure that we always keep pointers to these so that we can properly unref them. The same also applies to g_variant_iter_next_value. Also fix a couple of other minor leaks along the way. This fixes LP: #722972 --- libdbusmenu-glib/client.c | 141 +++++++++++++++++++++++++++++++++------------- 1 file changed, 102 insertions(+), 39 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 16e832d..2976436 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -598,20 +598,27 @@ get_properties_callback (GObject *obj, GAsyncResult * res, gpointer user_data) } /* Callback all the folks we can find */ - GVariantIter * iter = g_variant_iter_new(g_variant_get_child_value(params, 0)); - GVariant * child; + GVariant * child = g_variant_get_child_value(params, 0); + GVariantIter * iter = g_variant_iter_new(child); + g_variant_unref(child); while ((child = g_variant_iter_next_value(iter)) != NULL) { if (g_strcmp0(g_variant_get_type_string(child), "(ia{sv})") != 0) { g_warning("Properties return signature is not '(ia{sv})' it is '%s'", g_variant_get_type_string(child)); + g_variant_unref(child); continue; } - gint id = g_variant_get_int32(g_variant_get_child_value(child, 0)); + GVariant * idv = g_variant_get_child_value(child, 0); + gint id = g_variant_get_int32(idv); + g_variant_unref(idv); + GVariant * properties = g_variant_get_child_value(child, 1); properties_listener_t * listener = find_listener(listeners, 0, id); if (listener == NULL) { g_warning("Unable to find listener for ID %d", id); + g_variant_unref(properties); + g_variant_unref(child); continue; } @@ -621,6 +628,8 @@ get_properties_callback (GObject *obj, GAsyncResult * res, gpointer user_data) } else { g_warning("Odd, we've already replied to the listener on ID %d", id); } + g_variant_unref(properties); + g_variant_unref(child); } g_variant_iter_free(iter); g_variant_unref(params); @@ -676,7 +685,9 @@ get_properties_idle (gpointer user_data) GVariant * variant_ids = g_variant_builder_end(&builder); /* Build up a prop list to pass */ - g_variant_builder_init(&builder, g_variant_type_new("as")); + GVariantType * type = g_variant_type_new("as"); + g_variant_builder_init(&builder, type); + g_variant_type_free(type); /* TODO: need to use delayed property list here */ GVariant * variant_props = g_variant_builder_end(&builder); @@ -1050,12 +1061,13 @@ menuproxy_build_cb (GObject * object, GAsyncResult * res, gpointer user_data) /* Check the text direction if available */ GVariant * textdir = g_dbus_proxy_get_cached_property(priv->menuproxy, "TextDirection"); if (textdir != NULL) { - GVariant * str = textdir; - if (g_variant_is_of_type(str, G_VARIANT_TYPE_VARIANT)) { - str = g_variant_get_variant(str); + if (g_variant_is_of_type(textdir, G_VARIANT_TYPE_VARIANT)) { + GVariant * tmp = g_variant_get_variant(textdir); + g_variant_unref(textdir); + textdir = tmp; } - priv->text_direction = dbusmenu_text_direction_get_value_from_nick(g_variant_get_string(str, NULL)); + priv->text_direction = dbusmenu_text_direction_get_value_from_nick(g_variant_get_string(textdir, NULL)); g_object_notify(G_OBJECT(user_data), DBUSMENU_CLIENT_PROP_TEXT_DIRECTION); g_variant_unref(textdir); @@ -1063,13 +1075,14 @@ menuproxy_build_cb (GObject * object, GAsyncResult * res, gpointer user_data) /* Check the status if available */ GVariant * status = g_dbus_proxy_get_cached_property(priv->menuproxy, "Status"); - if (textdir != NULL) { - GVariant * str = status; - if (g_variant_is_of_type(str, G_VARIANT_TYPE_VARIANT)) { - str = g_variant_get_variant(str); + if (status != NULL) { + if (g_variant_is_of_type(status, G_VARIANT_TYPE_VARIANT)) { + GVariant * tmp = g_variant_get_variant(status); + g_variant_unref(status); + status = tmp; } - priv->status = dbusmenu_status_get_value_from_nick(g_variant_get_string(str, NULL)); + priv->status = dbusmenu_status_get_value_from_nick(g_variant_get_string(status, NULL)); g_object_notify(G_OBJECT(user_data), DBUSMENU_CLIENT_PROP_STATUS); g_variant_unref(status); @@ -1142,20 +1155,22 @@ menuproxy_prop_changed_cb (GDBusProxy * proxy, GVariant * properties, GStrv inva g_variant_iter_init(&iters, properties); while (g_variant_iter_next(&iters, "{sv}", &key, &value)) { if (g_strcmp0(key, "TextDirection") == 0) { - GVariant * str = value; - if (g_variant_is_of_type(str, G_VARIANT_TYPE_VARIANT)) { - str = g_variant_get_variant(str); + if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARIANT)) { + GVariant * tmp = g_variant_get_variant(value); + g_variant_unref(value); + value = tmp; } - priv->text_direction = dbusmenu_text_direction_get_value_from_nick(g_variant_get_string(str, NULL)); + priv->text_direction = dbusmenu_text_direction_get_value_from_nick(g_variant_get_string(value, NULL)); } if (g_strcmp0(key, "Status") == 0) { - GVariant * str = value; - if (g_variant_is_of_type(str, G_VARIANT_TYPE_VARIANT)) { - str = g_variant_get_variant(str); + if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARIANT)) { + GVariant * tmp = g_variant_get_variant(value); + g_variant_unref(value); + value = tmp; } - priv->status = dbusmenu_status_get_value_from_nick(g_variant_get_string(str, NULL)); + priv->status = dbusmenu_status_get_value_from_nick(g_variant_get_string(value, NULL)); } if (g_strcmp0(key, "IconThemePath") == 0) { if (priv->icon_dirs != NULL) { @@ -1224,11 +1239,14 @@ menuproxy_signal_cb (GDBusProxy * proxy, gchar * sender, gchar * signal, GVarian /* Remove before adding just incase there is a duplicate, against the rules, but we can handle it so let's do it. */ GVariantIter ritems; - g_variant_iter_init(&ritems, g_variant_get_child_value(params, 1)); + GVariant * ritemsv = g_variant_get_child_value(params, 1); + g_variant_iter_init(&ritems, ritemsv); GVariant * ritem; while ((ritem = g_variant_iter_next_value(&ritems)) != NULL) { - gint id = g_variant_get_int32(g_variant_get_child_value(ritem, 0)); + GVariant * idv = g_variant_get_child_value(ritem, 0); + gint id = g_variant_get_int32(idv); + g_variant_unref(idv); DbusmenuMenuitem * menuitem = dbusmenu_menuitem_find_id(priv->root, id); if (menuitem == NULL) { @@ -1236,7 +1254,8 @@ menuproxy_signal_cb (GDBusProxy * proxy, gchar * sender, gchar * signal, GVarian } GVariantIter properties; - g_variant_iter_init(&properties, g_variant_get_child_value(ritem, 1)); + GVariant * propv = g_variant_get_child_value(ritem, 1); + g_variant_iter_init(&properties, propv); gchar * property; while (g_variant_iter_next(&properties, "s", &property)) { @@ -1245,16 +1264,23 @@ menuproxy_signal_cb (GDBusProxy * proxy, gchar * sender, gchar * signal, GVarian g_free(property); } g_variant_unref(ritem); + g_variant_unref(propv); } + g_variant_unref(ritemsv); GVariantIter items; - g_variant_iter_init(&items, g_variant_get_child_value(params, 0)); + GVariant * itemsv = g_variant_get_child_value(params, 0); + g_variant_iter_init(&items, itemsv); GVariant * item; while ((item = g_variant_iter_next_value(&items)) != NULL) { - gint id = g_variant_get_int32(g_variant_get_child_value(item, 0)); + GVariant * idv = g_variant_get_child_value(item, 0); + gint id = g_variant_get_int32(idv); + g_variant_unref(idv); + GVariantIter properties; - g_variant_iter_init(&properties, g_variant_get_child_value(item, 1)); + GVariant * propv = g_variant_get_child_value(item, 1); + g_variant_iter_init(&properties, propv); gchar * property; GVariant * value; @@ -1263,14 +1289,21 @@ menuproxy_signal_cb (GDBusProxy * proxy, gchar * sender, gchar * signal, GVarian if (G_LIKELY(g_variant_is_of_type(value, G_VARIANT_TYPE_VARIANT))) { /* Unboxing if needed */ internalvalue = g_variant_get_variant(value); + g_variant_unref(value); } id_prop_update(proxy, id, property, internalvalue, client); + g_variant_unref(internalvalue); } + g_variant_unref(propv); + g_variant_unref(item); } + g_variant_unref(itemsv); } else if (g_strcmp0(signal, "ItemPropertyUpdated") == 0) { gint id; gchar * property; GVariant * value; g_variant_get(params, "(isv)", &id, &property, &value); id_prop_update(proxy, id, property, value, client); + g_free(property); + g_variant_unref(value); } else if (g_strcmp0(signal, "ItemUpdated") == 0) { gint id; g_variant_get(params, "(i)", &id); @@ -1594,7 +1627,9 @@ parse_layout_xml(DbusmenuClient * client, GVariant * layout, DbusmenuMenuitem * } /* First verify and figure out what we've got */ - gint id = g_variant_get_int32(g_variant_get_child_value(layout, 0)); + GVariant * idv = g_variant_get_child_value(layout, 0); + gint id = g_variant_get_int32(idv); + g_variant_unref(idv); if (id < 0) { return NULL; } @@ -1607,8 +1642,10 @@ parse_layout_xml(DbusmenuClient * client, GVariant * layout, DbusmenuMenuitem * /* Some variables */ GVariantIter children; - g_variant_iter_init(&children, g_variant_get_child_value(layout, 2)); - GVariant * child; + GVariant * childrenv; + + childrenv = g_variant_get_child_value(layout, 2); + g_variant_iter_init(&children, childrenv); guint position = 0; GList * oldchildren = g_list_copy(dbusmenu_menuitem_get_children(item)); @@ -1616,16 +1653,22 @@ parse_layout_xml(DbusmenuClient * client, GVariant * layout, DbusmenuMenuitem * /* Go through all the XML Nodes and make sure that we have menuitems to cover those XML nodes. */ + GVariant * child; while ((child = g_variant_iter_next_value(&children)) != NULL) { /* g_debug("Looking at child: %d", position); */ if (g_variant_is_of_type(child, G_VARIANT_TYPE_VARIANT)) { - child = g_variant_get_variant(child); + GVariant * tmp = g_variant_get_variant(child); + g_variant_unref(child); + child = tmp; } - gint childid = g_variant_get_int32(g_variant_get_child_value(child, 0)); + GVariant * childidv = g_variant_get_child_value(child, 0); + gint childid = g_variant_get_int32(childidv); + g_variant_unref(childidv); if (childid < 0) { /* Don't increment the position when there isn't a valid node in the XML tree. It's probably a comment. */ + g_variant_unref(child); continue; } DbusmenuMenuitem * childmi = NULL; @@ -1665,10 +1708,12 @@ parse_layout_xml(DbusmenuClient * client, GVariant * layout, DbusmenuMenuitem * GVariantIter iter; gchar * prop; GVariant * value; + GVariant * child_props; /* Set the type first as it can manage the behavior of all other properties. */ - g_variant_iter_init(&iter, g_variant_get_child_value(child, 1)); + child_props = g_variant_get_child_value(child, 1); + g_variant_iter_init(&iter, child_props); while (g_variant_iter_next(&iter, "{sv}", &prop, &value)) { if (g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_TYPE) == 0) { dbusmenu_menuitem_property_set_variant(childmi, prop, value); @@ -1678,15 +1723,17 @@ parse_layout_xml(DbusmenuClient * client, GVariant * layout, DbusmenuMenuitem * } /* Now go through and do all the properties. */ - g_variant_iter_init(&iter, g_variant_get_child_value(child, 1)); + g_variant_iter_init(&iter, child_props); while (g_variant_iter_next(&iter, "{sv}", &prop, &value)) { dbusmenu_menuitem_property_set_variant(childmi, prop, value); g_free(prop); g_variant_unref(value); } + g_variant_unref(child_props); } position++; + g_variant_unref(child); } /* Remove any children that are no longer used by this version of @@ -1709,19 +1756,24 @@ parse_layout_xml(DbusmenuClient * client, GVariant * layout, DbusmenuMenuitem * } /* now it's time to recurse down the tree. */ - g_variant_iter_init(&children, g_variant_get_child_value(layout, 2)); + g_variant_iter_init(&children, childrenv); child = g_variant_iter_next_value(&children); GList * childmis = dbusmenu_menuitem_get_children(item); while (child != NULL && childmis != NULL) { if (g_variant_is_of_type(child, G_VARIANT_TYPE_VARIANT)) { - child = g_variant_get_variant(child); + GVariant * tmp = g_variant_get_variant(child); + g_variant_unref(child); + child = tmp; } - gint xmlid = g_variant_get_int32(g_variant_get_child_value(child, 0)); + GVariant * xmlidv = g_variant_get_child_value(child, 0); + gint xmlid = g_variant_get_int32(xmlidv); + g_variant_unref(xmlidv); /* If this isn't a valid menu item we need to move on until we have one. This avoids things like comments. */ if (xmlid < 0) { + g_variant_unref(child); child = g_variant_iter_next_value(&children); continue; } @@ -1733,10 +1785,13 @@ parse_layout_xml(DbusmenuClient * client, GVariant * layout, DbusmenuMenuitem * parse_layout_xml(client, child, DBUSMENU_MENUITEM(childmis->data), item, proxy); + g_variant_unref(child); child = g_variant_iter_next_value(&children); childmis = g_list_next(childmis); } + g_variant_unref(childrenv); + if (child != NULL) { g_warning("Sync failed, now we've got extra layout nodes."); } @@ -1801,6 +1856,7 @@ update_layout_cb (GObject * proxy, GAsyncResult * res, gpointer data) GError * error = NULL; GVariant * params = NULL; + GVariant * layout = NULL; params = g_dbus_proxy_call_finish(G_DBUS_PROXY(proxy), res, &error); @@ -1810,8 +1866,11 @@ update_layout_cb (GObject * proxy, GAsyncResult * res, gpointer data) goto out; } - guint rev = g_variant_get_uint32(g_variant_get_child_value(params, 0)); - GVariant * layout = g_variant_get_child_value(params, 1); + GVariant * revv = g_variant_get_child_value(params, 0); + guint rev = g_variant_get_uint32(revv); + g_variant_unref(revv); + + layout = g_variant_get_child_value(params, 1); guint parseable = parse_layout(client, layout); @@ -1839,6 +1898,10 @@ out: priv->layoutcall = NULL; } + if (layout != NULL) { + g_variant_unref(layout); + } + if (params != NULL) { g_variant_unref(params); } -- cgit v1.2.3 From 1da844ec47972d1f88a039d0234d77084ba558cb Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Mon, 14 Mar 2011 16:01:04 -0400 Subject: be a little more cautious about pointers in sanitize_label_text --- libdbusmenu-gtk/parser.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index 1b032bb..2a057b4 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -371,14 +371,20 @@ sanitize_label_text (const gchar * label) which we don't. */ gchar * sanitized = NULL; GError * error = NULL; + + if (label == NULL) { + return NULL; + } + if (pango_parse_markup (label, -1, 0, NULL, &sanitized, NULL, &error)) { return sanitized; } - else { + + if (error != NULL) { g_warning ("Could not parse '%s': %s", label, error->message); g_error_free (error); - return g_strdup (label); } + return g_strdup (label); } static gchar * -- cgit v1.2.3 From b3132c1682d932c0e9404dc29cae52921bc0ffe9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Mar 2011 08:52:58 -0500 Subject: Adding needed requirements to pkgconfig files. --- libdbusmenu-gtk/dbusmenu-gtk-0.4.pc.in | 2 +- libdbusmenu-gtk/dbusmenu-gtk3-0.4.pc.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-gtk/dbusmenu-gtk-0.4.pc.in b/libdbusmenu-gtk/dbusmenu-gtk-0.4.pc.in index 8784556..9a1b460 100644 --- a/libdbusmenu-gtk/dbusmenu-gtk-0.4.pc.in +++ b/libdbusmenu-gtk/dbusmenu-gtk-0.4.pc.in @@ -5,7 +5,7 @@ bindir=@bindir@ includedir=@includedir@ Cflags: -I${includedir}/libdbusmenu-0.4 -Requires: dbusmenu-glib-0.4 +Requires: dbusmenu-glib-0.4 gdk-pixbuf-2.0 gtk+-2.0 Libs: -L${libdir} -ldbusmenu-gtk Name: libdbusmenu-gtk diff --git a/libdbusmenu-gtk/dbusmenu-gtk3-0.4.pc.in b/libdbusmenu-gtk/dbusmenu-gtk3-0.4.pc.in index 804b13e..c297db3 100644 --- a/libdbusmenu-gtk/dbusmenu-gtk3-0.4.pc.in +++ b/libdbusmenu-gtk/dbusmenu-gtk3-0.4.pc.in @@ -5,7 +5,7 @@ bindir=@bindir@ includedir=@includedir@ Cflags: -I${includedir}/libdbusmenu-0.4 -Requires: dbusmenu-glib-0.4 +Requires: dbusmenu-glib-0.4 gdk-pixbuf-2.0 gtk+-3.0 Libs: -L${libdir} -ldbusmenu-gtk3 Name: libdbusmenu-gtk3 -- cgit v1.2.3 From a121f48983c2c9b59b982dcdaa3c25fae6fce851 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Mar 2011 12:51:45 -0500 Subject: Not everything is a menuitem --- libdbusmenu-gtk/parser.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index 2a057b4..5234337 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -124,7 +124,9 @@ dbusmenu_gtk_parse_menu_structure (GtkWidget * widget) DbusmenuMenuitem * dbusmenu_gtk_parse_get_cached_item (GtkWidget * widget) { - g_return_val_if_fail(GTK_IS_MENU_ITEM(widget), NULL); + if (!GTK_IS_MENU_ITEM(widget)) { + return NULL; + } return DBUSMENU_MENUITEM(g_object_get_data(G_OBJECT(widget), CACHED_MENUITEM)); } -- cgit v1.2.3 From 05cb2ccd4c7c27721171eb634fcbcf560e4c6efa Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 16 Mar 2011 08:30:04 -0400 Subject: add opened and closed events --- libdbusmenu-gtk/client.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 510e74e..f9de880 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -467,6 +467,15 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) return TRUE; } +static void +submenu_notify_visible_cb (GtkWidget * menu, GParamSpec * pspec, DbusmenuMenuitem * mi) +{ + if (gtk_widget_get_visible (menu)) + dbusmenu_menuitem_handle_event(mi, "opened", NULL, gtk_get_current_event_time()); + else + dbusmenu_menuitem_handle_event(mi, "closed", NULL, gtk_get_current_event_time()); +} + /* Process the visible property */ static void process_visible (DbusmenuMenuitem * mi, GtkMenuItem * gmi, GVariant * value) @@ -740,11 +749,12 @@ new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, Dbus GtkMenuItem * parent = dbusmenu_gtkclient_menuitem_get(gtkclient, mi); gtk_menu_item_set_submenu(parent, GTK_WIDGET(menu)); + + g_signal_connect(menu, "notify::visible", G_CALLBACK(submenu_notify_visible_cb), mi); } GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get(gtkclient, child); gtk_menu_shell_insert(GTK_MENU_SHELL(menu), GTK_WIDGET(childmi), position); - gtk_widget_show(GTK_WIDGET(menu)); return; } -- cgit v1.2.3 From 6f25635c793c3081196913a2ae04df4fabd74d03 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 16 Mar 2011 08:33:12 -0400 Subject: handle empty image types --- libdbusmenu-gtk/parser.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index 2a057b4..ce143e3 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -631,6 +631,9 @@ update_icon (DbusmenuMenuitem *menuitem, GtkImage *image) if (image != NULL && should_show_image (image)) { switch (gtk_image_get_storage_type (image)) { + case GTK_IMAGE_EMPTY: + break; + case GTK_IMAGE_PIXBUF: pixbuf = g_object_ref (gtk_image_get_pixbuf (image)); break; -- cgit v1.2.3 From 4c20267a1c5db9f7b259524ea92403a8caeb58ab Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Mar 2011 10:23:03 -0500 Subject: Adding defines for the event ids --- libdbusmenu-glib/menuitem.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index f4eb989..afd1d4e 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -267,6 +267,32 @@ G_BEGIN_DECLS */ #define DBUSMENU_MENUITEM_CHILD_DISPLAY_SUBMENU "submenu" +/** + * DBUSMENU_MENUITEM_EVENT_ACTIVATED: + * + * String for the event identifier when a menu item is clicked + * on by the user. + */ +#define DBUSMENU_MENUITEM_EVENT_ACTIVATED "clicked" + +/** + * DBUSMENU_MENUITEM_EVENT_OPENED: + * + * String for the event identifier when a menu is opened and + * displayed to the user. Only valid for items that contain + * submenus. + */ +#define DBUSMENU_MENUITEM_EVENT_OPENED "opened" + +/** + * DBUSMENU_MENUITEM_EVENT_CLOSED: + * + * String for the event identifier when a menu is closed and + * displayed to the user. Only valid for items that contain + * submenus. + */ +#define DBUSMENU_MENUITEM_EVENT_CLOSED "closed" + typedef struct _DbusmenuMenuitemPrivate DbusmenuMenuitemPrivate; /** -- cgit v1.2.3 From 224a7bad973443574bdd182fcd7b544c641edc58 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Mar 2011 10:27:00 -0500 Subject: Using the new defines --- libdbusmenu-glib/menuitem.c | 2 +- libdbusmenu-gtk/client.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 2e5a345..70b5fd2 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -430,7 +430,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) static void handle_event (DbusmenuMenuitem * mi, const gchar * name, GVariant * value, guint timestamp) { - if (g_strcmp0(name, "clicked") == 0) { + if (g_strcmp0(name, DBUSMENU_MENUITEM_EVENT_ACTIVATED) == 0) { g_signal_emit(G_OBJECT(mi), signals[ITEM_ACTIVATED], 0, timestamp, TRUE); } diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index f9de880..497808b 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -458,7 +458,7 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) { if (gtk_menu_item_get_submenu(gmi) == NULL) { GVariant * variant = g_variant_new("i", 0); - dbusmenu_menuitem_handle_event(mi, "clicked", variant, gtk_get_current_event_time()); + dbusmenu_menuitem_handle_event(mi, DBUSMENU_MENUITEM_EVENT_ACTIVATED, variant, gtk_get_current_event_time()); } else { /* TODO: We need to stop the display of the submenu until this callback returns. */ @@ -471,9 +471,9 @@ static void submenu_notify_visible_cb (GtkWidget * menu, GParamSpec * pspec, DbusmenuMenuitem * mi) { if (gtk_widget_get_visible (menu)) - dbusmenu_menuitem_handle_event(mi, "opened", NULL, gtk_get_current_event_time()); + dbusmenu_menuitem_handle_event(mi, DBUSMENU_MENUITEM_EVENT_OPENED, NULL, gtk_get_current_event_time()); else - dbusmenu_menuitem_handle_event(mi, "closed", NULL, gtk_get_current_event_time()); + dbusmenu_menuitem_handle_event(mi, DBUSMENU_MENUITEM_EVENT_CLOSED, NULL, gtk_get_current_event_time()); } /* Process the visible property */ -- cgit v1.2.3 From 7cd13f9f5a9cee28e3c35a50ddf5bb366a3fd53c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Mar 2011 10:27:40 -0500 Subject: Adding opened and closed to the spec --- libdbusmenu-glib/dbus-menu.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libdbusmenu-glib/dbus-menu.xml b/libdbusmenu-glib/dbus-menu.xml index efb55d4..a36c148 100644 --- a/libdbusmenu-glib/dbus-menu.xml +++ b/libdbusmenu-glib/dbus-menu.xml @@ -294,6 +294,8 @@ License version 3 and version 2.1 along with this program. If not, see @li "clicked" @li "hovered" + @li "opened" + @li "closed" Vendor specific events can be added by prefixing them with "x--" ]]> -- cgit v1.2.3 From d2243c9e779c8b7038a6dff55f0cd1d5a0721351 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Mar 2011 10:28:34 -0500 Subject: Adding event defines to the documentation. --- docs/libdbusmenu-glib/reference/libdbusmenu-glib-sections.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/libdbusmenu-glib/reference/libdbusmenu-glib-sections.txt b/docs/libdbusmenu-glib/reference/libdbusmenu-glib-sections.txt index 84d8257..4d1e50a 100644 --- a/docs/libdbusmenu-glib/reference/libdbusmenu-glib-sections.txt +++ b/docs/libdbusmenu-glib/reference/libdbusmenu-glib-sections.txt @@ -70,6 +70,9 @@ DBUSMENU_MENUITEM_SHORTCUT_ALT DBUSMENU_MENUITEM_SHORTCUT_CONTROL DBUSMENU_MENUITEM_SHORTCUT_SHIFT DBUSMENU_MENUITEM_SHORTCUT_SUPER +DBUSMENU_MENUITEM_EVENT_ACTIVATED +DBUSMENU_MENUITEM_EVENT_CLOSED +DBUSMENU_MENUITEM_EVENT_OPENED DbusmenuMenuitem dbusmenu_menuitem_about_to_show_cb dbusmenu_menuitem_buildvariant_slot_t -- cgit v1.2.3 From 0c14221e10d1adb346b4c22d7ff503be52a62899 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Mar 2011 13:49:13 -0500 Subject: 0.3.102 --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 8cfa421..84e0bec 100644 --- a/configure.ac +++ b/configure.ac @@ -1,11 +1,11 @@ -AC_INIT(libdbusmenu, 0.3.101, ted@canonical.com) +AC_INIT(libdbusmenu, 0.3.102, ted@canonical.com) AC_COPYRIGHT([Copyright 2009,2010 Canonical]) AC_PREREQ(2.62) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(libdbusmenu, 0.3.101, [-Wno-portability]) +AM_INIT_AUTOMAKE(libdbusmenu, 0.3.102, [-Wno-portability]) AM_MAINTAINER_MODE @@ -134,7 +134,7 @@ AC_PATH_PROG([XSLT_PROC], [xsltproc]) ########################### LIBDBUSMENU_CURRENT=3 -LIBDBUSMENU_REVISION=9 +LIBDBUSMENU_REVISION=10 LIBDBUSMENU_AGE=0 AC_SUBST(LIBDBUSMENU_CURRENT) -- cgit v1.2.3