aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/device-provider-upower.c14
-rw-r--r--src/device.c119
-rw-r--r--src/device.h9
-rw-r--r--src/service.c63
-rw-r--r--src/testing.c7
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,