summaryrefslogtreecommitdiff
path: root/src/up-device.c
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2013-10-13 15:11:48 +0200
committerBastien Nocera <hadess@hadess.net>2013-10-14 11:06:53 +0200
commitc9aeb660e11f60f260dfbacfe7857e5e7d01d3cf (patch)
treec00e59da669feec319d79a8cf903fc0c8de65c5d /src/up-device.c
parent68b9975ad98b94a28ce2e2ca21316e603d464f1a (diff)
downloadupower-c9aeb660e11f60f260dfbacfe7857e5e7d01d3cf.tar.gz
daemon: Add IconName property
Sends out icon names as defined by the Icon Naming specification. Will save quite a bit of client side code.
Diffstat (limited to 'src/up-device.c')
-rw-r--r--src/up-device.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/up-device.c b/src/up-device.c
index 1c72457..c51e7d7 100644
--- a/src/up-device.c
+++ b/src/up-device.c
@@ -79,6 +79,7 @@ struct UpDevicePrivate
gdouble percentage; /* percent */
gdouble temperature; /* degrees C */
UpDeviceLevel warning_level;
+ const gchar *icon_name;
};
static gboolean up_device_register_device (UpDevice *device);
@@ -112,6 +113,7 @@ enum {
PROP_TEMPERATURE,
PROP_TECHNOLOGY,
PROP_WARNING_LEVEL,
+ PROP_ICON_NAME,
PROP_LAST
};
@@ -194,6 +196,67 @@ update_warning_level (UpDevice *device)
g_object_notify (G_OBJECT (device), "warning-level");
}
+static const gchar *
+get_device_charge_icon (gdouble percentage,
+ gboolean charging)
+{
+ if (percentage < 10)
+ return charging ? "battery-caution-charging-symbolic" : "battery-caution-symbolic";
+ else if (percentage < 30)
+ return charging ? "battery-low-charging-symbolic" : "battery-low-symbolic";
+ else if (percentage < 60)
+ return charging ? "battery-good-charging-symbolic" : "battery-good-symbolic";
+ return charging ? "battery-full-charging-symbolic" : "battery-full-symbolic";
+}
+
+/* This needs to be called when one of those properties changes:
+ * type
+ * state
+ * percentage
+ * is-present
+ */
+static void
+update_icon_name (UpDevice *device)
+{
+ const gchar *icon_name = NULL;
+
+ /* get the icon from some simple rules */
+ if (device->priv->type == UP_DEVICE_KIND_LINE_POWER) {
+ icon_name = "ac-adapter-symbolic";
+ } else {
+
+ if (!device->priv->is_present) {
+ icon_name = "battery-missing-symbolic";
+
+ } else {
+ switch (device->priv->state) {
+ case UP_DEVICE_STATE_EMPTY:
+ icon_name = "battery-empty-symbolic";
+ break;
+ case UP_DEVICE_STATE_FULLY_CHARGED:
+ icon_name = "battery-full-charged-symbolic";
+ break;
+ case UP_DEVICE_STATE_CHARGING:
+ case UP_DEVICE_STATE_PENDING_CHARGE:
+ icon_name = get_device_charge_icon (device->priv->percentage, TRUE);
+ break;
+ case UP_DEVICE_STATE_DISCHARGING:
+ case UP_DEVICE_STATE_PENDING_DISCHARGE:
+ icon_name = get_device_charge_icon (device->priv->percentage, FALSE);
+ break;
+ default:
+ icon_name = "battery-missing-symbolic";
+ }
+ }
+ }
+
+ if (g_strcmp0 (icon_name, device->priv->icon_name) == 0)
+ return;
+
+ device->priv->icon_name = icon_name;
+ g_object_notify (G_OBJECT (device), "icon-name");
+}
+
/**
* up_device_get_property:
**/
@@ -283,6 +346,9 @@ up_device_get_property (GObject *object, guint prop_id, GValue *value, GParamSpe
case PROP_WARNING_LEVEL:
g_value_set_uint (value, device->priv->warning_level);
break;
+ case PROP_ICON_NAME:
+ g_value_set_string (value, device->priv->icon_name);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -319,6 +385,7 @@ up_device_set_property (GObject *object, guint prop_id, const GValue *value, GPa
break;
case PROP_TYPE:
device->priv->type = g_value_get_uint (value);
+ update_icon_name (device);
break;
case PROP_POWER_SUPPLY:
device->priv->power_supply = g_value_get_boolean (value);
@@ -329,6 +396,7 @@ up_device_set_property (GObject *object, guint prop_id, const GValue *value, GPa
break;
case PROP_IS_PRESENT:
device->priv->is_present = g_value_get_boolean (value);
+ update_icon_name (device);
break;
case PROP_IS_RECHARGEABLE:
device->priv->is_rechargeable = g_value_get_boolean (value);
@@ -342,6 +410,7 @@ up_device_set_property (GObject *object, guint prop_id, const GValue *value, GPa
case PROP_STATE:
device->priv->state = g_value_get_uint (value);
update_warning_level (device);
+ update_icon_name (device);
break;
case PROP_CAPACITY:
device->priv->capacity = g_value_get_double (value);
@@ -377,6 +446,7 @@ up_device_set_property (GObject *object, guint prop_id, const GValue *value, GPa
case PROP_PERCENTAGE:
device->priv->percentage = g_value_get_double (value);
update_warning_level (device);
+ update_icon_name (device);
break;
case PROP_TEMPERATURE:
device->priv->temperature = g_value_get_double (value);
@@ -1180,6 +1250,15 @@ up_device_class_init (UpDeviceClass *klass)
UP_DEVICE_LEVEL_UNKNOWN,
G_PARAM_READABLE));
+ /**
+ * UpDevice:icon:
+ */
+ g_object_class_install_property (object_class,
+ PROP_ICON_NAME,
+ g_param_spec_string ("icon-name",
+ NULL, NULL, NULL,
+ G_PARAM_READABLE));
+
dbus_g_error_domain_register (UP_DEVICE_ERROR, NULL, UP_DEVICE_TYPE_ERROR);
}