aboutsummaryrefslogtreecommitdiff
path: root/src/status-items.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/status-items.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/status-items.c')
-rw-r--r--src/status-items.c89
1 files changed, 47 insertions, 42 deletions
diff --git a/src/status-items.c b/src/status-items.c
index 70a2ad9..a2e3a02 100644
--- a/src/status-items.c
+++ b/src/status-items.c
@@ -22,10 +22,19 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <glib.h>
#include <glib/gi18n.h>
#include <gio/gio.h>
-#include <libdbusmenu-glib/dbusmenu-glib.h>
#include "status-items.h"
#include "status-provider.h"
+#include "dbus-data.h"
+
+static const gchar * status_ids [STATUS_PROVIDER_STATUS_LAST] = {
+ /* STATUS_PROVIDER_STATUS_ONLINE, */ "available",
+ /* STATUS_PROVIDER_STATUS_AWAY, */ "away",
+ /* STATUS_PROVIDER_STATUS_DND */ "busy",
+ /* STATUS_PROVIDER_STATUS_INVISIBLE */ "invisible",
+ /* STATUS_PROVIDER_STATUS_OFFLINE, */ "offline",
+ /* STATUS_PROVIDER_STATUS_DISCONNECTED*/ "offline"
+};
static const gchar * status_strings [STATUS_PROVIDER_STATUS_LAST] = {
/* STATUS_PROVIDER_STATUS_ONLINE, */ N_("Available"),
@@ -66,39 +75,40 @@ static const gchar * panel_active_icons[STATUS_PROVIDER_STATUS_LAST] = {
/* Prototypes */
static gboolean provider_directory_parse (gpointer dir);
static gboolean load_status_provider (gpointer dir);
-static void user_status_change (DbusmenuMenuitem * item, guint timestamp, gpointer pstatus);
+static void user_status_change (GSimpleAction *action,
+ GVariant *value,
+ gpointer user_data);
/* Globals */
static StatusProviderStatus current_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
-static GList * menuitems = NULL;
+static GMenu * menu;
+static GAction *status_action;
static GList * status_providers = NULL;
-static StatusUpdateFunc update_func = NULL;
/* Build the inital status items and start kicking off the async code
for handling all the statuses */
-GList *
-status_items_build (StatusUpdateFunc status_update_func)
+GMenuModel *
+status_items_build (GAction *action)
{
int i;
- for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_DISCONNECTED; i++) {
- DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+ menu = g_menu_new ();
- dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, _(status_strings[i]));
- dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_ICON_NAME, status_icons[i]);
+ status_action = action;
+ g_signal_connect (action, "change-state", G_CALLBACK (user_status_change), NULL);
- dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
- dbusmenu_menuitem_property_set_bool(item, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+ for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_DISCONNECTED; i++) {
+ GMenuItem *item = g_menu_item_new (_(status_strings[i]), NULL);
- dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE, DBUSMENU_MENUITEM_TOGGLE_RADIO);
- dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
+ g_menu_item_set_action_and_target (item, g_action_get_name (action), "s", status_ids[i]);
- g_signal_connect(G_OBJECT(item), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(user_status_change), GINT_TO_POINTER(i));
+ g_menu_item_set_attribute (item, INDICATOR_MENU_ATTRIBUTE_ICON_NAME, "s", status_icons[i]);
+ g_menu_item_set_attribute (item, INDICATOR_MENU_ATTRIBUTE_VISIBLE, "b", TRUE);
+ g_menu_item_set_attribute (item, INDICATOR_MENU_ATTRIBUTE_ENABLED, "b", FALSE);
- menuitems = g_list_append(menuitems, item);
+ g_menu_append_item (menu, item);
+ g_object_unref (item);
}
- update_func = status_update_func;
-
const gchar * status_providers_env = g_getenv("INDICATOR_MESSAGES_STATUS_PROVIDER_DIR");
if (status_providers_env == NULL) {
g_idle_add(provider_directory_parse, STATUS_PROVIDER_DIR);
@@ -106,7 +116,7 @@ status_items_build (StatusUpdateFunc status_update_func)
g_idle_add(provider_directory_parse, (gpointer)status_providers_env);
}
- return menuitems;
+ return G_MENU_MODEL (menu);
}
/* Clean up our globals and stop with all this allocation
@@ -155,38 +165,33 @@ update_status (void)
current_status = status;
- if (update_func != NULL) {
- update_func();
- }
-
- GList * menu;
- int i;
- for (menu = menuitems, i = 0; menu != NULL && i < STATUS_PROVIDER_STATUS_DISCONNECTED; menu = g_list_next(menu), i++) {
- /* If we're the seleced status or if we're disconnected
- show the user that we're offline */
- if (i == current_status || (current_status == STATUS_PROVIDER_STATUS_DISCONNECTED && i == STATUS_PROVIDER_STATUS_OFFLINE)) {
- dbusmenu_menuitem_property_set_int(DBUSMENU_MENUITEM(menu->data), DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED);
- } else {
- dbusmenu_menuitem_property_set_int(DBUSMENU_MENUITEM(menu->data), DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
- }
-
- if (current_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
- dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(menu->data), DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
- } else {
- dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(menu->data), DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
- }
- }
+ g_action_change_state (status_action, g_variant_new_string (status_ids[current_status]));
return;
}
/* Handle the user requesting a status change */
static void
-user_status_change (DbusmenuMenuitem * item, guint timestamp, gpointer pstatus)
+user_status_change (GSimpleAction *action,
+ GVariant *value,
+ gpointer user_data)
{
- StatusProviderStatus status = GPOINTER_TO_INT(pstatus);
+ const gchar *status_id;
+ int i;
+ StatusProviderStatus status = STATUS_PROVIDER_STATUS_DISCONNECTED;
GList * provider;
+ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING));
+
+ status_id = g_variant_get_string (value, NULL);
+
+ for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_DISCONNECTED; i++) {
+ if (!strcmp (status_id, status_ids [i])) {
+ status = i;
+ break;
+ }
+ }
+
/* Set each provider to this status */
for (provider = status_providers; provider != NULL; provider = g_list_next(provider)) {
status_provider_set_status(STATUS_PROVIDER(provider->data), status);