aboutsummaryrefslogtreecommitdiff
path: root/src/status-service.c
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2009-12-24 13:23:55 -0600
committerTed Gould <ted@gould.cx>2009-12-24 13:23:55 -0600
commitdaf83b09dace69527c277e3a938a7b142061d7f9 (patch)
tree59c985d1d4e86e4feeb80aca43c31b79a92116a7 /src/status-service.c
parent580cf67b9db257743ab9e55d5a11e885d4a59640 (diff)
downloadayatana-indicator-session-daf83b09dace69527c277e3a938a7b142061d7f9.tar.gz
ayatana-indicator-session-daf83b09dace69527c277e3a938a7b142061d7f9.tar.bz2
ayatana-indicator-session-daf83b09dace69527c277e3a938a7b142061d7f9.zip
Brutal status rip out.
Diffstat (limited to 'src/status-service.c')
-rw-r--r--src/status-service.c264
1 files changed, 0 insertions, 264 deletions
diff --git a/src/status-service.c b/src/status-service.c
deleted file mode 100644
index c07b875..0000000
--- a/src/status-service.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
-A small wrapper utility to load indicators and put them as menu items
-into the gnome-panel using it's applet interface.
-
-Copyright 2009 Canonical Ltd.
-
-Authors:
- Ted Gould <ted@canonical.com>
-
-This program is free software: you can redistribute it and/or modify it
-under the terms of the GNU General Public License version 3, as published
-by the Free Software Foundation.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranties of
-MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
-PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along
-with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <pwd.h>
-#include <unistd.h>
-
-#include <glib/gi18n.h>
-
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-bindings.h>
-
-#include <libdbusmenu-glib/client.h>
-#include <libdbusmenu-glib/server.h>
-#include <libdbusmenu-glib/menuitem.h>
-
-#include "dbus-shared-names.h"
-
-#include "status-service-dbus.h"
-
-#include "status-provider.h"
-#include "status-provider-mc5.h"
-#include "status-provider-pidgin.h"
-#include "status-provider-telepathy.h"
-
-typedef StatusProvider * (*newfunc) (void);
-#define STATUS_PROVIDER_CNT 3
-static newfunc status_provider_newfuncs[STATUS_PROVIDER_CNT] = {
- status_provider_mc5_new,
- status_provider_pidgin_new,
- status_provider_telepathy_new
-};
-static StatusProvider * status_providers[STATUS_PROVIDER_CNT] = { 0 };
-
-static const gchar * status_strings [STATUS_PROVIDER_STATUS_LAST] = {
- /* STATUS_PROVIDER_STATUS_ONLINE, */ N_("Available"),
- /* STATUS_PROVIDER_STATUS_AWAY, */ N_("Away"),
- /* STATUS_PROVIDER_STATUS_DND */ N_("Busy"),
- /* STATUS_PROVIDER_STATUS_INVISIBLE */ N_("Invisible"),
- /* STATUS_PROVIDER_STATUS_OFFLINE, */ N_("Offline"),
- /* STATUS_PROVIDER_STATUS_DISCONNECTED*/ N_("Offline")
-};
-
-static const gchar * status_icons[STATUS_PROVIDER_STATUS_LAST] = {
- /* STATUS_PROVIDER_STATUS_ONLINE, */ "user-available",
- /* STATUS_PROVIDER_STATUS_AWAY, */ "user-away",
- /* STATUS_PROVIDER_STATUS_DND, */ "user-busy",
- /* STATUS_PROVIDER_STATUS_INVISIBLE, */ "user-invisible",
- /* STATUS_PROVIDER_STATUS_OFFLINE */ "user-offline",
- /* STATUS_PROVIDER_STATUS_DISCONNECTED */"system-shutdown-panel"
-};
-
-
-static DbusmenuMenuitem * root_menuitem = NULL;
-static DbusmenuMenuitem * status_menuitem = NULL;
-static DbusmenuMenuitem * status_menuitems[STATUS_PROVIDER_STATUS_LAST] = {0};
-static GMainLoop * mainloop = NULL;
-static StatusServiceDbus * dbus_interface = NULL;
-static StatusProviderStatus global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
-
-static void
-status_update (void) {
- StatusProviderStatus oldglobal = global_status;
- global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
-
- /* Ask everyone what they think the status should be, if
- they're more connected, up the global level */
- int i;
- for (i = 0; i < STATUS_PROVIDER_CNT; i++) {
- StatusProviderStatus localstatus = status_provider_get_status(status_providers[i]);
- if (localstatus < global_status) {
- global_status = localstatus;
- }
- }
-
- /* If changed */
- if (global_status != oldglobal) {
- g_debug("Global status changed to: %s", _(status_strings[global_status]));
-
- /* Configure the icon on the panel */
- status_service_dbus_set_status(dbus_interface, status_icons[global_status]);
-
- /* If we're now disconnected, make setting the statuses
- insensitive. */
- if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
- StatusProviderStatus i;
- for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
- if (status_menuitems[i] == NULL) continue;
- dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_SENSITIVE, FALSE);
- }
- }
-
- /* If we're now back to a state where we have an IM client
- connected then we need to resensitize the items. */
- if (oldglobal == STATUS_PROVIDER_STATUS_DISCONNECTED) {
- StatusProviderStatus i;
- for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
- if (status_menuitems[i] == NULL) continue;
- dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_SENSITIVE, TRUE);
- }
- }
- }
-
- return;
-}
-
-static void
-status_menu_click (DbusmenuMenuitem * mi, gpointer data)
-{
- StatusProviderStatus status = (StatusProviderStatus)GPOINTER_TO_INT(data);
- g_debug("Setting status: %d", status);
- int i;
- for (i = 0; i < STATUS_PROVIDER_CNT; i++) {
- status_provider_set_status(status_providers[i], status);
- }
-
- return;
-}
-
-static gboolean
-build_providers (gpointer data)
-{
- int i;
- for (i = 0; i < STATUS_PROVIDER_CNT; i++) {
- status_providers[i] = status_provider_newfuncs[i]();
-
- if (status_providers[i] != NULL) {
- g_signal_connect(G_OBJECT(status_providers[i]), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED, G_CALLBACK(status_update), NULL);
- }
- }
-
- status_update();
-
- return FALSE;
-}
-
-static void
-build_user_item (DbusmenuMenuitem * root)
-{
- struct passwd * pwd = NULL;
-
- pwd = getpwuid(getuid());
-
- if (pwd != NULL && pwd->pw_gecos != NULL) {
- gchar * name = g_strdup(pwd->pw_gecos);
- gchar * walker = name;
- while (*walker != '\0' && *walker != ',') { walker++; }
- *walker = '\0';
-
- if (name[0] != '\0') {
- DbusmenuMenuitem * useritem = dbusmenu_menuitem_new();
- dbusmenu_menuitem_property_set(useritem, DBUSMENU_MENUITEM_PROP_LABEL, name);
- dbusmenu_menuitem_property_set_bool(useritem, DBUSMENU_MENUITEM_PROP_SENSITIVE, FALSE);
- dbusmenu_menuitem_child_append(root, useritem);
- }
-
- g_free(name);
- } else {
- g_debug("PWD: %s", (pwd == NULL ? "(pwd null)" : (pwd->pw_gecos == NULL ? "(gecos null)" : pwd->pw_gecos)));
- }
-
- return;
-}
-
-static gboolean
-build_menu (gpointer data)
-{
- DbusmenuMenuitem * root = DBUSMENU_MENUITEM(data);
- g_return_val_if_fail(root != NULL, FALSE);
-
- build_user_item(root);
-
- status_menuitem = dbusmenu_menuitem_new();
- dbusmenu_menuitem_property_set(status_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Set Status"));
- dbusmenu_menuitem_child_append(root, status_menuitem);
-
- StatusProviderStatus i;
- for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
- if (i == STATUS_PROVIDER_STATUS_DISCONNECTED) {
- /* We don't want an item for the disconnected status. Users
- can't set that value through the menu :) */
- continue;
- }
-
- status_menuitems[i] = dbusmenu_menuitem_new();
-
- dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_LABEL, _(status_strings[i]));
- dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ICON, status_icons[i]);
- if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
- dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_SENSITIVE, FALSE);
- }
- g_signal_connect(G_OBJECT(status_menuitems[i]), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(status_menu_click), GINT_TO_POINTER(i));
-
- dbusmenu_menuitem_child_append(status_menuitem, status_menuitems[i]);
-
- g_debug("Built %s", status_strings[i]);
- }
-
- return FALSE;
-}
-
-int
-main (int argc, char ** argv)
-{
- g_type_init();
-
- /* Setting up i18n and gettext. Apparently, we need
- all of these. */
- setlocale (LC_ALL, "");
- bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
-
- DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
- DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
- GError * error = NULL;
- guint nameret = 0;
-
- if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_STATUS_DBUS_NAME, 0, &nameret, &error)) {
- g_error("Unable to call to request name");
- return 1;
- }
-
- if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
- g_error("Unable to get name");
- return 1;
- }
-
- g_idle_add(build_providers, NULL);
-
- root_menuitem = dbusmenu_menuitem_new();
- DbusmenuServer * server = dbusmenu_server_new(INDICATOR_STATUS_DBUS_OBJECT);
- dbusmenu_server_set_root(server, root_menuitem);
-
- g_idle_add(build_menu, root_menuitem);
-
- dbus_interface = g_object_new(STATUS_SERVICE_DBUS_TYPE, NULL);
-
- mainloop = g_main_loop_new(NULL, FALSE);
- g_main_loop_run(mainloop);
-
- return 0;
-}
-