diff options
Diffstat (limited to 'src/status-items.c')
-rw-r--r-- | src/status-items.c | 89 |
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); |