diff options
Diffstat (limited to 'libdbusmenu-gtk/client.c')
-rw-r--r-- | libdbusmenu-gtk/client.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 60af93f..d345313 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -130,16 +130,31 @@ dbusmenu_gtkclient_init (DbusmenuGtkClient *self) return; } +static void +clear_shortcut_foreach (DbusmenuMenuitem *mi, gpointer gclient) +{ + guint key = 0; + GtkMenuItem * gmi; + GdkModifierType mod = 0; + DbusmenuGtkClient * client = DBUSMENU_GTKCLIENT (gclient); + + gmi = dbusmenu_gtkclient_menuitem_get (client, mi); + dbusmenu_gtkclient_menuitem_get (client, mi); + dbusmenu_menuitem_property_get_shortcut (mi, &key, &mod); + if (key) + gtk_widget_remove_accelerator (GTK_WIDGET (gmi), client->priv->agroup, key, mod); +} + /* Just calling the super class. Future use. */ static void dbusmenu_gtkclient_dispose (GObject *object) { - DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(object); + DbusmenuMenuitem * root; + DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT(object)->priv; - if (priv->agroup != NULL) { - g_object_unref(priv->agroup); - priv->agroup = NULL; - } + if ((root = dbusmenu_client_get_root (DBUSMENU_CLIENT(object)))) + dbusmenu_menuitem_foreach (root, clear_shortcut_foreach, object); + g_clear_object (&priv->agroup); if (priv->old_themedirs) { remove_theme_dirs(gtk_icon_theme_get_default(), priv->old_themedirs); @@ -161,7 +176,6 @@ dbusmenu_gtkclient_dispose (GObject *object) static void dbusmenu_gtkclient_finalize (GObject *object) { - G_OBJECT_CLASS (dbusmenu_gtkclient_parent_class)->finalize (object); return; } @@ -193,7 +207,7 @@ theme_dir_ref (GtkIconTheme * theme, GHashTable * db, const gchar * dir) return; } -/* Unreference the theme directory, and if it's count goes to zero then +/* Unreference the theme directory, and if its count goes to zero then we need to remove it from the search path. */ static void theme_dir_unref (GtkIconTheme * theme, GHashTable * db, const gchar * dir) @@ -361,8 +375,6 @@ do_swap_agroup (DbusmenuMenuitem * mi, gpointer userdata) { static void swap_agroup (DbusmenuMenuitem *mi, gpointer userdata) { do_swap_agroup (mi, userdata); - - return; /* See what I did here, Ted? :) */ } /* Refresh the shortcut for an entry */ @@ -462,7 +474,7 @@ static const gchar * data_delayed_close = "dbusmenugtk-data-delayed-close"; static void menu_item_start_activating(DbusmenuMenuitem * mi) { - /* Mark this item and all it's parents as activating */ + /* Mark this item and all its parents as activating */ DbusmenuMenuitem * parent = mi; do { g_object_set_data(G_OBJECT(parent), data_activating, @@ -485,7 +497,7 @@ menu_item_stop_activating(DbusmenuMenuitem * mi) if (!menu_item_is_activating(mi)) return; - /* Mark this item and all it's parents as not activating and finally + /* Mark this item and all its parents as not activating and finally send their queued close event. */ g_object_set_data(G_OBJECT(mi), data_activating, GINT_TO_POINTER(FALSE)); @@ -1180,7 +1192,11 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, GVariant /* If we have an image already built from a name that is way better than a pixbuf. Keep it. */ if (gtkimage != NULL && (gtk_image_get_storage_type(GTK_IMAGE(gtkimage)) == GTK_IMAGE_ICON_NAME || gtk_image_get_storage_type(GTK_IMAGE(gtkimage)) == GTK_IMAGE_EMPTY)) { - return; + const gchar *icon_name = NULL; + gtk_image_get_icon_name (GTK_IMAGE(gtkimage), &icon_name, NULL); + if ((icon_name != NULL) && gtk_icon_theme_has_icon(gtk_icon_theme_get_default(), icon_name)) { + return; + } } } |