aboutsummaryrefslogtreecommitdiff
path: root/src/app-menu-item.c
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2012-05-24 22:28:40 +0200
committerLars Uebernickel <lars.uebernickel@canonical.com>2012-05-24 22:28:40 +0200
commite1c600ba95e4520caf471ebf2eb9f41e2580fa98 (patch)
treedb42c23a55c34af9c8a484d55734d4c7d73b1235 /src/app-menu-item.c
parent8960bbafb9805c1e787e70bb2289cb8bc95a5f30 (diff)
downloadayatana-indicator-messages-e1c600ba95e4520caf471ebf2eb9f41e2580fa98.tar.gz
ayatana-indicator-messages-e1c600ba95e4520caf471ebf2eb9f41e2580fa98.tar.bz2
ayatana-indicator-messages-e1c600ba95e4520caf471ebf2eb9f41e2580fa98.zip
Port to gmenu, act I
Work-in-progress of the gmenu port for the service. The bulk of this patch removes everything related to libindicate from the service. Only the static app launchers and their configured shortcut actions are exported for now.
Diffstat (limited to 'src/app-menu-item.c')
-rw-r--r--src/app-menu-item.c474
1 files changed, 62 insertions, 412 deletions
diff --git a/src/app-menu-item.c b/src/app-menu-item.c
index 48aef3e..b5d4994 100644
--- a/src/app-menu-item.c
+++ b/src/app-menu-item.c
@@ -26,17 +26,13 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <glib/gi18n.h>
#include <gio/gdesktopappinfo.h>
-#include <libdbusmenu-glib/client.h>
-#include <libdbusmenu-glib/menuitem-proxy.h>
+#include <gio/gio.h>
#include <libindicator/indicator-desktop-shortcuts.h>
#include "app-menu-item.h"
#include "dbus-data.h"
enum {
- COUNT_CHANGED,
NAME_CHANGED,
- SHORTCUT_ADDED,
- SHORTCUT_REMOVED,
LAST_SIGNAL
};
@@ -46,18 +42,13 @@ typedef struct _AppMenuItemPrivate AppMenuItemPrivate;
struct _AppMenuItemPrivate
{
- IndicateListener * listener;
- IndicateListenerServer * server;
-
- gchar * type;
GDesktopAppInfo * appinfo;
guint unreadcount;
- DbusmenuClient * client;
- DbusmenuMenuitem * root;
- GList * shortcuts;
- GList * static_shortcuts;
IndicatorDesktopShortcuts * ids;
+
+ GMenu *menu;
+ GSimpleActionGroup *static_shortcuts;
};
#define APP_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), APP_MENU_ITEM_TYPE, AppMenuItemPrivate))
@@ -66,16 +57,12 @@ struct _AppMenuItemPrivate
static void app_menu_item_class_init (AppMenuItemClass *klass);
static void app_menu_item_init (AppMenuItem *self);
static void app_menu_item_dispose (GObject *object);
-static void app_menu_item_finalize (GObject *object);
-static void activate_cb (AppMenuItem * self, guint timestamp, gpointer data);
-static void count_changed (IndicateListener * listener, IndicateListenerServer * server, guint count, gpointer data);
-static void count_cb (IndicateListener * listener, IndicateListenerServer * server, guint value, gpointer data);
-static void menu_cb (IndicateListener * listener, IndicateListenerServer * server, const gchar * menupath, gpointer data);
-static void desktop_cb (IndicateListener * listener, IndicateListenerServer * server, const gchar * value, gpointer data);
-static void update_label (AppMenuItem * self);
+static void activate_cb (GSimpleAction *action,
+ GVariant *param,
+ gpointer userdata);
/* GObject Boilerplate */
-G_DEFINE_TYPE (AppMenuItem, app_menu_item, DBUSMENU_TYPE_MENUITEM);
+G_DEFINE_TYPE (AppMenuItem, app_menu_item, G_TYPE_OBJECT);
static void
app_menu_item_class_init (AppMenuItemClass *klass)
@@ -85,15 +72,7 @@ app_menu_item_class_init (AppMenuItemClass *klass)
g_type_class_add_private (klass, sizeof (AppMenuItemPrivate));
object_class->dispose = app_menu_item_dispose;
- object_class->finalize = app_menu_item_finalize;
- signals[COUNT_CHANGED] = g_signal_new(APP_MENU_ITEM_SIGNAL_COUNT_CHANGED,
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (AppMenuItemClass, count_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1, G_TYPE_UINT);
signals[NAME_CHANGED] = g_signal_new(APP_MENU_ITEM_SIGNAL_NAME_CHANGED,
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
@@ -101,22 +80,6 @@ app_menu_item_class_init (AppMenuItemClass *klass)
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1, G_TYPE_STRING);
- 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, shortcut_added),
- NULL, NULL,
- 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;
}
static void
@@ -125,71 +88,29 @@ app_menu_item_init (AppMenuItem *self)
g_debug("Building new App Menu Item");
AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
- priv->listener = NULL;
- priv->server = NULL;
- priv->type = NULL;
priv->appinfo = NULL;
priv->unreadcount = 0;
- 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);
+ priv->menu = g_menu_new ();
+ priv->static_shortcuts = g_simple_action_group_new ();
return;
}
-/* A wrapper to make the prototypes work for GFunc */
-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;
-}
-
-/* Disconnect the count_changed signal and unref the listener */
static void
app_menu_item_dispose (GObject *object)
{
AppMenuItem * self = APP_MENU_ITEM(object);
AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
- if (priv->listener != NULL) {
- g_signal_handlers_disconnect_by_func(G_OBJECT(priv->listener), count_changed, self);
- g_object_unref(priv->listener);
- priv->listener = NULL;
- }
-
- if (priv->shortcuts != NULL) {
- g_list_foreach(priv->shortcuts, func_unref, object);
- g_list_free(priv->shortcuts);
- 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;
- }
+ g_clear_object (&priv->menu);
+ g_clear_object (&priv->static_shortcuts);
if (priv->ids != NULL) {
g_object_unref(priv->ids);
priv->ids = NULL;
}
- if (priv->root != NULL) {
- g_object_unref(priv->root);
- priv->root = NULL;
- }
-
- if (priv->client != NULL) {
- g_object_unref(priv->client);
- priv->client = NULL;
- }
-
if (priv->appinfo != NULL) {
g_object_unref(priv->appinfo);
priv->appinfo = NULL;
@@ -198,34 +119,14 @@ app_menu_item_dispose (GObject *object)
G_OBJECT_CLASS (app_menu_item_parent_class)->dispose (object);
}
-/* Free the memory used by our type, desktop file and application
- info structures. */
-static void
-app_menu_item_finalize (GObject *object)
-{
- AppMenuItem * self = APP_MENU_ITEM(object);
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
-
- if (priv->type != NULL) {
- g_free(priv->type);
- priv->type = NULL;
- }
-
- G_OBJECT_CLASS (app_menu_item_parent_class)->finalize (object);
-
- return;
-}
-
/* Respond to one of the shortcuts getting clicked on. */
static void
-nick_activate_cb (DbusmenuMenuitem * self, guint timestamp, gpointer data)
+nick_activate_cb (GSimpleAction *action,
+ GVariant *param,
+ gpointer userdata)
{
- 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);
-
+ const gchar * nick = g_action_get_name (G_ACTION (action));
+ AppMenuItem * mi = APP_MENU_ITEM (userdata);
AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(mi);
g_return_if_fail(priv->ids != NULL);
@@ -234,29 +135,24 @@ nick_activate_cb (DbusmenuMenuitem * self, guint timestamp, gpointer data)
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)
{
AppMenuItemPrivate *priv = APP_MENU_ITEM_GET_PRIVATE (self);
+ GSimpleAction *launch;
+ GMenuItem *menuitem;
GKeyFile *keyfile;
gchar *iconstr = NULL;
+ gchar *label;
g_return_if_fail (appinfo != NULL);
g_clear_object (&priv->appinfo);
priv->appinfo = g_object_ref (appinfo);
- dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
- dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_RUNNING, TRUE);
-
- update_label(self);
-
keyfile = g_key_file_new();
g_key_file_load_from_file(keyfile, g_desktop_app_info_get_filename (appinfo), G_KEY_FILE_NONE, NULL);
@@ -280,29 +176,47 @@ app_menu_item_set_appinfo (AppMenuItem *self,
iconstr = g_icon_to_string(icon);
}
- dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_ICON, iconstr);
- g_free(iconstr);
+ launch = g_simple_action_new ("launch", NULL);
+ g_signal_connect (launch, "activate", G_CALLBACK (activate_cb), self);
+ g_simple_action_group_insert (priv->static_shortcuts, G_ACTION (launch));
- g_signal_emit(G_OBJECT(self), signals[NAME_CHANGED], 0, app_menu_item_get_name(self), TRUE);
+ if (priv->unreadcount > 0)
+ label = g_strdup_printf("%s (%d)", app_menu_item_get_name (self), priv->unreadcount);
+ else
+ label = g_strdup(app_menu_item_get_name (self));
+
+ menuitem = g_menu_item_new (label, "launch");
+ g_menu_item_set_attribute (menuitem, INDICATOR_MENU_ATTRIBUTE_ICON_NAME, "s", iconstr);
+ g_menu_append_item (priv->menu, menuitem);
/* 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;
+ GSimpleAction *action;
+ GMenuItem *item;
- 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);
+ name = indicator_desktop_shortcuts_nick_get_name(priv->ids, nicks[i]);
+
+ action = g_simple_action_new (name, NULL);
+ g_signal_connect(action, "activate", G_CALLBACK (nick_activate_cb), self);
+ g_simple_action_group_insert (priv->static_shortcuts, G_ACTION (action));
- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(nick_activate_cb), self);
+ item = g_menu_item_new (name, name);
+ g_menu_append_item (priv->menu, item);
- priv->static_shortcuts = g_list_append(priv->static_shortcuts, mi);
+ g_object_unref (item);
+ g_free(name);
}
+ g_signal_emit(G_OBJECT(self), signals[NAME_CHANGED], 0, app_menu_item_get_name(self), TRUE);
+
+ g_free(label);
+ g_free(iconstr);
+ g_object_unref (launch);
+ g_object_unref (menuitem);
g_key_file_unref(keyfile);
}
@@ -315,269 +229,19 @@ app_menu_item_new (GDesktopAppInfo *appinfo)
return self;
}
-AppMenuItem *
-app_menu_item_new_with_server (IndicateListener * listener, IndicateListenerServer * server)
-{
- AppMenuItem * self = g_object_new(APP_MENU_ITEM_TYPE, NULL);
- app_menu_item_set_server (self, listener, server);
- return self;
-}
-
-void
-app_menu_item_set_server (AppMenuItem *self,
- IndicateListener *listener,
- IndicateListenerServer *server)
-{
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
-
- /* only allow setting this once */
- g_return_if_fail (priv->listener == NULL && priv->server == NULL);
-
- /* Copy the listener so we can use it later */
- priv->listener = listener;
- g_object_ref(G_OBJECT(listener));
-
- /* Can not ref as not real GObject */
- priv->server = server;
-
- dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, APPLICATION_MENUITEM_TYPE);
-
- /* Set up listener signals */
- g_signal_connect(G_OBJECT(listener), INDICATE_LISTENER_SIGNAL_SERVER_COUNT_CHANGED, G_CALLBACK(count_changed), self);
-
- /* Get the values we care about from the server */
- indicate_listener_server_get_desktop(listener, server, desktop_cb, self);
- indicate_listener_server_get_count(listener, server, count_cb, self);
- indicate_listener_server_get_menu(listener, server, menu_cb, self);
-
- g_signal_connect(G_OBJECT(self), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), NULL);
-
- indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_SERVER_DISPLAY);
- indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_SERVER_SIGNAL);
- indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_COUNT);
- indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_DISPLAY);
- indicate_listener_server_show_interest(listener, server, INDICATE_INTEREST_INDICATOR_SIGNAL);
- indicate_listener_set_server_max_indicators(listener, server, MAX_NUMBER_OF_INDICATORS);
-}
-
static void
-update_label (AppMenuItem * self)
+activate_cb (GSimpleAction *action,
+ GVariant *param,
+ gpointer userdata)
{
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
- const gchar * name = app_menu_item_get_name(self);
-
- if (priv->unreadcount > 0) {
- /* TRANSLATORS: This is the name of the program and the number of indicators. So it
- would read something like "Mail Client (5)" */
- gchar * label = g_strdup_printf(_("%s (%d)"), _(name), priv->unreadcount);
- dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_NAME, label);
- g_free(label);
- } else {
- dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_NAME, _(name));
- }
-
- return;
-}
-
-/* Callback to the signal that the server count
- has changed to a new value. This checks to see if
- it's actually changed and if so signals everyone and
- updates the label. */
-static void
-count_changed (IndicateListener * listener, IndicateListenerServer * server, guint count, gpointer data)
-{
- g_return_if_fail(IS_APP_MENU_ITEM(data));
- AppMenuItem * self = APP_MENU_ITEM(data);
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
-
- if (priv->unreadcount != count) {
- priv->unreadcount = count;
- update_label(self);
- g_signal_emit(G_OBJECT(self), signals[COUNT_CHANGED], 0, priv->unreadcount, TRUE);
- }
-
- return;
-}
-
-/* Callback for getting the count property off
- of the server. */
-static void
-count_cb (IndicateListener * listener, IndicateListenerServer * server, guint value, gpointer data)
-{
- count_changed(listener, server, value, data);
- return;
-}
-
-/* Callback for when we ask the server for the path
- to it's desktop file. We then turn it into an
- app structure and start sucking data out of it.
- Mostly the name. And the icon. */
-static void
-desktop_cb (IndicateListener * listener, IndicateListenerServer * server, const gchar * value, gpointer data)
-{
- g_return_if_fail(IS_APP_MENU_ITEM(data));
- AppMenuItem * self = APP_MENU_ITEM(data);
- GDesktopAppInfo *appinfo;
-
- if (value == NULL || value[0] == '\0') {
- return;
- }
-
- appinfo = g_desktop_app_info_new_from_filename(value);
- app_menu_item_set_appinfo (self, appinfo);
- g_object_unref (appinfo);
-}
-
-/* Relay this signal into causing a rebuild of the shortcuts
- from those above us. */
-static void
-child_added_cb (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint position, gpointer data)
-{
- g_return_if_fail(IS_APP_MENU_ITEM(data));
- AppMenuItem * self = APP_MENU_ITEM(data);
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
- DbusmenuMenuitemProxy * mip = dbusmenu_menuitem_proxy_new(child);
-
- priv->shortcuts = g_list_insert(priv->shortcuts, mip, position);
-
- g_signal_emit(G_OBJECT(data), signals[SHORTCUT_ADDED], 0, mip, TRUE);
- return;
-}
-
-/* Relay this signal into causing a rebuild of the shortcuts
- from those above us. */
-static void
-child_removed_cb (DbusmenuMenuitem * root, DbusmenuMenuitem * child, gpointer data)
-{
- g_return_if_fail(IS_APP_MENU_ITEM(data));
- AppMenuItem * self = APP_MENU_ITEM(data);
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
-
- GList * pitems = priv->shortcuts;
- while (pitems != NULL) {
- DbusmenuMenuitemProxy * mip = DBUSMENU_MENUITEM_PROXY(pitems->data);
-
- if (dbusmenu_menuitem_proxy_get_wrapped(mip) == child) {
- break;
- }
-
- pitems = g_list_next(pitems);
- }
-
- if (pitems != NULL) {
- DbusmenuMenuitemProxy * mip = DBUSMENU_MENUITEM_PROXY(pitems->data);
- priv->shortcuts = g_list_remove(priv->shortcuts, mip);
-
- g_signal_emit(G_OBJECT(data), signals[SHORTCUT_REMOVED], 0, mip, TRUE);
- g_object_unref(mip);
- }
-
- return;
-}
-
-/* Relay this signal into causing a rebuild of the shortcuts
- from those above us. */
-static void
-child_moved_cb (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint newpos, guint oldpos, gpointer data)
-{
- g_return_if_fail(IS_APP_MENU_ITEM(data));
- AppMenuItem * self = APP_MENU_ITEM(data);
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
-
- DbusmenuMenuitemProxy * mip = DBUSMENU_MENUITEM_PROXY(g_list_nth_data(priv->shortcuts, oldpos));
-
- if (mip != NULL) {
- if (dbusmenu_menuitem_proxy_get_wrapped(mip) != child) {
- mip = NULL;
- }
- }
-
- 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[SHORTCUT_ADDED], 0, NULL, TRUE);
- }
-
- return;
-}
-
-/* We've got a new root. We need to proxy it and handle it's children
- if that's a relevant thing to do. */
-static void
-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);
-
- if (priv->root != NULL) {
- if (dbusmenu_menuitem_get_children(DBUSMENU_MENUITEM(priv->root)) != NULL) {
- g_list_foreach(priv->shortcuts, func_unref, data);
- g_list_free(priv->shortcuts);
- priv->shortcuts = NULL;
- }
- g_object_unref(priv->root);
- priv->root = NULL;
- }
-
- /* We need to proxy the new root across to the old
- world of indicator land. */
- priv->root = newroot;
-
- 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));
- 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;
-}
-
-/* Gets the path to menuitems if there are some. Now we need to
- make them special. */
-static void
-menu_cb (IndicateListener * listener, IndicateListenerServer * server, const gchar * menupath, gpointer data)
-{
- g_debug("Got Menu: %s", menupath);
- g_return_if_fail(IS_APP_MENU_ITEM(data));
- AppMenuItem * self = APP_MENU_ITEM(data);
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
-
- priv->client = dbusmenu_client_new(indicate_listener_server_get_dbusname(server), menupath);
- g_signal_connect(G_OBJECT(priv->client), DBUSMENU_CLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(root_changed), self);
+ AppMenuItem * mi = APP_MENU_ITEM (userdata);
+ AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(mi);
+ GError *error = NULL;
- DbusmenuMenuitem * root = dbusmenu_client_get_root(priv->client);
- if (root != NULL) {
- root_changed(priv->client, root, self);
+ if (!g_app_info_launch (G_APP_INFO (priv->appinfo), NULL, NULL, &error)) {
+ g_warning("Unable to execute application for desktop file '%s'",
+ g_desktop_app_info_get_filename (priv->appinfo));
}
-
- return;
-}
-
-static void
-activate_cb (AppMenuItem * self, guint timestamp, gpointer data)
-{
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
-
- g_return_if_fail (priv->listener != NULL && priv->server != NULL);
-
- indicate_listener_display(priv->listener, priv->server, NULL, timestamp);
-
- return;
}
guint
@@ -589,14 +253,6 @@ app_menu_item_get_count (AppMenuItem * appitem)
return priv->unreadcount;
}
-IndicateListenerServer *
-app_menu_item_get_server (AppMenuItem * appitem) {
- g_return_val_if_fail(IS_APP_MENU_ITEM(appitem), NULL);
- AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(appitem);
-
- return priv->server;
-}
-
const gchar *
app_menu_item_get_name (AppMenuItem * appitem)
{
@@ -606,9 +262,6 @@ app_menu_item_get_name (AppMenuItem * appitem)
if (priv->appinfo) {
return g_app_info_get_name(G_APP_INFO(priv->appinfo));
}
- else if (priv->server) {
- return INDICATE_LISTENER_SERVER_DBUS_NAME(priv->server);
- }
return NULL;
}
@@ -623,13 +276,10 @@ app_menu_item_get_desktop (AppMenuItem * appitem)
return NULL;
}
-/* Get the dynamic items added onto the end of
- and app entry. */
-GList *
-app_menu_item_get_items (AppMenuItem * appitem)
+GMenuModel *
+app_menu_item_get_menu (AppMenuItem *appitem)
{
- g_return_val_if_fail(IS_APP_MENU_ITEM(appitem), NULL);
AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(appitem);
- return g_list_concat (g_list_copy (priv->shortcuts),
- g_list_copy (priv->static_shortcuts));
+ return G_MENU_MODEL (priv->menu);
}
+