87
89
static StatusServiceDbus * dbus_interface = NULL;
88
90
static StatusProviderStatus global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
89
91
static GFileMonitor *avatar_monitor = NULL;
92
static DbusmenuMenuitem *broadcast_field = NULL;
93
static DbusmenuMenuitem * useritem = NULL;
92
96
status_update (void) {
93
97
StatusProviderStatus oldglobal = global_status;
94
98
global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
99
gboolean indeterminate = FALSE;
96
101
/* Ask everyone what they think the status should be, if
97
102
they're more connected, up the global level */
103
StatusProviderStatus i;
99
104
for (i = 0; i < STATUS_PROVIDER_CNT; i++) {
105
if (status_providers[i] == NULL) continue;
100
106
StatusProviderStatus localstatus = status_provider_get_status(status_providers[i]);
101
if (localstatus < global_status) {
107
g_debug ("provider[%d]: %s", i, status_strings[localstatus]);
109
if (localstatus >= STATUS_PROVIDER_STATUS_OFFLINE)
110
/* offline and disconnected is similar for some providers
111
so it's not meaningful to determine the 'indeterminate' status
115
if (localstatus != global_status) {
116
if (global_status < STATUS_PROVIDER_STATUS_OFFLINE)
117
/* at least one provider was maintaining a status better than 'offline'
118
and there's now another one with something different */
119
indeterminate = TRUE;
102
120
global_status = localstatus;
107
if (global_status != oldglobal) {
108
g_debug("Global status changed to: %s", _(status_strings[global_status]));
110
/* Configure the icon on the panel */
111
status_service_dbus_set_status(dbus_interface, status_icons[global_status]);
113
/* If we're now disconnected, make setting the statuses
115
if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
116
StatusProviderStatus i;
117
for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
118
if (status_menuitems[i] == NULL) continue;
119
dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
123
/* If we're now back to a state where we have an IM client
124
connected then we need to resensitize the items. */
125
if (oldglobal == STATUS_PROVIDER_STATUS_DISCONNECTED) {
126
StatusProviderStatus i;
127
for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
128
if (status_menuitems[i] == NULL) continue;
129
dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
124
/* Configure the icon on the panel */
125
status_service_dbus_set_status(dbus_interface, indeterminate ? "user-indeterminate" : status_icons[global_status]);
127
g_debug("Global status changed to: %s", indeterminate ? "indeterminate" : status_strings[global_status]);
129
/* If we're now disconnected, make setting the statuses
131
if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
132
StatusProviderStatus i;
133
for (i = STATUS_PROVIDER_STATUS_ONLINE;
134
i < STATUS_PROVIDER_STATUS_LAST; i++) {
135
if (status_menuitems[i] == NULL) continue;
136
dbusmenu_menuitem_property_set_bool(status_menuitems[i],
137
DBUSMENU_MENUITEM_PROP_ENABLED,
143
/* Ensure items are sensititive if they were previoulsy disabled */
144
if (oldglobal == STATUS_PROVIDER_STATUS_DISCONNECTED) {
145
StatusProviderStatus i;
146
for (i = STATUS_PROVIDER_STATUS_ONLINE;
147
i < STATUS_PROVIDER_STATUS_LAST; i++) {
148
if (status_menuitems[i] == NULL) continue;
149
dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
153
/* add a radio mark to the user status entry */
154
for (i = STATUS_PROVIDER_STATUS_ONLINE;
155
i < STATUS_PROVIDER_STATUS_LAST; i++) {
156
if (status_menuitems[i] == NULL) continue;
158
|| (i != global_status)) {
159
dbusmenu_menuitem_property_set_int (status_menuitems[i],
160
DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
161
DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
163
dbusmenu_menuitem_property_set_int (status_menuitems[i],
164
DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
165
DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED);
173
gwibber_status_update (GwibberService *instance, GwibberServiceStatus status, gpointer data) {
174
g_return_if_fail (instance != NULL);
176
g_debug ("gwibber service status changed to: %d", status);
178
if (broadcast_field == NULL) {
179
g_warning ("no broadcast field to update");
183
if (! gwibber_service_has_configured_accounts (instance)) {
184
g_debug ("no configured accounts detected, so hiding the broadcast field");
185
dbusmenu_menuitem_property_set_bool (broadcast_field, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
189
if (! dbusmenu_menuitem_property_get_bool (broadcast_field, DBUSMENU_MENUITEM_PROP_VISIBLE))
190
dbusmenu_menuitem_property_set_bool (broadcast_field, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
193
if (status == GWIBBER_SERVICE_STATUS_RUNNING) {
194
g_debug ("enabling the broadcast field");
195
dbusmenu_menuitem_property_set_bool (broadcast_field, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
197
g_debug ("disabling the broadcast field");
198
dbusmenu_menuitem_property_set_bool (broadcast_field, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
138
207
status_menu_click (DbusmenuMenuitem * mi, guint timestamp, gpointer data)
140
209
StatusProviderStatus status = (StatusProviderStatus)GPOINTER_TO_INT(data);
290
gwibber = gwibber_service_new ();
291
if (gwibber != NULL) {
292
g_signal_connect (G_OBJECT (gwibber), GWIBBER_SERVICE_SIGNAL_STATUS_CHANGED, G_CALLBACK (gwibber_status_update), NULL);
224
#define GCONF_ANONYMOUS "/system/indicator/me/anonymous"
298
#define GCONF_NAMESPACE "/system/indicator/me"
299
#define GCONF_DISPLAY "/system/indicator/me/display"
227
anonymous_mode (void)
302
display_mode_changed ()
229
GConfClient *context = NULL;
230
GConfValue *option = NULL;
231
gboolean value = FALSE; /* not anonymous, by default */
233
context = gconf_client_get_default ();
235
g_warning ("Couldn't get a gconf context");
239
option = gconf_client_get (context, GCONF_ANONYMOUS, NULL);
304
GConfClient *context = gconf_client_get_default ();
305
g_return_if_fail (context != NULL);
307
GConfValue *option = gconf_client_get (context, GCONF_DISPLAY, NULL);
308
gint value = 1; /* username, by default */
310
g_debug ("display_mode_changed");
240
312
if (option != NULL &&
241
option->type == GCONF_VALUE_BOOL)
242
value = gconf_value_get_bool (option);
313
option->type == GCONF_VALUE_INT)
314
value = gconf_value_get_int (option);
317
case 0: /* anonymous */
318
status_service_dbus_set_username (dbus_interface, "");
322
status_service_dbus_set_username (dbus_interface, g_get_user_name ());
325
status_service_dbus_set_username (dbus_interface, g_get_real_name ());
329
dbusmenu_menuitem_property_set_bool (useritem,
330
DBUSMENU_MENUITEM_PROP_VISIBLE,
331
(value == 0) ? FALSE : TRUE);
244
333
g_object_unref (context);
250
340
avatar_changed_cb (GFileMonitor * monitor, GFile * file, GFile * other_file, GFileMonitorEvent event_type, gpointer user_data)
265
355
build_user_item (DbusmenuMenuitem * root)
267
struct passwd * pwd = NULL;
269
if (anonymous_mode ())
272
pwd = getpwuid(getuid());
274
if (pwd != NULL && pwd->pw_name != NULL && pwd->pw_name[0] != '\0') {
275
status_service_dbus_set_username(dbus_interface, pwd->pw_name);
277
g_warning ("PWD: %s", (pwd == NULL ? "(pwd null)" : (pwd->pw_name == NULL ? "(pw_name null)" : pwd->pw_name)));
279
/* that's kind of an anonymous mode too if ever that can happen */
283
DbusmenuMenuitem * useritem = dbusmenu_menuitem_new();
357
useritem = dbusmenu_menuitem_new();
358
dbusmenu_menuitem_property_set(useritem, DBUSMENU_ABOUT_ME_MENUITEM_PROP_NAME, g_get_real_name ());
284
359
dbusmenu_menuitem_property_set_bool(useritem, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
360
dbusmenu_menuitem_property_set_bool(useritem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
285
361
dbusmenu_menuitem_property_set(useritem, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_ABOUT_ME_MENUITEM_TYPE);
286
362
dbusmenu_menuitem_child_append(root, useritem);
307
if (pwd != NULL && pwd->pw_gecos != NULL) {
308
gchar * name = g_strdup(pwd->pw_gecos);
309
gchar * walker = name;
310
while (*walker != '\0' && *walker != ',') { walker++; }
313
if (name[0] != '\0') {
314
dbusmenu_menuitem_property_set(useritem, DBUSMENU_ABOUT_ME_MENUITEM_PROP_NAME, name);
316
/* fallback on the username, at least we know it's not null from above */
317
dbusmenu_menuitem_property_set(useritem, DBUSMENU_ABOUT_ME_MENUITEM_PROP_NAME, pwd->pw_name);
383
/* set the menu name */
384
display_mode_changed ();
386
/* and receive display mode notifications to update it later */
387
GConfClient *context = gconf_client_get_default ();
388
if (context != NULL) {
389
gconf_client_add_dir (context, GCONF_NAMESPACE,
390
GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
391
gconf_client_notify_add (context, GCONF_DISPLAY,
392
display_mode_changed, NULL, NULL, NULL);
393
g_object_unref (context);