From 4592b138187df94f644aae46bd1a6f0913a4c05b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 1 Mar 2012 10:55:24 -0600 Subject: Clean up a goto and make the lifecycles of the variables more clear --- libdbusmenu-glib/client.c | 86 ++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index e64d923..01f063d 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -601,64 +601,66 @@ get_properties_callback (GObject *obj, GAsyncResult * res, gpointer user_data) listener->callback(NULL, error, listener->user_data); } g_error_free(error); - goto out; } /* Callback all the folks we can find */ - GVariant * parent = g_variant_get_child_value(params, 0); - GVariantIter iter; - g_variant_iter_init(&iter, parent); - GVariant * 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; - } + if (error == NULL) { + GVariant * parent = g_variant_get_child_value(params, 0); + GVariantIter iter; + g_variant_iter_init(&iter, parent); + GVariant * 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; + } - GVariant * idv = g_variant_get_child_value(child, 0); - gint id = g_variant_get_int32(idv); - g_variant_unref(idv); + 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); - 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; + } - properties_listener_t * listener = find_listener(listeners, 0, id); - if (listener == NULL) { - g_warning("Unable to find listener for ID %d", id); + if (!listener->replied) { + listener->callback(properties, NULL, listener->user_data); + listener->replied = TRUE; + } else { + g_warning("Odd, we've already replied to the listener on ID %d", id); + } g_variant_unref(properties); g_variant_unref(child); - continue; } - - if (!listener->replied) { - listener->callback(properties, NULL, listener->user_data); - listener->replied = TRUE; - } 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_unref(parent); + g_variant_unref(params); } - g_variant_unref(parent); - g_variant_unref(params); /* Provide errors for those who we can't */ - GError * localerror = NULL; - for (i = 0; i < listeners->len; i++) { - properties_listener_t * listener = &g_array_index(listeners, properties_listener_t, i); - if (!listener->replied) { - g_warning("Generating properties error for: %d", listener->id); - if (localerror == NULL) { - g_set_error_literal(&localerror, error_domain(), 0, "Error getting properties for ID"); + if (error == NULL && listeners->len > 0) { + GError * localerror = NULL; + for (i = 0; i < listeners->len; i++) { + properties_listener_t * listener = &g_array_index(listeners, properties_listener_t, i); + if (!listener->replied) { + g_warning("Generating properties error for: %d", listener->id); + if (localerror == NULL) { + g_set_error_literal(&localerror, error_domain(), 0, "Error getting properties for ID"); + } + listener->callback(NULL, localerror, listener->user_data); } - listener->callback(NULL, localerror, listener->user_data); } - } - if (localerror != NULL) { - g_error_free(localerror); + if (localerror != NULL) { + g_error_free(localerror); + } } -out: /* Clean up */ g_array_free(listeners, TRUE); g_object_unref(cbdata->client); -- cgit v1.2.3 -- cgit v1.2.3 From 17fe62d6ba9a44a86a250695e6e60380e2bab9c1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 1 Mar 2012 12:22:01 -0600 Subject: Setting the default role to be a menu item --- libdbusmenu-gtk/genericmenuitem.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 435c808..5d13081 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -83,6 +83,10 @@ genericmenuitem_class_init (GenericmenuitemClass *klass) object_class->dispose = genericmenuitem_dispose; object_class->finalize = genericmenuitem_finalize; + GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass); + + gtk_widget_class_set_accessible_role(widget_class, ATK_ROLE_MENU_ITEM); + GtkCheckMenuItemClass * check_class = GTK_CHECK_MENU_ITEM_CLASS (klass); parent_draw_indicator = check_class->draw_indicator; -- cgit v1.2.3 From cbd4cda4b581a98fbe305fd82018ee78d643edc8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 1 Mar 2012 12:31:49 -0600 Subject: Set the role of the menu item based on how it's being displayed --- libdbusmenu-gtk/genericmenuitem.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 5d13081..4c57319 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -351,18 +351,29 @@ genericmenuitem_set_check_type (Genericmenuitem * item, GenericmenuitemCheckType } item->priv->check_type = check_type; + AtkObject * aobj = gtk_widget_get_accessible(GTK_WIDGET(item)); switch (item->priv->check_type) { case GENERICMENUITEM_CHECK_TYPE_NONE: /* We don't need to do anything here as we're queuing the draw and then when it draws it'll avoid drawing the check on the item. */ + + if (aobj != NULL) { + atk_object_set_role(aobj, ATK_ROLE_MENU_ITEM); + } break; case GENERICMENUITEM_CHECK_TYPE_CHECKBOX: gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), FALSE); + if (aobj != NULL) { + atk_object_set_role(aobj, ATK_ROLE_CHECK_MENU_ITEM); + } break; case GENERICMENUITEM_CHECK_TYPE_RADIO: gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), TRUE); + if (aobj != NULL) { + atk_object_set_role(aobj, ATK_ROLE_RADIO_MENU_ITEM); + } break; default: g_warning("Generic Menuitem invalid check type: %d", check_type); -- cgit v1.2.3 -- cgit v1.2.3 From e0a68da43067e5955f38e62cb5fb1975119082fc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 1 Mar 2012 16:25:25 -0600 Subject: Fixing for GTK2 --- libdbusmenu-gtk/genericmenuitem.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 4c57319..e9c8367 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -83,9 +83,11 @@ genericmenuitem_class_init (GenericmenuitemClass *klass) object_class->dispose = genericmenuitem_dispose; object_class->finalize = genericmenuitem_finalize; +#ifdef HAVE_GTK3 GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass); gtk_widget_class_set_accessible_role(widget_class, ATK_ROLE_MENU_ITEM); +#endif GtkCheckMenuItemClass * check_class = GTK_CHECK_MENU_ITEM_CLASS (klass); @@ -113,6 +115,13 @@ genericmenuitem_init (Genericmenuitem *self) self->priv->disposition = GENERICMENUITEM_DISPOSITION_NORMAL; self->priv->label_text = NULL; +#ifndef HAVE_GTK3 + AtkObject * aobj = gtk_widget_get_accessible(GTK_WIDGET(self)); + if (aobj != NULL) { + atk_object_set_role(aobj, ATK_ROLE_MENU_ITEM); + } +#endif + return; } -- cgit v1.2.3 From fd68aaf57b7b616434d6593f4b0627ec00fb7d97 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 2 Mar 2012 14:01:34 -0600 Subject: Track the theme changed signal so we ensure that we can drop it eventually --- libdbusmenu-gtk/parser.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index 019a304..bdfc3e2 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -44,6 +44,8 @@ typedef struct _ParserData GtkWidget *shell; GtkWidget *image; AtkObject *accessible; + + guint theme_changed_sig; } ParserData; typedef struct _RecurseContext @@ -212,6 +214,11 @@ parse_data_free (gpointer data) g_object_remove_weak_pointer(G_OBJECT(pdata->accessible), (gpointer*)&pdata->accessible); } + if (pdata != NULL && pdata->theme_changed_sig != 0) { + g_signal_handler_disconnect(gtk_icon_theme_get_default(), pdata->theme_changed_sig); + pdata->theme_changed_sig = 0; + } + g_free(pdata); return; @@ -572,7 +579,7 @@ construct_dbusmenu_for_widget (GtkWidget * widget) /* Watch for theme changes because if gicon changes, we want to send a different pixbuf. */ - g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), + pdata->theme_changed_sig = g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), "changed", G_CALLBACK(theme_changed_cb), widget); pdata->image = image; -- cgit v1.2.3 From 16848ad3b788226b2f247dea73895580eb5b2d71 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 2 Mar 2012 14:20:49 -0600 Subject: Changing 'update_icon' to take more variables so we can do more fun stuff with it soon! --- libdbusmenu-gtk/parser.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index bdfc3e2..b6595f5 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -61,6 +61,8 @@ static void accel_changed (GtkWidget * widget, static void checkbox_toggled (GtkWidget * widget, DbusmenuMenuitem * mi); static void update_icon (DbusmenuMenuitem * menuitem, + ParserData * pdata, + GtkImageMenuItem * gmenuitem, GtkImage * image); static GtkWidget * find_menu_label (GtkWidget * widget); static void label_notify_cb (GtkWidget * widget, @@ -575,7 +577,7 @@ construct_dbusmenu_for_widget (GtkWidget * widget) if (GTK_IS_IMAGE (image)) { - update_icon (mi, GTK_IMAGE (image)); + update_icon (mi, pdata, GTK_IMAGE_MENU_ITEM(widget), GTK_IMAGE (image)); /* Watch for theme changes because if gicon changes, we want to send a different pixbuf. */ @@ -744,7 +746,7 @@ checkbox_toggled (GtkWidget *widget, DbusmenuMenuitem *mi) } static void -update_icon (DbusmenuMenuitem *menuitem, GtkImage *image) +update_icon (DbusmenuMenuitem *menuitem, ParserData * pdata, GtkImageMenuItem * gmenuitem, GtkImage *image) { GdkPixbuf * pixbuf = NULL; const gchar * icon_name = NULL; @@ -953,7 +955,8 @@ image_notify_cb (GtkWidget *widget, pspec->name == g_intern_static_string ("stock") || pspec->name == g_intern_static_string ("storage-type")) { - update_icon (mi, GTK_IMAGE (widget)); + ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(mi), PARSER_DATA); + update_icon (mi, pdata, NULL, GTK_IMAGE (widget)); } } @@ -1141,13 +1144,15 @@ widget_notify_cb (GtkWidget *widget, { GtkWidget *image = NULL; g_object_get(widget, "image", &image, NULL); - update_icon (child, GTK_IMAGE(image)); + ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(child), PARSER_DATA); + update_icon (child, pdata, GTK_IMAGE_MENU_ITEM(widget), GTK_IMAGE(image)); } else if (pspec->name == g_intern_static_string ("image")) { GtkWidget *image; image = GTK_WIDGET (g_value_get_object (&prop_value)); - update_icon (child, GTK_IMAGE (image)); + ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(child), PARSER_DATA); + update_icon (child, pdata, GTK_IMAGE_MENU_ITEM(widget), GTK_IMAGE (image)); } else if (pspec->name == g_intern_static_string ("parent")) { @@ -1266,7 +1271,8 @@ theme_changed_cb (GtkIconTheme *theme, gpointer data) gpointer pmi = g_object_get_data(G_OBJECT(data), CACHED_MENUITEM); if (pmi != NULL) { - update_icon(DBUSMENU_MENUITEM(pmi), GTK_IMAGE(image)); + ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(pmi), PARSER_DATA); + update_icon(DBUSMENU_MENUITEM(pmi), pdata, NULL, GTK_IMAGE(image)); } /* Switch signal to new theme */ -- cgit v1.2.3 From 6f5a36c2abdad2fccc9848f34b3572c425abd39e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 2 Mar 2012 14:40:37 -0600 Subject: Moving the adding of signals to the update_icon function so that everyone gets them --- libdbusmenu-gtk/parser.c | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index b6595f5..1092485 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -578,18 +578,6 @@ construct_dbusmenu_for_widget (GtkWidget * widget) if (GTK_IS_IMAGE (image)) { update_icon (mi, pdata, GTK_IMAGE_MENU_ITEM(widget), GTK_IMAGE (image)); - - /* Watch for theme changes because if gicon changes, we want to send a - different pixbuf. */ - pdata->theme_changed_sig = g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), - "changed", G_CALLBACK(theme_changed_cb), widget); - - pdata->image = image; - g_signal_connect (G_OBJECT (image), - "notify", - G_CALLBACK (image_notify_cb), - mi); - g_object_add_weak_pointer(G_OBJECT (image), (gpointer*)&pdata->image); } } @@ -755,6 +743,38 @@ update_icon (DbusmenuMenuitem *menuitem, ParserData * pdata, GtkImageMenuItem * GtkIconInfo * info; gint width; + /* Check to see if we're changing the image. If so, we need to track + that little bugger */ + /* Why check for gmenuitem being NULL? Because there are some cases where + we can't get it easily, and those mean it's not changed just the icon + underneith, so we can ignore these larger impacts */ + if (image != GTK_IMAGE(pdata->image) && gmenuitem != NULL) { + if (pdata->theme_changed_sig != 0) { + g_signal_handler_disconnect(gtk_icon_theme_get_default(), pdata->theme_changed_sig); + pdata->theme_changed_sig = 0; + } + + pdata->theme_changed_sig = g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), + "changed", G_CALLBACK(theme_changed_cb), gmenuitem); + + if (pdata->image != NULL) { + g_signal_handlers_disconnect_by_func(pdata->image, G_CALLBACK(image_notify_cb), menuitem); + g_object_remove_weak_pointer(G_OBJECT(pdata->image), (gpointer*)&pdata->image); + } + + pdata->image = GTK_WIDGET(image); + + if (pdata->image != NULL) { + pdata->theme_changed_sig = g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), + "changed", G_CALLBACK(theme_changed_cb), gmenuitem); + g_signal_connect (G_OBJECT (pdata->image), + "notify", + G_CALLBACK (image_notify_cb), + menuitem); + g_object_add_weak_pointer(G_OBJECT (pdata->image), (gpointer*)&pdata->image); + } + } + if (image != NULL && should_show_image (image)) { switch (gtk_image_get_storage_type (image)) { case GTK_IMAGE_EMPTY: -- cgit v1.2.3 From e11292ff7e55e6eeeef7ebb9260b238601db49c7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 2 Mar 2012 15:19:45 -0600 Subject: Not sending the update signal if the value is being cleared and it was already cleared --- libdbusmenu-glib/menuitem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 18db4ef..46546d6 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -1253,7 +1253,8 @@ dbusmenu_menuitem_property_set_variant (DbusmenuMenuitem * mi, const gchar * pro becuse it has been unref'd when replaced in the hash table. But the fact that there was a value is the imporant part. */ - if (!inhash || replaced) { + if ((!inhash || replaced) && + !(!inhash && value == NULL)) { GVariant * signalval = value; if (signalval == NULL) { -- cgit v1.2.3 From e9c3459c80d3db095712b93992548ee03ae80b90 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 2 Mar 2012 15:26:08 -0600 Subject: Don't need to setup this signal twice --- libdbusmenu-gtk/parser.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index 1092485..70ffcea 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -754,9 +754,6 @@ update_icon (DbusmenuMenuitem *menuitem, ParserData * pdata, GtkImageMenuItem * pdata->theme_changed_sig = 0; } - pdata->theme_changed_sig = g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), - "changed", G_CALLBACK(theme_changed_cb), gmenuitem); - if (pdata->image != NULL) { g_signal_handlers_disconnect_by_func(pdata->image, G_CALLBACK(image_notify_cb), menuitem); g_object_remove_weak_pointer(G_OBJECT(pdata->image), (gpointer*)&pdata->image); -- cgit v1.2.3 -- cgit v1.2.3 From a19fad6da18d3aec7aed4a4cddf3aeeb87249319 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 8 Mar 2012 08:51:49 -0600 Subject: Switching out logic, we're using replaced now because it gets set everytime that the hashtable is modified, and if we weren't modifying the hash table in some way, we don't want to signal. And, conversely, no one cares if we didn't modify the hash table. --- libdbusmenu-glib/menuitem.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 46546d6..253fe6e 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -1253,8 +1253,7 @@ dbusmenu_menuitem_property_set_variant (DbusmenuMenuitem * mi, const gchar * pro becuse it has been unref'd when replaced in the hash table. But the fact that there was a value is the imporant part. */ - if ((!inhash || replaced) && - !(!inhash && value == NULL)) { + if (replaced) { GVariant * signalval = value; if (signalval == NULL) { -- cgit v1.2.3 From 9834879581e4f4ba16983b289c9b0442a48d5bdd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 8 Mar 2012 09:44:05 -0600 Subject: Fixing a trivial annotation bug --- libdbusmenu-glib/menuitem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 253fe6e..c81c36e 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -1462,8 +1462,8 @@ dbusmenu_menuitem_property_remove (DbusmenuMenuitem * mi, const gchar * property * by the menuitem but the list is not and should be freed using * g_list_free() when the calling function is done with it. * - * Return value: (transfer container): A list of strings or NULL if there are - * none. + * Return value: (transfer container) (element-type utf8): A list of + * strings or NULL if there are none. */ GList * dbusmenu_menuitem_properties_list (DbusmenuMenuitem * mi) -- cgit v1.2.3 From 1f223542ce9a8ae00d17928bd91e244793a76c24 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 8 Mar 2012 09:44:21 -0600 Subject: 0.5.93 --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 274875f..ddab2a6 100644 --- a/configure.ac +++ b/configure.ac @@ -1,11 +1,11 @@ -AC_INIT(libdbusmenu, 0.5.92, ted@canonical.com) +AC_INIT(libdbusmenu, 0.5.93, ted@canonical.com) AC_COPYRIGHT([Copyright 2009,2010 Canonical]) AC_PREREQ(2.62) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(libdbusmenu, 0.5.92, [-Wno-portability]) +AM_INIT_AUTOMAKE(libdbusmenu, 0.5.93, [-Wno-portability]) AM_MAINTAINER_MODE @@ -165,7 +165,7 @@ AC_PATH_PROG([XSLT_PROC], [xsltproc]) ########################### LIBDBUSMENU_CURRENT=4 -LIBDBUSMENU_REVISION=9 +LIBDBUSMENU_REVISION=10 LIBDBUSMENU_AGE=0 AC_SUBST(LIBDBUSMENU_CURRENT) -- cgit v1.2.3