diff options
author | Ted Gould <ted@gould.cx> | 2010-04-17 12:59:06 -0500 |
---|---|---|
committer | Ted Gould <ted@gould.cx> | 2010-04-17 12:59:06 -0500 |
commit | f4641dce597538d52bde59ca8f98a79d741f04e6 (patch) | |
tree | fefbc362578f5113e6d136632d775f66c6809c2e | |
parent | a05571c978dba6f33773a664bbb1672038fbad93 (diff) | |
parent | e879cc91687bded6248f806ee711c73bfc57fb8b (diff) | |
download | ayatana-indicator-messages-f4641dce597538d52bde59ca8f98a79d741f04e6.tar.gz ayatana-indicator-messages-f4641dce597538d52bde59ca8f98a79d741f04e6.tar.bz2 ayatana-indicator-messages-f4641dce597538d52bde59ca8f98a79d741f04e6.zip |
Ensure that we cleanup proxy items as shortcuts.
-rw-r--r-- | src/app-menu-item.c | 73 | ||||
-rw-r--r-- | src/app-menu-item.h | 6 | ||||
-rw-r--r-- | src/messages-service.c | 80 |
3 files changed, 85 insertions, 74 deletions
diff --git a/src/app-menu-item.c b/src/app-menu-item.c index ef30333..c276a90 100644 --- a/src/app-menu-item.c +++ b/src/app-menu-item.c @@ -36,7 +36,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>. enum { COUNT_CHANGED, NAME_CHANGED, - SHORTCUTS_CHANGED, + SHORTCUT_ADDED, + SHORTCUT_REMOVED, LAST_SIGNAL }; @@ -100,13 +101,20 @@ app_menu_item_class_init (AppMenuItemClass *klass) NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); - signals[SHORTCUTS_CHANGED] = g_signal_new(APP_MENU_ITEM_SIGNAL_SHORTCUTS_CHANGED, + signals[SHORTCUT_ADDED] = g_signal_new(APP_MENU_ITEM_SIGNAL_SHORTCUT_ADDED, G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppMenuItemClass, shortcuts_changed), + G_STRUCT_OFFSET (AppMenuItemClass, shortcut_added), NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + signals[SHORTCUT_REMOVED] = g_signal_new(APP_MENU_ITEM_SIGNAL_SHORTCUT_REMOVED, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AppMenuItemClass, shortcut_removed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); return; } @@ -137,6 +145,7 @@ app_menu_item_init (AppMenuItem *self) static void func_unref (gpointer data, gpointer user_data) { + g_signal_emit(user_data, signals[SHORTCUT_REMOVED], 0, data, TRUE); g_object_unref(G_OBJECT(data)); return; } @@ -155,10 +164,9 @@ app_menu_item_dispose (GObject *object) } if (priv->shortcuts != NULL) { - g_list_foreach(priv->shortcuts, func_unref, NULL); + g_list_foreach(priv->shortcuts, func_unref, object); g_list_free(priv->shortcuts); priv->shortcuts = NULL; - g_signal_emit(object, signals[SHORTCUTS_CHANGED], 0, TRUE); } if (priv->root != NULL) { @@ -351,7 +359,7 @@ child_added_cb (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint positio priv->shortcuts = g_list_insert(priv->shortcuts, mip, position); - g_signal_emit(G_OBJECT(data), signals[SHORTCUTS_CHANGED], 0, TRUE); + g_signal_emit(G_OBJECT(data), signals[SHORTCUT_ADDED], 0, mip, TRUE); return; } @@ -377,10 +385,10 @@ child_removed_cb (DbusmenuMenuitem * root, DbusmenuMenuitem * child, gpointer da if (pitems != NULL) { DbusmenuMenuitemProxy * mip = DBUSMENU_MENUITEM_PROXY(pitems->data); - g_object_unref(mip); priv->shortcuts = g_list_remove(priv->shortcuts, mip); - g_signal_emit(G_OBJECT(data), signals[SHORTCUTS_CHANGED], 0, TRUE); + g_signal_emit(G_OBJECT(data), signals[SHORTCUT_REMOVED], 0, mip, TRUE); + g_object_unref(mip); } return; @@ -406,7 +414,7 @@ child_moved_cb (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint newpos, if (mip != NULL) { priv->shortcuts = g_list_remove(priv->shortcuts, mip); priv->shortcuts = g_list_insert(priv->shortcuts, mip, newpos); - g_signal_emit(G_OBJECT(data), signals[SHORTCUTS_CHANGED], 0, TRUE); + g_signal_emit(G_OBJECT(data), signals[SHORTCUT_ADDED], 0, NULL, TRUE); } return; @@ -420,12 +428,10 @@ root_changed (DbusmenuClient * client, DbusmenuMenuitem * newroot, gpointer data g_debug("Root Changed"); AppMenuItem * self = APP_MENU_ITEM(data); AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self); - gboolean change_time = FALSE; if (priv->root != NULL) { if (dbusmenu_menuitem_get_children(DBUSMENU_MENUITEM(priv->root)) != NULL) { - change_time = TRUE; - g_list_foreach(priv->shortcuts, func_unref, NULL); + g_list_foreach(priv->shortcuts, func_unref, data); g_list_free(priv->shortcuts); priv->shortcuts = NULL; } @@ -436,27 +442,26 @@ root_changed (DbusmenuClient * client, DbusmenuMenuitem * newroot, gpointer data /* We need to proxy the new root across to the old world of indicator land. */ priv->root = newroot; - g_object_ref(priv->root); - g_signal_connect(G_OBJECT(priv->root), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added_cb), self); - g_signal_connect(G_OBJECT(priv->root), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(child_removed_cb), self); - g_signal_connect(G_OBJECT(priv->root), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved_cb), self); - - /* See if we have any menuitems to worry about, - otherwise we'll just move along. */ - GList * children = dbusmenu_menuitem_get_children(DBUSMENU_MENUITEM(priv->root)); - if (children != NULL) { - change_time = TRUE; - g_debug("\tProcessing %d children", g_list_length(children)); - while (children != NULL) { - DbusmenuMenuitemProxy * mip = dbusmenu_menuitem_proxy_new(DBUSMENU_MENUITEM(children->data)); - dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(mip), DBUSMENU_MENUITEM_PROP_ICON_NAME, DBUSMENU_MENUITEM_ICON_NAME_BLANK); - priv->shortcuts = g_list_append(priv->shortcuts, mip); - children = g_list_next(children); - } - } - if (change_time) { - g_signal_emit(G_OBJECT(self), signals[SHORTCUTS_CHANGED], 0, TRUE); + if (priv->root != NULL) { + g_object_ref(priv->root); + g_signal_connect(G_OBJECT(priv->root), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added_cb), self); + g_signal_connect(G_OBJECT(priv->root), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(child_removed_cb), self); + g_signal_connect(G_OBJECT(priv->root), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved_cb), self); + + /* See if we have any menuitems to worry about, + otherwise we'll just move along. */ + GList * children = dbusmenu_menuitem_get_children(DBUSMENU_MENUITEM(priv->root)); + if (children != NULL) { + g_debug("\tProcessing %d children", g_list_length(children)); + while (children != NULL) { + DbusmenuMenuitemProxy * mip = dbusmenu_menuitem_proxy_new(DBUSMENU_MENUITEM(children->data)); + dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(mip), DBUSMENU_MENUITEM_PROP_ICON_NAME, DBUSMENU_MENUITEM_ICON_NAME_BLANK); + priv->shortcuts = g_list_append(priv->shortcuts, mip); + g_signal_emit(G_OBJECT(self), signals[SHORTCUT_ADDED], 0, mip, TRUE); + children = g_list_next(children); + } + } } return; diff --git a/src/app-menu-item.h b/src/app-menu-item.h index 48a7cfa..d616856 100644 --- a/src/app-menu-item.h +++ b/src/app-menu-item.h @@ -39,7 +39,8 @@ G_BEGIN_DECLS #define APP_MENU_ITEM_SIGNAL_COUNT_CHANGED "count-changed" #define APP_MENU_ITEM_SIGNAL_NAME_CHANGED "name-changed" -#define APP_MENU_ITEM_SIGNAL_SHORTCUTS_CHANGED "shortcuts-changed" +#define APP_MENU_ITEM_SIGNAL_SHORTCUT_ADDED "shortcut-added" +#define APP_MENU_ITEM_SIGNAL_SHORTCUT_REMOVED "shortcut-removed" typedef struct _AppMenuItem AppMenuItem; typedef struct _AppMenuItemClass AppMenuItemClass; @@ -49,7 +50,8 @@ struct _AppMenuItemClass { void (* count_changed) (guint count); void (* name_changed) (gchar * name); - void (* shortcuts_changed) (void); + void (* shortcut_added) (DbusmenuMenuitem * mi); + void (* shortcut_removed) (DbusmenuMenuitem * mi); }; struct _AppMenuItem { diff --git a/src/messages-service.c b/src/messages-service.c index 88da0e0..99e907a 100644 --- a/src/messages-service.c +++ b/src/messages-service.c @@ -55,7 +55,8 @@ static MessageServiceDbus * dbus_interface = NULL; #define DESKTOP_FILE_GROUP "Messaging Menu" #define DESKTOP_FILE_KEY_DESKTOP "DesktopFile" -static void server_shortcuts_changed (AppMenuItem * appitem, gpointer data); +static void server_shortcut_added (AppMenuItem * appitem, DbusmenuMenuitem * mi, gpointer data); +static void server_shortcut_removed (AppMenuItem * appitem, DbusmenuMenuitem * mi, gpointer data); static void server_count_changed (AppMenuItem * appitem, guint count, gpointer data); static void server_name_changed (AppMenuItem * appitem, gchar * name, gpointer data); static void im_time_changed (ImMenuItem * imitem, glong seconds, gpointer data); @@ -582,7 +583,8 @@ server_added (IndicateListener * listener, IndicateListenerServer * server, gcha /* Connect the signals up to the menu item */ g_signal_connect(G_OBJECT(menuitem), APP_MENU_ITEM_SIGNAL_COUNT_CHANGED, G_CALLBACK(server_count_changed), sl_item); g_signal_connect(G_OBJECT(menuitem), APP_MENU_ITEM_SIGNAL_NAME_CHANGED, G_CALLBACK(server_name_changed), menushell); - g_signal_connect(G_OBJECT(menuitem), APP_MENU_ITEM_SIGNAL_SHORTCUTS_CHANGED, G_CALLBACK(server_shortcuts_changed), menushell); + g_signal_connect(G_OBJECT(menuitem), APP_MENU_ITEM_SIGNAL_SHORTCUT_ADDED, G_CALLBACK(server_shortcut_added), menushell); + g_signal_connect(G_OBJECT(menuitem), APP_MENU_ITEM_SIGNAL_SHORTCUT_REMOVED, G_CALLBACK(server_shortcut_removed), menushell); /* Put our new menu item in, with the separator behind it. resort_menu will take care of whether it should be hidden @@ -605,47 +607,26 @@ server_added (IndicateListener * listener, IndicateListenerServer * server, gcha return; } -/* The shortcuts have changed, let's just remove them and put - the back. */ +/* Server shortcut has been added */ static void -server_shortcuts_changed (AppMenuItem * appitem, gpointer data) +server_shortcut_added (AppMenuItem * appitem, DbusmenuMenuitem * mi, gpointer data) { - g_debug("Application Shortcuts changed"); + g_debug("Application Shortcut added: %s", mi != NULL ? dbusmenu_menuitem_property_get(mi, DBUSMENU_MENUITEM_PROP_LABEL) : "none"); DbusmenuMenuitem * shell = DBUSMENU_MENUITEM(data); - gboolean appitemfound = FALSE; - GList * children = dbusmenu_menuitem_get_children(shell); - GList * removelist = NULL; - - while (children != NULL) { - if (!appitemfound && children->data != appitem) { - children = g_list_next(children); - continue; - } - appitemfound = TRUE; - - if (!DBUSMENU_IS_MENUITEM_PROXY(children->data)) { - break; - } - - removelist = g_list_prepend(removelist, children->data); - } - - GList * removeitem; - for (removeitem = removelist; removeitem != NULL; removeitem = g_list_next(removeitem)) { - dbusmenu_menuitem_child_delete(shell, DBUSMENU_MENUITEM(removeitem->data)); - } - g_list_free(removeitem); - - GList * shortcuts = app_menu_item_get_items(appitem); - while (shortcuts != NULL) { - DbusmenuMenuitem * mi = DBUSMENU_MENUITEM(shortcuts->data); - g_debug("\tAdding shortcut: %s", dbusmenu_menuitem_property_get(mi, DBUSMENU_MENUITEM_PROP_LABEL)); + if (mi != NULL) { dbusmenu_menuitem_child_append(shell, mi); - shortcuts = g_list_next(shortcuts); } - resort_menu(shell); + return; +} +/* Server shortcut has been removed */ +static void +server_shortcut_removed (AppMenuItem * appitem, DbusmenuMenuitem * mi, gpointer data) +{ + g_debug("Application Shortcut removed: %s", mi != NULL ? dbusmenu_menuitem_property_get(mi, DBUSMENU_MENUITEM_PROP_LABEL) : "none"); + DbusmenuMenuitem * shell = DBUSMENU_MENUITEM(data); + dbusmenu_menuitem_child_delete(shell, mi); return; } @@ -756,16 +737,31 @@ server_removed (IndicateListener * listener, IndicateListenerServer * server, gc /* If there is a menu item, let's get rid of it. */ if (sltp->menuitem != NULL) { - dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(sltp->menuitem), DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + /* If there are shortcuts remove them */ + GList * shortcuts = app_menu_item_get_items(sltp->menuitem); + while (shortcuts != NULL) { + g_debug("\tRemoving shortcut: %s", dbusmenu_menuitem_property_get(DBUSMENU_MENUITEM(shortcuts->data), DBUSMENU_MENUITEM_PROP_LABEL)); + dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(shortcuts->data), DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_child_delete(DBUSMENU_MENUITEM(data), DBUSMENU_MENUITEM(shortcuts->data)); + shortcuts = g_list_next(shortcuts); + } + + g_debug("\tRemoving item"); + dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(sltp->menuitem), DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); dbusmenu_menuitem_child_delete(DBUSMENU_MENUITEM(data), DBUSMENU_MENUITEM(sltp->menuitem)); g_object_unref(G_OBJECT(sltp->menuitem)); + } else { + g_debug("\tNo menuitem"); } - + /* If there is a separator, let's get rid of it. */ if (sltp->separator != NULL) { + g_debug("\tRemoving separator"); dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(sltp->separator), DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); dbusmenu_menuitem_child_delete(DBUSMENU_MENUITEM(data), DBUSMENU_MENUITEM(sltp->separator)); g_object_unref(G_OBJECT(sltp->separator)); + } else { + g_debug("\tNo separator"); } if (sltp->attention) { @@ -1263,6 +1259,14 @@ destroy_launcher (gpointer data) g_list_free(li->appdiritems); if (li->menuitem != NULL) { + /* If there are shortcuts remove them */ + GList * shortcuts = launcher_menu_item_get_items(li->menuitem); + while (shortcuts != NULL) { + dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(shortcuts->data), DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + dbusmenu_menuitem_child_delete(DBUSMENU_MENUITEM(data), DBUSMENU_MENUITEM(shortcuts->data)); + shortcuts = g_list_next(shortcuts); + } + dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(li->menuitem), DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); dbusmenu_menuitem_child_delete(root_menuitem, DBUSMENU_MENUITEM(li->menuitem)); g_object_unref(G_OBJECT(li->menuitem)); |