ayatana-commits team mailing list archive
-
ayatana-commits team
-
Mailing list archive
-
Message #01184
[Merge] lp:~dbarth/indicator-me/radio-buttons-and-indeterminate-status into lp:indicator-me
David Barth has proposed merging lp:~dbarth/indicator-me/radio-buttons-and-indeterminate-status into lp:indicator-me.
Requested reviews:
Indicator Applet Developers (indicator-applet-developers)
This branch enables proper radio marks on status items and also computes the "indeterminate status" based on diverging online statuses.
--
https://code.launchpad.net/~dbarth/indicator-me/radio-buttons-and-indeterminate-status/+merge/21436
Your team ayatana-commits is subscribed to branch lp:indicator-me.
=== modified file 'src/me-service.c'
--- src/me-service.c 2010-03-11 13:06:53 +0000
+++ src/me-service.c 2010-03-16 10:46:19 +0000
@@ -92,44 +92,75 @@
status_update (void) {
StatusProviderStatus oldglobal = global_status;
global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
+ gboolean indeterminate = FALSE;
/* Ask everyone what they think the status should be, if
they're more connected, up the global level */
- int i;
+ StatusProviderStatus i;
for (i = 0; i < STATUS_PROVIDER_CNT; i++) {
+ if (status_providers[i] == NULL) continue;
StatusProviderStatus localstatus = status_provider_get_status(status_providers[i]);
- if (localstatus < global_status) {
+ g_debug ("provider[%d]: %s", i, status_strings[localstatus]);
+
+ if (localstatus >= STATUS_PROVIDER_STATUS_OFFLINE)
+ /* offline and disconnected is similar for some providers
+ so it's not meaningful to determine the 'indeterminate' status
+ */
+ continue;
+
+ if (localstatus != global_status) {
+ if (global_status < STATUS_PROVIDER_STATUS_OFFLINE)
+ /* at least one provider was maintaining a status better than 'offline'
+ and there's now another one with something different */
+ indeterminate = TRUE;
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_ENABLED, 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_ENABLED, TRUE);
- }
- }
- }
+ /* Configure the icon on the panel */
+ status_service_dbus_set_status(dbus_interface, indeterminate ? "user-indeterminate" : status_icons[global_status]);
+
+ g_debug("Global status changed to: %s", indeterminate ? "indeterminate" : status_strings[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_ENABLED,
+ FALSE);
+ }
+ return;
+ }
+
+ /* Ensure items are sensititive if they were previoulsy disabled */
+ 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_ENABLED, TRUE);
+ }
+ }
+
+ /* add a radio mark to the user status entry */
+ for (i = STATUS_PROVIDER_STATUS_ONLINE;
+ i < STATUS_PROVIDER_STATUS_LAST; i++) {
+ if (status_menuitems[i] == NULL) continue;
+ if (indeterminate
+ || (i != global_status)) {
+ dbusmenu_menuitem_property_set_int (status_menuitems[i],
+ DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+ DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
+ } else {
+ dbusmenu_menuitem_property_set_int (status_menuitems[i],
+ DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+ DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED);
+ }
+ }
return;
}
@@ -346,6 +377,12 @@
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_NAME, status_icons[i]);
+ dbusmenu_menuitem_property_set (status_menuitems[i],
+ DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE,
+ DBUSMENU_MENUITEM_TOGGLE_RADIO);
+ dbusmenu_menuitem_property_set_int (status_menuitems[i],
+ DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+ DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
}
Follow ups