diff options
Diffstat (limited to 'src/app-menu-item.c')
-rw-r--r-- | src/app-menu-item.c | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/src/app-menu-item.c b/src/app-menu-item.c index 6ed00a2..48aef3e 100644 --- a/src/app-menu-item.c +++ b/src/app-menu-item.c @@ -28,6 +28,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <gio/gdesktopappinfo.h> #include <libdbusmenu-glib/client.h> #include <libdbusmenu-glib/menuitem-proxy.h> +#include <libindicator/indicator-desktop-shortcuts.h> #include "app-menu-item.h" #include "dbus-data.h" @@ -55,6 +56,8 @@ struct _AppMenuItemPrivate DbusmenuClient * client; DbusmenuMenuitem * root; GList * shortcuts; + GList * static_shortcuts; + IndicatorDesktopShortcuts * ids; }; #define APP_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), APP_MENU_ITEM_TYPE, AppMenuItemPrivate)) @@ -131,6 +134,7 @@ app_menu_item_init (AppMenuItem *self) priv->client = NULL; priv->root = NULL; priv->shortcuts = NULL; + priv->static_shortcuts = NULL; dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); @@ -165,6 +169,17 @@ app_menu_item_dispose (GObject *object) priv->shortcuts = NULL; } + if (priv->static_shortcuts != NULL) { + g_list_foreach(priv->static_shortcuts, func_unref, object); + g_list_free(priv->static_shortcuts); + priv->static_shortcuts = NULL; + } + + if (priv->ids != NULL) { + g_object_unref(priv->ids); + priv->ids = NULL; + } + if (priv->root != NULL) { g_object_unref(priv->root); priv->root = NULL; @@ -201,6 +216,29 @@ app_menu_item_finalize (GObject *object) return; } +/* Respond to one of the shortcuts getting clicked on. */ +static void +nick_activate_cb (DbusmenuMenuitem * self, guint timestamp, gpointer data) +{ + gchar * nick = g_object_get_data(G_OBJECT(self), "ids-nick-data"); + AppMenuItem * mi = APP_MENU_ITEM(data); + + g_return_if_fail(nick != NULL); + g_return_if_fail(mi != NULL); + + AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(mi); + + g_return_if_fail(priv->ids != NULL); + + if (!indicator_desktop_shortcuts_nick_exec(priv->ids, nick)) { + g_warning("Unable to execute nick '%s' for desktop file '%s'", + nick, g_desktop_app_info_get_filename (priv->appinfo)); + } + + return; +} + + static void app_menu_item_set_appinfo (AppMenuItem *self, GDesktopAppInfo *appinfo) @@ -247,6 +285,24 @@ app_menu_item_set_appinfo (AppMenuItem *self, g_signal_emit(G_OBJECT(self), signals[NAME_CHANGED], 0, app_menu_item_get_name(self), TRUE); + /* Start to build static shortcuts */ + priv->ids = indicator_desktop_shortcuts_new(g_desktop_app_info_get_filename (priv->appinfo), "Messaging Menu"); + const gchar ** nicks = indicator_desktop_shortcuts_get_nicks(priv->ids); + gint i; + for (i = 0; nicks[i] != NULL; i++) { + DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_TYPE, APPLICATION_MENUITEM_TYPE); + g_object_set_data(G_OBJECT(mi), "ids-nick-data", (gpointer)nicks[i]); + + gchar *name = indicator_desktop_shortcuts_nick_get_name(priv->ids, nicks[i]); + dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, name); + g_free(name); + + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(nick_activate_cb), self); + + priv->static_shortcuts = g_list_append(priv->static_shortcuts, mi); + } + g_key_file_unref(keyfile); } @@ -574,5 +630,6 @@ app_menu_item_get_items (AppMenuItem * appitem) { g_return_val_if_fail(IS_APP_MENU_ITEM(appitem), NULL); AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(appitem); - return priv->shortcuts; + return g_list_concat (g_list_copy (priv->shortcuts), + g_list_copy (priv->static_shortcuts)); } |