aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am19
-rw-r--r--src/device-provider-upower.c182
-rw-r--r--src/ib-brightness-control.c1
-rw-r--r--src/org.freedesktop.UPower.Device.xml705
-rw-r--r--src/service.c127
5 files changed, 167 insertions, 867 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 92117fc..be746db 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -27,31 +27,12 @@ EXTRA_DIST += org.freedesktop.UPower.xml
###
###
-
-upower_device_dbus_sources = \
- dbus-upower-device.c \
- dbus-upower-device.h
-
-$(upower_device_dbus_sources): org.freedesktop.UPower.Device.xml
- $(AM_V_GEN) gdbus-codegen \
- --c-namespace Dbus \
- --interface-prefix org.freedesktop.UPower \
- --generate-c-code dbus-upower-device \
- $^
-
-BUILT_SOURCES += $(upower_device_dbus_sources)
-CLEANFILES += $(upower_device_dbus_sources)
-EXTRA_DIST += org.freedesktop.UPower.Device.xml
-
-###
-###
###
noinst_LIBRARIES = libindicatorpower-upower.a libindicatorpower-service.a
libindicatorpower_upower_a_SOURCES = \
$(upower_dbus_sources) \
- $(upower_device_dbus_sources) \
device-provider-upower.c \
device-provider-upower.h
diff --git a/src/device-provider-upower.c b/src/device-provider-upower.c
index 1b1b7bd..7c12beb 100644
--- a/src/device-provider-upower.c
+++ b/src/device-provider-upower.c
@@ -20,7 +20,6 @@
#include "config.h"
#include "dbus-upower.h"
-#include "dbus-upower-device.h"
#include "device.h"
#include "device-provider.h"
#include "device-provider-upower.h"
@@ -34,6 +33,8 @@
struct _IndicatorPowerDeviceProviderUPowerPriv
{
+ GDBusConnection * bus;
+
DbusUPower * upower_proxy;
GHashTable * devices; /* dbus object path --> IndicatorPowerDevice */
GCancellable * cancellable;
@@ -65,6 +66,12 @@ G_DEFINE_TYPE_WITH_CODE (
**** UPOWER DBUS
***/
+struct device_get_all_data
+{
+ char * path;
+ IndicatorPowerDeviceProviderUPower * self;
+};
+
static void
emit_devices_changed (IndicatorPowerDeviceProviderUPower * self)
{
@@ -72,65 +79,97 @@ emit_devices_changed (IndicatorPowerDeviceProviderUPower * self)
}
static void
-on_upower_device_proxy_ready (GObject * o, GAsyncResult * res, gpointer gself)
+on_device_properties_ready (GObject * o, GAsyncResult * res, gpointer gdata)
{
- GError * err;
- DbusDevice * tmp;
+ GError * error;
+ GVariant * response;
+ struct device_get_all_data * data = gdata;
- err = NULL;
- tmp = dbus_device_proxy_new_for_bus_finish (res, &err);
- if (err != NULL)
+ error = NULL;
+ response = g_dbus_connection_call_finish (G_DBUS_CONNECTION(o), res, &error);
+ if (error != NULL)
{
- g_warning ("Unable to get UPower Device Proxy: %s", err->message);
- g_error_free (err);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Error getting properties for UPower device '%s': %s",
+ data->path, error->message);
+
+ g_error_free (error);
}
else
{
- /* use this proxy's properties to update our own IndicatorPowerDevice */
-
+ guint32 kind = 0;
+ guint32 state = 0;
+ gdouble percentage = 0;
+ gint64 time_to_empty = 0;
+ gint64 time_to_full = 0;
+ time_t time;
IndicatorPowerDevice * device;
- IndicatorPowerDeviceProviderUPower * self;
- priv_t * p;
-
- self = INDICATOR_POWER_DEVICE_PROVIDER_UPOWER (gself);
- p = self->priv;
-
- const guint kind = dbus_device_get_type_ (tmp);
- const gdouble percentage = dbus_device_get_percentage (tmp);
- const guint state = dbus_device_get_state (tmp);
- const gint64 time_to_empty = dbus_device_get_time_to_empty (tmp);
- const gint64 time_to_full = dbus_device_get_time_to_full (tmp);
- const time_t time = time_to_empty ? time_to_empty : time_to_full;
- const char * path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (tmp));
-
- device = indicator_power_device_new (path,
- kind,
- percentage,
- state,
- time);
-
- g_hash_table_insert (p->devices,
- g_strdup (path),
- g_object_ref (device));
-
- emit_devices_changed (self);
-
- g_object_unref (device);
- g_object_unref (tmp);
+ IndicatorPowerDeviceProviderUPowerPriv * p = data->self->priv;
+ GVariant * dict = g_variant_get_child_value (response, 0);
+
+ g_variant_lookup (dict, "Type", "u", &kind);
+ g_variant_lookup (dict, "State", "u", &state);
+ g_variant_lookup (dict, "Percentage", "d", &percentage);
+ g_variant_lookup (dict, "TimeToEmpty", "x", &time_to_empty);
+ g_variant_lookup (dict, "TimeToFull", "x", &time_to_full);
+ time = time_to_empty ? time_to_empty : time_to_full;
+
+ if ((device = g_hash_table_lookup (p->devices, data->path)))
+ {
+ g_object_set (device, INDICATOR_POWER_DEVICE_KIND, (gint)kind,
+ INDICATOR_POWER_DEVICE_STATE, (gint)state,
+ INDICATOR_POWER_DEVICE_OBJECT_PATH, data->path,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, percentage,
+ INDICATOR_POWER_DEVICE_TIME, (guint64)time,
+ NULL);
+ }
+ else
+ {
+ device = indicator_power_device_new (data->path,
+ kind,
+ percentage,
+ state,
+ time);
+
+ g_hash_table_insert (p->devices,
+ g_strdup (data->path),
+ g_object_ref (device));
+
+ g_object_unref (device);
+ }
+
+ emit_devices_changed (data->self);
+ g_variant_unref (dict);
+ g_variant_unref (response);
}
+
+ g_free (data->path);
+ g_slice_free (struct device_get_all_data, data);
}
static void
update_device_from_object_path (IndicatorPowerDeviceProviderUPower * self,
const char * path)
{
- dbus_device_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
- G_DBUS_PROXY_FLAGS_NONE,
- BUS_NAME,
- path,
- self->priv->cancellable,
- on_upower_device_proxy_ready,
- self);
+ priv_t * p = self->priv;
+ struct device_get_all_data * data;
+
+ data = g_slice_new (struct device_get_all_data);
+ data->path = g_strdup (path);
+ data->self = self;
+
+ g_dbus_connection_call (p->bus,
+ BUS_NAME,
+ path,
+ "org.freedesktop.DBus.Properties",
+ "GetAll",
+ g_variant_new ("(s)", "org.freedesktop.UPower.Device"),
+ G_VARIANT_TYPE("(a{sv})"),
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
+ -1, /* default timeout */
+ p->cancellable,
+ on_device_properties_ready,
+ data);
}
/*
@@ -273,7 +312,7 @@ on_upower_proxy_ready (GObject * source G_GNUC_UNUSED,
DbusUPower * proxy;
err = NULL;
- proxy = dbus_upower_proxy_new_for_bus_finish (res, &err);
+ proxy = dbus_upower_proxy_new_finish (res, &err);
if (err != NULL)
{
g_warning ("Unable to get UPower proxy: %s", err->message);
@@ -304,6 +343,42 @@ on_upower_proxy_ready (GObject * source G_GNUC_UNUSED,
}
}
+static void
+on_bus_ready (GObject * source_object G_GNUC_UNUSED,
+ GAsyncResult * res,
+ gpointer gself)
+{
+ GError * error;
+ GDBusConnection * tmp;
+
+ error = NULL;
+ tmp = g_bus_get_finish (res, &error);
+ if (error != NULL)
+ {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Error acquiring bus: %s", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ IndicatorPowerDeviceProviderUPower * self;
+ priv_t * p;
+
+ self = INDICATOR_POWER_DEVICE_PROVIDER_UPOWER (gself);
+ p = self->priv;
+
+ p->bus = tmp;
+
+ dbus_upower_proxy_new (p->bus,
+ G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES,
+ BUS_NAME,
+ BUS_PATH,
+ p->cancellable,
+ on_upower_proxy_ready,
+ self);
+ }
+}
+
/***
**** IndicatorPowerDeviceProvider virtual functions
***/
@@ -357,6 +432,8 @@ my_dispose (GObject * o)
g_hash_table_remove_all (p->devices);
+ g_clear_object (&p->bus);
+
G_OBJECT_CLASS (indicator_power_device_provider_upower_parent_class)->dispose (o);
}
@@ -420,13 +497,10 @@ indicator_power_device_provider_upower_init (IndicatorPowerDeviceProviderUPower
g_free,
NULL);
- dbus_upower_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
- G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES,
- BUS_NAME,
- BUS_PATH,
- p->cancellable,
- on_upower_proxy_ready,
- self);
+ g_bus_get (G_BUS_TYPE_SYSTEM,
+ p->cancellable,
+ on_bus_ready,
+ self);
}
/***
diff --git a/src/ib-brightness-control.c b/src/ib-brightness-control.c
index ddc82e5..4fb6bc5 100644
--- a/src/ib-brightness-control.c
+++ b/src/ib-brightness-control.c
@@ -126,6 +126,7 @@ ib_brightness_control_get_value_from_file (IbBrightnessControl *self, const gcha
g_error_free (error);
} else {
value = atoi (svalue);
+ g_free (svalue);
}
g_free (filename);
diff --git a/src/org.freedesktop.UPower.Device.xml b/src/org.freedesktop.UPower.Device.xml
deleted file mode 100644
index 7c9a65b..0000000
--- a/src/org.freedesktop.UPower.Device.xml
+++ /dev/null
@@ -1,705 +0,0 @@
-<!DOCTYPE node PUBLIC
-"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
-"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" [
- <!ENTITY ERROR_GENERAL "org.freedesktop.UPower.Device.GeneralError">
-]>
-<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
- <interface name="org.freedesktop.UPower.Device">
- <doc:doc>
- <doc:description>
- <doc:para>
- Objects implementing this interface are usually discovered through
- the <doc:tt>org.freedesktop.UPower</doc:tt> interface on
- the <doc:tt>/org/freedesktop/UPower</doc:tt> object on
- the D-Bus system bus service with the well-known
- name <doc:tt>org.freedesktop.UPower</doc:tt> using
- the
- <doc:ref type="method" to="Power.EnumerateDevices">EnumerateDevices</doc:ref>
- method.
- </doc:para>
- <doc:para>
- <doc:example language="shell" title="simple example">
- <doc:code>
-$ dbus-send --print-reply \
- --system \
- --dest=org.freedesktop.UPower \
- /org/freedesktop/UPower/devices/battery_BAT0 \
- org.freedesktop.DBus.Properties.GetAll \
- string:org.freedesktop.UPower.Device
-
-method return sender=:1.386 -> dest=:1.477 reply_serial=2
- array [
- dict entry(
- string "native-path"
- variant string "/sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0"
- )
- dict entry(
- string "vendor"
- variant string "SONY"
- )
- dict entry(
- string "model"
- variant string "42T4568"
- )
- dict entry(
- string "serial"
- variant string "4179"
- )
- dict entry(
- string "update-time"
- variant uint64 1226417875
- )
- dict entry(
- string "type"
- variant uint 2
- )
- dict entry(
- string "power-supply"
- variant boolean true
- )
- dict entry(
- string "has-history"
- variant boolean true
- )
- dict entry(
- string "has-statistics"
- variant boolean true
- )
- dict entry(
- string "online"
- variant boolean false
- )
- dict entry(
- string "energy"
- variant double 72.85
- )
- dict entry(
- string "energy-empty"
- variant double 0
- )
- dict entry(
- string "energy-full"
- variant double 74.55
- )
- dict entry(
- string "energy-full-design"
- variant double 74.88
- )
- dict entry(
- string "energy-rate"
- variant double 0
- )
- dict entry(
- string "voltage"
- variant double 16.415
- )
- dict entry(
- string "time-to-empty"
- variant int64 0
- )
- dict entry(
- string "time-to-full"
- variant int64 0
- )
- dict entry(
- string "percentage"
- variant double 97.7197
- )
- dict entry(
- string "is-present"
- variant boolean true
- )
- dict entry(
- string "state"
- variant uint 3
- )
- dict entry(
- string "is-rechargeable"
- variant boolean true
- )
- dict entry(
- string "capacity"
- variant double 100
- )
- dict entry(
- string "technology"
- variant uint 1
- )
- ]
- </doc:code>
- </doc:example>
- </doc:para>
- <doc:para>
- Unless otherwise noted, an empty string or the value 0 in a
- property on this interface means not set.
- </doc:para>
- </doc:description>
- </doc:doc>
-
-
- <!-- ************************************************************ -->
- <method name="Refresh">
- <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
- <doc:doc>
- <doc:description>
- <doc:para>
- Refreshes the data collected from the power source.
- </doc:para>
- </doc:description>
- <doc:permission>Callers need the org.freedesktop.upower.refresh-power-source authorization</doc:permission>
- <doc:errors>
- <doc:error name="&ERROR_GENERAL;">if an error occured while refreshing</doc:error>
- </doc:errors>
- </doc:doc>
- </method>
-
- <!-- ************************************************************ -->
- <signal name="Changed">
- <doc:doc>
- <doc:description>
- <doc:para>
- Some value on the power source changed.
- </doc:para>
- </doc:description>
- </doc:doc>
- </signal>
-
- <!-- ************************************************************ -->
- <method name="GetHistory">
- <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
- <arg name="type" direction="in" type="s">
- <doc:doc><doc:summary>The type of history.
- Valid types are <doc:tt>rate</doc:tt> or <doc:tt>charge</doc:tt>.</doc:summary></doc:doc>
- </arg>
- <arg name="timespan" direction="in" type="u">
- <doc:doc><doc:summary>The amount of data to return in seconds, or 0 for all.</doc:summary></doc:doc>
- </arg>
- <arg name="resolution" direction="in" type="u">
- <doc:doc>
- <doc:summary>
- The approximate number of points to return.
- A higher resolution is more accurate, at the expense of plotting speed.
- </doc:summary>
- </doc:doc>
- </arg>
- <arg name="data" direction="out" type="a(udu)">
- <doc:doc><doc:summary>
- The history data for the power device, if the device supports history.
- Data is ordered from the earliest in time, to the newest data point.
- Each element contains the following members:
- <doc:list>
- <doc:item>
- <doc:term>time</doc:term>
- <doc:definition>
- The time value in seconds from the <doc:tt>gettimeofday()</doc:tt> method.
- </doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>value</doc:term>
- <doc:definition>
- The data value, for instance the rate in W or the charge in %.
- </doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>state</doc:term>
- <doc:definition>
- The state of the device, for instance <doc:tt>charging</doc:tt> or
- <doc:tt>discharging</doc:tt>.
- </doc:definition>
- </doc:item>
- </doc:list>
- </doc:summary></doc:doc>
- </arg>
- <doc:doc>
- <doc:description>
- <doc:para>
- Gets history for the power device that is persistent across reboots.
- </doc:para>
- </doc:description>
- </doc:doc>
- </method>
-
- <!-- ************************************************************ -->
- <method name="GetStatistics">
- <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
- <arg name="type" direction="in" type="s">
- <doc:doc><doc:summary>The mode for the statistics.
- Valid types are <doc:tt>charging</doc:tt> or <doc:tt>discharging</doc:tt>.</doc:summary></doc:doc>
- </arg>
- <arg name="data" direction="out" type="a(dd)">
- <doc:doc><doc:summary>
- The statistics data for the power device.
- Each element contains the following members:
- <doc:list>
- <doc:item>
- <doc:term>value</doc:term>
- <doc:definition>
- The value of the percentage point, usually in seconds
- </doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>accuracy</doc:term>
- <doc:definition>
- The accuracy of the prediction in percent.
- </doc:definition>
- </doc:item>
- </doc:list>
- </doc:summary></doc:doc>
- </arg>
- <doc:doc>
- <doc:description>
- <doc:para>
- Gets statistics for the power device that may be interesting
- to show on a graph in the session.
- </doc:para>
- </doc:description>
- </doc:doc>
- </method>
-
- <!-- ************************************************************ -->
- <property name="NativePath" type="s" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- OS specific native path of the power source. On Linux this
- is the sysfs path, for
- example <doc:tt>/sys/devices/LNXSYSTM:00/device:00/PNP0C0A:00/power_supply/BAT0</doc:tt>. Is
- blank if the device is being driven by a user space
- driver.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Vendor" type="s" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Name of the vendor of the battery.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Model" type="s" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Name of the model of this battery.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Serial" type="s" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Unique serial number of the battery.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="UpdateTime" type="t" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- The point in time (seconds since the Epoch Jan 1, 1970
- 0:00 UTC) that data was read from the power source.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Type" type="u" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Type of power source.
- </doc:para>
- <doc:list>
- <doc:item>
- <doc:term>0</doc:term><doc:definition>Unknown</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>1</doc:term><doc:definition>Line Power</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>2</doc:term><doc:definition>Battery</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>3</doc:term><doc:definition>Ups</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>4</doc:term><doc:definition>Monitor</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>5</doc:term><doc:definition>Mouse</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>6</doc:term><doc:definition>Keyboard</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>7</doc:term><doc:definition>Pda</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>8</doc:term><doc:definition>Phone</doc:definition>
- </doc:item>
- </doc:list>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="PowerSupply" type="b" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- If the power device is used to supply the system.
- This would be set TRUE for laptop batteries and UPS devices,
- but set FALSE for wireless mice or PDAs.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="HasHistory" type="b" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- If the power device has history.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="HasStatistics" type="b" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- If the power device has statistics.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Online" type="b" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Whether power is currently being provided through line power.
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "line-power".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Energy" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Amount of energy (measured in Wh) currently available in
- the power source.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="EnergyEmpty" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Amount of energy (measured in Wh) in the power source when
- it's considered to be empty.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="EnergyFull" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Amount of energy (measured in Wh) in the power source when
- it's considered full.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="EnergyFullDesign" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Amount of energy (measured in Wh) the power source is
- designed to hold when it's considered full.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="EnergyRate" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Amount of energy being drained from the source, measured
- in W. If positive, the source is being discharged, if
- negative it's being charged.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Voltage" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Voltage in the Cell or being recorded by the meter.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="TimeToEmpty" type="x" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Number of seconds until the power source is considered empty.
- Is set to 0 if unknown.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="TimeToFull" type="x" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Number of seconds until the power source is considered full.
- Is set to 0 if unknown.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Percentage" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- The amount of energy left in the power source expressed as
- a percentage between 0 and 100. Typically this is the same as
- (<doc:ref type="property" to="Source:Energy">energy</doc:ref> -
- <doc:ref type="property" to="Source:EnergyEmpty">energy-empty</doc:ref>) /
- (<doc:ref type="property" to="Source:EnergyFull">energy-full</doc:ref> -
- <doc:ref type="property" to="Source:EnergyEmpty">energy-empty</doc:ref>).
- However, some primitive power sources are capable of only
- reporting percentages and in this case the energy-*
- properties will be unset while this property is set.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="IsPresent" type="b" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- If the power source is present in the bay.
- This field is required as some batteries are hot-removable, for example
- expensive UPS and most laptop batteries.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="State" type="u" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- The battery power state.
- </doc:para>
- <doc:list>
- <doc:item>
- <doc:term>0</doc:term><doc:definition>Unknown</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>1</doc:term><doc:definition>Charging</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>2</doc:term><doc:definition>Discharging</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>3</doc:term><doc:definition>Empty</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>4</doc:term><doc:definition>Fully charged</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>5</doc:term><doc:definition>Pending charge</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>6</doc:term><doc:definition>Pending discharge</doc:definition>
- </doc:item>
- </doc:list>
- <doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="IsRechargeable" type="b" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- If the power source is rechargeable.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Capacity" type="d" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- The capacity of the power source expressed as a percentage between 0 and 100.
- The capacity of the battery will reduce with age.
- A capacity value less than 75% is usually a sign that you should renew your battery.
- Typically this value is the same as
- (<doc:ref type="property" to="Source:FullDesign">full-design</doc:ref> /
- <doc:ref type="property" to="Source:Full">full</doc:ref>) * 100.
- However, some primitive power sources are not capable reporting capacity
- and in this case the capacity property will be unset.
- </doc:para><doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="Technology" type="u" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- Technology used in the battery:
- </doc:para>
- <doc:list>
- <doc:item>
- <doc:term>0</doc:term><doc:definition>Unknown</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>1</doc:term><doc:definition>Lithium ion</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>2</doc:term><doc:definition>Lithium polymer</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>3</doc:term><doc:definition>Lithium iron phosphate</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>4</doc:term><doc:definition>Lead acid</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>5</doc:term><doc:definition>Nickel cadmium</doc:definition>
- </doc:item>
- <doc:item>
- <doc:term>6</doc:term><doc:definition>Nickel metal hydride</doc:definition>
- </doc:item>
- </doc:list>
- <doc:para>
- This property is only valid if the property
- <doc:ref type="property" to="Source:Type">type</doc:ref>
- has the value "battery".
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="RecallNotice" type="b" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- If the device may have been recalled by the vendor due to a suspected
- fault.
- This key does not imply the device is faulty, only that it approximatly
- matches the description from the vendor of units that were recalled.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="RecallVendor" type="s" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- The vendor that is handling the hardware recall.
- </doc:para>
- <doc:para>
- This property is only valid if the property recall-notice is true.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- <property name="RecallUrl" type="s" access="read">
- <doc:doc>
- <doc:description>
- <doc:para>
- The URL to visit about the hardware recall.
- </doc:para>
- <doc:para>
- This property is only valid if the property recall-notice is true.
- </doc:para>
- </doc:description>
- </doc:doc>
- </property>
-
- </interface>
-
-</node>
diff --git a/src/service.c b/src/service.c
index 85ac263..2670a67 100644
--- a/src/service.c
+++ b/src/service.c
@@ -113,8 +113,6 @@ struct _IndicatorPowerServicePrivate
GSimpleActionGroup * actions;
GSimpleAction * header_action;
- GSimpleAction * show_time_action;
- GSimpleAction * show_percentage_action;
GSimpleAction * battery_level_action;
GSimpleAction * brightness_action;
@@ -342,7 +340,13 @@ create_header_state (IndicatorPowerService * self)
if (icon != NULL)
{
- g_variant_builder_add (&b, "{sv}", "icon", g_icon_serialize (icon));
+ GVariant * v;
+
+ if ((v = g_icon_serialize (icon)))
+ {
+ g_variant_builder_add (&b, "{sv}", "icon", v);
+ g_variant_unref (v);
+ }
g_object_unref (icon);
}
@@ -367,28 +371,30 @@ append_device_to_menu (GMenu * menu, const IndicatorPowerDevice * device)
if (kind != UP_DEVICE_KIND_LINE_POWER)
{
- GIcon * icon;
char * label;
- char * action;
- GMenuItem * menu_item;
+ GMenuItem * item;
+ GIcon * icon;
- icon = indicator_power_device_get_gicon (device);
label = indicator_power_device_get_label (device);
- action = g_strconcat ("indicator.activate-statistics::",
- indicator_power_device_get_object_path (device), NULL);
- menu_item = g_menu_item_new (label, action);
- g_free (action);
-
- if (icon != NULL)
- g_menu_item_set_attribute_value (menu_item,
- G_MENU_ATTRIBUTE_ICON,
- g_icon_serialize (icon));
-
- g_menu_append_item (menu, menu_item);
- g_object_unref (menu_item);
-
- g_clear_object (&icon);
+ item = g_menu_item_new (label, "indicator.activate-statistics");
g_free (label);
+ g_menu_item_set_action_and_target(item, "indicator.activate-statistics", "s",
+ indicator_power_device_get_object_path (device));
+
+ if ((icon = indicator_power_device_get_gicon (device)))
+ {
+ GVariant * v;
+ if ((v = g_icon_serialize (icon)))
+ {
+ g_menu_item_set_attribute_value (item, G_MENU_ATTRIBUTE_ICON, v);
+ g_variant_unref (v);
+ }
+
+ g_object_unref (icon);
+ }
+
+ g_menu_append_item (menu, item);
+ g_object_unref (item);
}
}
@@ -463,7 +469,7 @@ create_brightness_menuitem (IndicatorPowerService * self)
get_brightness_range (self, &lo, &hi);
- item = g_menu_item_new ("Brightness", "indicator.brightness");
+ item = g_menu_item_new (NULL, "indicator.brightness");
g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.unity.slider");
g_menu_item_set_attribute (item, "min-value", "d", brightness_to_percentage (self, lo));
g_menu_item_set_attribute (item, "max-value", "d", brightness_to_percentage (self, hi));
@@ -712,39 +718,12 @@ on_phone_settings_activated (GSimpleAction * a G_GNUC_UNUSED,
****
***/
-/* toggles the state */
-static void
-on_toggle_action_activated (GSimpleAction * simple,
- GVariant * parameter G_GNUC_UNUSED,
- gpointer unused G_GNUC_UNUSED)
-{
- GVariant * v = g_action_get_state (G_ACTION (simple));
- gboolean flag = g_variant_get_boolean (v);
- g_simple_action_set_state (simple, g_variant_new_boolean (!flag));
- g_variant_unref (v);
-}
-
-static gboolean
-settings_to_action_state (GValue * value,
- GVariant * variant,
- gpointer user_data G_GNUC_UNUSED)
-{
- g_value_set_variant (value, variant);
- return TRUE;
-}
-
-static GVariant *
-action_state_to_settings (const GValue * value,
- const GVariantType * expected_type G_GNUC_UNUSED,
- gpointer user_data G_GNUC_UNUSED)
-{
- return g_value_dup_variant (value);
-}
-
static void
init_gactions (IndicatorPowerService * self)
{
GSimpleAction * a;
+ GAction * show_time_action;
+ GAction * show_percentage_action;
priv_t * p = self->priv;
GActionEntry entries[] = {
@@ -778,32 +757,17 @@ init_gactions (IndicatorPowerService * self)
p->brightness_action = a;
/* add the show-time action */
- a = g_simple_action_new ("show-time", NULL);
- g_settings_bind_with_mapping (p->settings, SETTINGS_SHOW_TIME_S,
- a, "state",
- G_SETTINGS_BIND_DEFAULT,
- settings_to_action_state,
- action_state_to_settings,
- NULL, NULL);
- g_signal_connect (a, "activate", G_CALLBACK(on_toggle_action_activated), self);
- g_signal_connect_swapped (a, "notify", G_CALLBACK(rebuild_header_now), self);
- g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a));
- p->show_time_action = a;
+ show_time_action = g_settings_create_action (p->settings, "show-time");
+ g_action_map_add_action (G_ACTION_MAP(p->actions), show_time_action);
/* add the show-percentage action */
- a = g_simple_action_new ("show-percentage", NULL);
- g_settings_bind_with_mapping (p->settings, SETTINGS_SHOW_PERCENTAGE_S,
- a, "state",
- G_SETTINGS_BIND_DEFAULT,
- settings_to_action_state,
- action_state_to_settings,
- NULL, NULL);
- g_signal_connect (a, "activate", G_CALLBACK(on_toggle_action_activated), self);
- g_signal_connect_swapped (a, "notify", G_CALLBACK(rebuild_header_now), self);
- g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a));
- p->show_percentage_action = a;
+ show_percentage_action = g_settings_create_action (p->settings, "show-percentage");
+ g_action_map_add_action (G_ACTION_MAP(p->actions), show_percentage_action);
rebuild_header_now (self);
+
+ g_object_unref (show_time_action);
+ g_object_unref (show_percentage_action);
}
/***
@@ -1006,20 +970,6 @@ my_dispose (GObject * o)
g_clear_object (&p->settings);
}
- if (p->show_time_action != NULL)
- {
- g_signal_handlers_disconnect_by_data (p->show_time_action, self);
-
- g_clear_object (&p->show_time_action);
- }
-
- if (p->show_percentage_action != NULL)
- {
- g_signal_handlers_disconnect_by_data (p->show_percentage_action, self);
-
- g_clear_object (&p->show_percentage_action);
- }
-
g_clear_object (&p->brightness_action);
g_clear_object (&p->battery_level_action);
g_clear_object (&p->header_action);
@@ -1054,8 +1004,7 @@ indicator_power_service_init (IndicatorPowerService * self)
init_gactions (self);
- g_signal_connect_swapped (p->settings, "changed::" SETTINGS_ICON_POLICY_S,
- G_CALLBACK(rebuild_header_now), self);
+ g_signal_connect_swapped (p->settings, "changed", G_CALLBACK(rebuild_header_now), self);
p->own_id = g_bus_own_name (G_BUS_TYPE_SESSION,
BUS_NAME,