diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/device-provider-upower.c | 14 | ||||
-rw-r--r-- | src/device.c | 119 | ||||
-rw-r--r-- | src/device.h | 9 | ||||
-rw-r--r-- | src/service.c | 63 | ||||
-rw-r--r-- | src/testing.c | 7 |
5 files changed, 168 insertions, 44 deletions
diff --git a/src/device-provider-upower.c b/src/device-provider-upower.c index f9b5e18..dbbe5f1 100644 --- a/src/device-provider-upower.c +++ b/src/device-provider-upower.c @@ -1,8 +1,10 @@ /* * Copyright 2013 Canonical Ltd. + * Copyright 2023 Robert Tari * * Authors: * Charles Kerr <charles.kerr@canonical.com> + * Robert Tari <robert@tari.in> * * 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 @@ -108,6 +110,7 @@ on_get_all_response (GObject * o, GAsyncResult * res, gpointer gdata) else { guint32 kind = 0; + gchar *model; guint32 state = 0; gdouble percentage = 0; gint64 time_to_empty = 0; @@ -119,6 +122,7 @@ on_get_all_response (GObject * o, GAsyncResult * res, gpointer gdata) GVariant * dict = g_variant_get_child_value (response, 0); g_variant_lookup (dict, "Type", "u", &kind); + g_variant_lookup (dict, "Model", "s", &model); g_variant_lookup (dict, "State", "u", &state); g_variant_lookup (dict, "Percentage", "d", &percentage); g_variant_lookup (dict, "TimeToEmpty", "x", &time_to_empty); @@ -129,6 +133,7 @@ on_get_all_response (GObject * o, GAsyncResult * res, gpointer gdata) if ((device = g_hash_table_lookup (p->devices, data->path))) { g_object_set (device, INDICATOR_POWER_DEVICE_KIND, (gint)kind, + INDICATOR_POWER_DEVICE_MODEL, model, INDICATOR_POWER_DEVICE_STATE, (gint)state, INDICATOR_POWER_DEVICE_OBJECT_PATH, data->path, INDICATOR_POWER_DEVICE_PERCENTAGE, percentage, @@ -140,6 +145,7 @@ on_get_all_response (GObject * o, GAsyncResult * res, gpointer gdata) { device = indicator_power_device_new (data->path, kind, + model, percentage, state, (time_t)time, @@ -344,6 +350,14 @@ on_device_properties_changed(GDBusConnection * connection G_GNUC_UNUSED, NULL); changed = TRUE; } + else if (!g_strcmp0(key, "Model")) + { + const gchar *s = g_variant_get_string(value, NULL); + g_object_set(device, + INDICATOR_POWER_DEVICE_MODEL, s, + NULL); + changed = TRUE; + } else if (!g_strcmp0(key, "State")) { const guint32 u = g_variant_get_uint32(value); diff --git a/src/device.c b/src/device.c index a1c4d14..6e79557 100644 --- a/src/device.c +++ b/src/device.c @@ -35,6 +35,7 @@ License along with this library. If not, see struct _IndicatorPowerDevicePrivate { UpDeviceKind kind; + gchar *model; UpDeviceState state; gchar * object_path; gdouble percentage; @@ -52,6 +53,7 @@ struct _IndicatorPowerDevicePrivate enum { PROP_0, PROP_KIND, + PROP_MODEL, PROP_STATE, PROP_OBJECT_PATH, PROP_PERCENTAGE, @@ -91,6 +93,12 @@ indicator_power_device_class_init (IndicatorPowerDeviceClass *klass) UP_DEVICE_KIND_UNKNOWN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + properties[PROP_MODEL] = g_param_spec_string (INDICATOR_POWER_DEVICE_MODEL, + "model", + "The device's model", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + properties[PROP_STATE] = g_param_spec_int (INDICATOR_POWER_DEVICE_STATE, "state", "The device's UpDeviceState", @@ -135,6 +143,7 @@ indicator_power_device_init (IndicatorPowerDevice *self) priv = indicator_power_device_get_instance_private(self); priv->kind = UP_DEVICE_KIND_UNKNOWN; + priv->model = NULL; priv->state = UP_DEVICE_STATE_UNKNOWN; priv->object_path = NULL; priv->percentage = 0.0; @@ -182,6 +191,10 @@ get_property (GObject * o, guint prop_id, GValue * value, GParamSpec * pspec) g_value_set_int (value, priv->kind); break; + case PROP_MODEL: + g_value_set_string (value, priv->model); + break; + case PROP_STATE: g_value_set_int (value, priv->state); break; @@ -220,6 +233,11 @@ set_property (GObject * o, guint prop_id, const GValue * value, GParamSpec * psp p->kind = (UpDeviceKind) g_value_get_int (value); break; + case PROP_MODEL: + g_free (p->model); + p->model = g_value_dup_string (value); + break; + case PROP_STATE: p->state = (UpDeviceState) g_value_get_int (value); break; @@ -280,6 +298,16 @@ indicator_power_device_get_kind (const IndicatorPowerDevice * device) return device->priv->kind; } +const gchar * +indicator_power_device_get_model (const IndicatorPowerDevice * device) +{ + /* LCOV_EXCL_START */ + g_return_val_if_fail (INDICATOR_IS_POWER_DEVICE(device), NULL); + /* LCOV_EXCL_STOP */ + + return device->priv->model; +} + UpDeviceState indicator_power_device_get_state (const IndicatorPowerDevice * device) { @@ -408,6 +436,42 @@ device_kind_to_string (UpDeviceKind kind) } } +static const char *device_kind_to_icon_name (UpDeviceKind kind) +{ + switch (kind) + { + case UP_DEVICE_KIND_LINE_POWER: return "ac-adapter"; + case UP_DEVICE_KIND_BATTERY: return "battery"; + case UP_DEVICE_KIND_UPS: return "gpm-ups-charged"; + case UP_DEVICE_KIND_MONITOR: return "display"; + case UP_DEVICE_KIND_MOUSE: return "mouse"; + case UP_DEVICE_KIND_KEYBOARD: return "keyboard"; + case UP_DEVICE_KIND_PDA: return "pda"; + case UP_DEVICE_KIND_PHONE: return "phone"; + case UP_DEVICE_KIND_MEDIA_PLAYER: return "multimedia-player"; + case UP_DEVICE_KIND_TABLET: return "tablet"; + case UP_DEVICE_KIND_COMPUTER: return "computer"; + case UP_DEVICE_KIND_GAMING_INPUT: return "input-gaming"; + case UP_DEVICE_KIND_PEN: return "input-tablet"; + case UP_DEVICE_KIND_TOUCHPAD: return "input-touchpad"; + case UP_DEVICE_KIND_MODEM: return "modem"; + case UP_DEVICE_KIND_NETWORK: return "network-wireless"; + case UP_DEVICE_KIND_HEADSET: return "audio-headset"; + case UP_DEVICE_KIND_SPEAKERS: return "audio-speakers"; + case UP_DEVICE_KIND_HEADPHONES: return "audio-headphones"; + case UP_DEVICE_KIND_VIDEO: return "camera-video"; + case UP_DEVICE_KIND_OTHER_AUDIO: return "audio-card"; + case UP_DEVICE_KIND_REMOTE_CONTROL: return "remote-control"; + case UP_DEVICE_KIND_PRINTER: return "printer"; + case UP_DEVICE_KIND_SCANNER: return "scanner"; + case UP_DEVICE_KIND_CAMERA: return "camera-photo"; + case UP_DEVICE_KIND_WEARABLE: return "wearable"; + case UP_DEVICE_KIND_TOY: return "toy"; + case UP_DEVICE_KIND_BLUETOOTH_GENERIC: return "blueman-device"; + default: return "unknown"; + } +} + /** indicator_power_device_get_icon_names: @device: #IndicatorPowerDevice from which to generate the icon names @@ -567,6 +631,7 @@ indicator_power_device_get_icon_names (const IndicatorPowerDevice * device, gboo indicator_power_device_get_gicon: @device: #IndicatorPowerDevice to generate the icon names from @panel: Whether to prefer panel icons + @bShowCharge: Whether to return a charge-aware icon A convenience function to call g_themed_icon_new_from_names() with the names returned by indicator_power_device_get_icon_names() @@ -574,11 +639,23 @@ indicator_power_device_get_icon_names (const IndicatorPowerDevice * device, gboo Return value: (transfer full): A themed GIcon */ GIcon * -indicator_power_device_get_gicon (const IndicatorPowerDevice * device, gboolean panel) +indicator_power_device_get_gicon (const IndicatorPowerDevice * device, gboolean panel, gboolean bShowCharge) { - GStrv names = indicator_power_device_get_icon_names (device, panel); - GIcon * icon = g_themed_icon_new_from_names (names, -1); - g_strfreev (names); + GIcon * icon = NULL; + + if (!bShowCharge) + { + const UpDeviceKind nKind = indicator_power_device_get_kind (device); + const gchar *sIcon = device_kind_to_icon_name (nKind); + icon = g_themed_icon_new_with_default_fallbacks (sIcon); + } + else + { + GStrv names = indicator_power_device_get_icon_names (device, panel); + icon = g_themed_icon_new_from_names (names, -1); + g_strfreev (names); + } + return icon; } @@ -880,16 +957,25 @@ time_is_relevant (const IndicatorPowerDevice * device) */ static char * get_menuitem_text (const IndicatorPowerDevice * device, - gboolean accessible) + gboolean accessible, gboolean bModelName) { char * str = NULL; const IndicatorPowerDevicePrivate * p = device->priv; - const char * kind_str = device_kind_to_localised_string (p->kind); + const char * sLabel = NULL; + + if (bModelName) + { + sLabel = p->model; + } + else + { + sLabel = device_kind_to_localised_string (p->kind); + } if (p->state == UP_DEVICE_STATE_FULLY_CHARGED) { /* TRANSLATORS: example: "battery (charged)" */ - str = g_strdup_printf (_("%s (charged)"), kind_str); + str = g_strdup_printf (_("%s (charged)"), sLabel); } else { @@ -906,11 +992,11 @@ get_menuitem_text (const IndicatorPowerDevice * device, if (time_str && *time_str) { /* TRANSLATORS: example: "battery (time remaining)" */ - str = g_strdup_printf (_("%s (%s)"), kind_str, time_str); + str = g_strdup_printf (_("%s (%s)"), sLabel, time_str); } else { - str = g_strdup (kind_str); + str = g_strdup (sLabel); } g_free (time_str); @@ -920,11 +1006,11 @@ get_menuitem_text (const IndicatorPowerDevice * device, } char * -indicator_power_device_get_readable_text (const IndicatorPowerDevice * device) +indicator_power_device_get_readable_text (const IndicatorPowerDevice * device, gboolean bModelName) { g_return_val_if_fail (INDICATOR_IS_POWER_DEVICE(device), NULL); - return get_menuitem_text (device, FALSE); + return get_menuitem_text (device, FALSE, bModelName); } char * @@ -932,7 +1018,7 @@ indicator_power_device_get_accessible_text (const IndicatorPowerDevice * device) { g_return_val_if_fail (INDICATOR_IS_POWER_DEVICE(device), NULL); - return get_menuitem_text (device, TRUE); + return get_menuitem_text (device, TRUE, FALSE); } /** @@ -1020,6 +1106,7 @@ indicator_power_device_get_accessible_title (const IndicatorPowerDevice * device IndicatorPowerDevice * indicator_power_device_new (const gchar * object_path, UpDeviceKind kind, + const gchar * model, gdouble percentage, UpDeviceState state, time_t timestamp, @@ -1027,6 +1114,7 @@ indicator_power_device_new (const gchar * object_path, { GObject * o = g_object_new (INDICATOR_POWER_DEVICE_TYPE, INDICATOR_POWER_DEVICE_KIND, kind, + INDICATOR_POWER_DEVICE_MODEL, model, INDICATOR_POWER_DEVICE_STATE, state, INDICATOR_POWER_DEVICE_OBJECT_PATH, object_path, INDICATOR_POWER_DEVICE_PERCENTAGE, percentage, @@ -1039,9 +1127,10 @@ indicator_power_device_new (const gchar * object_path, IndicatorPowerDevice * indicator_power_device_new_from_variant (GVariant * v) { - g_return_val_if_fail (g_variant_is_of_type (v, G_VARIANT_TYPE("(susdutb)")), NULL); + g_return_val_if_fail (g_variant_is_of_type (v, G_VARIANT_TYPE("(sussdutb)")), NULL); UpDeviceKind kind = UP_DEVICE_KIND_UNKNOWN; + const gchar *model = NULL; UpDeviceState state = UP_DEVICE_STATE_UNKNOWN; const gchar * icon = NULL; const gchar * object_path = NULL; @@ -1049,9 +1138,10 @@ indicator_power_device_new_from_variant (GVariant * v) guint64 time = 0; gboolean power_supply = FALSE; - g_variant_get (v, "(&su&sdutb)", + g_variant_get (v, "(&sus&sdutb)", &object_path, &kind, + &model, &icon, &percentage, &state, @@ -1060,6 +1150,7 @@ indicator_power_device_new_from_variant (GVariant * v) return indicator_power_device_new (object_path, kind, + model, percentage, state, (time_t)time, diff --git a/src/device.h b/src/device.h index fa41fe0..169305b 100644 --- a/src/device.h +++ b/src/device.h @@ -42,6 +42,7 @@ typedef struct _IndicatorPowerDeviceClass IndicatorPowerDeviceClass; typedef struct _IndicatorPowerDevicePrivate IndicatorPowerDevicePrivate; #define INDICATOR_POWER_DEVICE_KIND "kind" +#define INDICATOR_POWER_DEVICE_MODEL "model" #define INDICATOR_POWER_DEVICE_STATE "state" #define INDICATOR_POWER_DEVICE_OBJECT_PATH "object-path" #define INDICATOR_POWER_DEVICE_PERCENTAGE "percentage" @@ -125,6 +126,7 @@ GType indicator_power_device_get_type (void); IndicatorPowerDevice* indicator_power_device_new (const gchar * object_path, UpDeviceKind kind, + const gchar * model, gdouble percentage, UpDeviceState state, time_t time, @@ -132,12 +134,13 @@ IndicatorPowerDevice* indicator_power_device_new (const gchar * object_path, /** * Convenience wrapper around indicator_power_device_new() - * @variant holds the same args as indicator_power_device_new() in "(susdut)" + * @variant holds the same args as indicator_power_device_new() in "(sussdut)" */ IndicatorPowerDevice* indicator_power_device_new_from_variant (GVariant * variant); UpDeviceKind indicator_power_device_get_kind (const IndicatorPowerDevice * device); +const gchar * indicator_power_device_get_model (const IndicatorPowerDevice * device); UpDeviceState indicator_power_device_get_state (const IndicatorPowerDevice * device); const gchar * indicator_power_device_get_object_path (const IndicatorPowerDevice * device); gdouble indicator_power_device_get_percentage (const IndicatorPowerDevice * device); @@ -145,10 +148,10 @@ time_t indicator_power_device_get_time (const IndicatorPower gboolean indicator_power_device_get_power_supply (const IndicatorPowerDevice * device); GStrv indicator_power_device_get_icon_names (const IndicatorPowerDevice * device, gboolean panel); -GIcon * indicator_power_device_get_gicon (const IndicatorPowerDevice * device, gboolean panel); +GIcon * indicator_power_device_get_gicon (const IndicatorPowerDevice * device, gboolean panel, gboolean bShowCharge); -char * indicator_power_device_get_readable_text (const IndicatorPowerDevice * device); +char * indicator_power_device_get_readable_text (const IndicatorPowerDevice * device, gboolean bModelName); char * indicator_power_device_get_accessible_text (const IndicatorPowerDevice * device); diff --git a/src/service.c b/src/service.c index 3914e3f..a7b3f10 100644 --- a/src/service.c +++ b/src/service.c @@ -466,7 +466,7 @@ create_header_state (IndicatorPowerService * self) g_free (title); } - if ((icon = indicator_power_device_get_gicon (p->primary_device, TRUE))) + if ((icon = indicator_power_device_get_gicon (p->primary_device, TRUE, TRUE))) { GVariant * serialized_icon = g_icon_serialize (icon); @@ -504,17 +504,6 @@ static GMenuModel * create_devices_section (IndicatorPowerService * self, int profile) { GMenu * menu = g_menu_new (); - - if (self->priv->primary_device != NULL) - { - GMenuItem * item = g_menu_item_new (_("Charge level"), NULL); - g_menu_item_set_attribute (item, "x-ayatana-type", "s", "org.ayatana.indicator.progress"); - guint16 battery_level = (guint16)(indicator_power_device_get_percentage (self->priv->primary_device) + 0.5); - g_menu_item_set_attribute (item, "x-ayatana-progress", "q", battery_level); - g_menu_append_item (menu, item); - g_object_unref (item); - } - GList * l; for (l=self->priv->devices; l!=NULL; l=l->next) @@ -524,21 +513,47 @@ create_devices_section (IndicatorPowerService * self, int profile) if (kind != UP_DEVICE_KIND_LINE_POWER) { - if (device == self->priv->primary_device) + gchar *sLabel = NULL; + + if (kind == UP_DEVICE_KIND_BATTERY) { - continue; + if (!ayatana_common_utils_is_lomiri()) + { + sLabel = indicator_power_device_get_readable_text (device, FALSE); + } + else + { + sLabel = g_strdup (_("Charge level")); + } } + else + { + sLabel = indicator_power_device_get_readable_text (device, TRUE); + } + + gchar *sIndicator = NULL; + gchar *sProperty = NULL; - char * label = indicator_power_device_get_readable_text (device); - GMenuItem * item = g_menu_item_new (label, NULL); - g_free (label); - g_menu_item_set_attribute (item, "x-ayatana-type", "s", "org.ayatana.indicator.progress"); + if (!ayatana_common_utils_is_lomiri()) + { + sIndicator = "org.ayatana.indicator.level"; + sProperty = "x-ayatana-level"; + } + else + { + sIndicator = "org.ayatana.indicator.progress"; + sProperty = "x-ayatana-progress"; + } + + GMenuItem * item = g_menu_item_new (sLabel, NULL); + g_free (sLabel); + g_menu_item_set_attribute (item, "x-ayatana-type", "s", sIndicator); guint16 battery_level = (guint16)(indicator_power_device_get_percentage (device) + 0.5); - g_menu_item_set_attribute (item, "x-ayatana-progress", "q", battery_level); + g_menu_item_set_attribute (item, sProperty, "q", battery_level); - if (profile != PROFILE_PHONE) + if (!ayatana_common_utils_is_lomiri()) { - GIcon * icon = indicator_power_device_get_gicon (device, FALSE); + GIcon * icon = indicator_power_device_get_gicon (device, FALSE, FALSE); if (icon) { @@ -553,10 +568,7 @@ create_devices_section (IndicatorPowerService * self, int profile) g_object_unref (icon); } - if (profile == PROFILE_DESKTOP) - { - g_menu_item_set_action_and_target(item, "indicator.activate-statistics", "s", indicator_power_device_get_object_path (device)); - } + g_menu_item_set_action_and_target(item, "indicator.activate-statistics", "s", indicator_power_device_get_object_path (device)); } g_menu_append_item (menu, item); @@ -1413,6 +1425,7 @@ create_totalled_battery_device (const GList * devices) device = indicator_power_device_new (NULL, UP_DEVICE_KIND_BATTERY, + NULL, percent, state, time_left, diff --git a/src/testing.c b/src/testing.c index 6c5e8c4..3633cfe 100644 --- a/src/testing.c +++ b/src/testing.c @@ -1,5 +1,6 @@ /* * Copyright 2014 Canonical Ltd. + * Copyright 2023 Robert Tari * * 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 @@ -15,6 +16,7 @@ * * Authors: * Charles Kerr <charles.kerr@canonical.com> + * Robert Tari <robert@tari.in> */ #include "dbus-shared.h" @@ -185,7 +187,7 @@ on_bus_changed(IndicatorPowerService * service, IndicatorPowerTesting * self) { GObject * bus = NULL; - g_object_get(service, "bus", &bus, NULL); + g_object_get(service, "bus", &bus, NULL); set_bus(self, G_DBUS_CONNECTION(bus)); g_clear_object(&bus); } @@ -296,9 +298,10 @@ indicator_power_testing_init (IndicatorPowerTesting * self) G_CALLBACK(on_mock_battery_minutes_left_changed), self); /* Mock Battery */ - + p->battery_mock = indicator_power_device_new("/some/path", UP_DEVICE_KIND_BATTERY, + "Some Model", 50.0, UP_DEVICE_STATE_DISCHARGING, 60*30, |