summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dkp-daemon.c49
-rw-r--r--src/dkp-device.c3
-rw-r--r--src/dkp-device.h1
3 files changed, 50 insertions, 3 deletions
diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c
index 3ab7a75..79cf113 100644
--- a/src/dkp-daemon.c
+++ b/src/dkp-daemon.c
@@ -102,7 +102,10 @@ G_DEFINE_TYPE (DkpDaemon, dkp_daemon, G_TYPE_OBJECT)
#define DKP_DAEMON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DKP_TYPE_DAEMON, DkpDaemonPrivate))
/* if using more memory compared to usable swap, disable hibernate */
-#define DKP_DAEMON_SWAP_WATERLINE 80.0f /* % */
+#define DKP_DAEMON_SWAP_WATERLINE 80.0f /* % */
+
+/* refresh all the devices after this much time when on-battery has changed */
+#define DKP_DAEMON_ON_BATTERY_REFRESH_DEVICES_DELAY 3 /* seconds */
/**
* dkp_daemon_set_lid_is_closed:
@@ -617,6 +620,43 @@ out:
}
/**
+ * dkp_daemon_refresh_battery_devices:
+ **/
+static gboolean
+dkp_daemon_refresh_battery_devices (DkpDaemon *daemon)
+{
+ guint i;
+ const GPtrArray *array;
+ DkpDevice *device;
+ DkpDeviceType type;
+
+ /* refresh all devices in array */
+ array = dkp_device_list_get_array (daemon->priv->power_devices);
+ for (i=0; i<array->len; i++) {
+ device = (DkpDevice *) g_ptr_array_index (array, i);
+ /* only refresh battery devices */
+ g_object_get (device,
+ "type", &type,
+ NULL);
+ if (type == DKP_DEVICE_TYPE_BATTERY)
+ dkp_device_refresh_internal (device);
+ }
+
+ return TRUE;
+}
+
+/**
+ * dkp_daemon_refresh_battery_devices_cb:
+ **/
+static gboolean
+dkp_daemon_refresh_battery_devices_cb (DkpDaemon *daemon)
+{
+ egg_debug ("doing the delayed refresh");
+ dkp_daemon_refresh_battery_devices (daemon);
+ return FALSE;
+}
+
+/**
* dkp_daemon_device_changed:
**/
static void
@@ -644,6 +684,13 @@ gpk_daemon_device_changed (DkpDaemon *daemon, GUdevDevice *d, gboolean synthesiz
egg_debug ("now on_battery = %s", ret ? "yes" : "no");
g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0);
+ /* refresh all the devices now */
+ dkp_daemon_refresh_battery_devices (daemon);
+
+ /* refresh again in a little while */
+ g_timeout_add_seconds (DKP_DAEMON_ON_BATTERY_REFRESH_DEVICES_DELAY,
+ (GSourceFunc) dkp_daemon_refresh_battery_devices_cb, daemon);
+
/* set pm-utils power policy */
dkp_daemon_set_pmutils_powersave (daemon, daemon->priv->on_battery);
}
diff --git a/src/dkp-device.c b/src/dkp-device.c
index 04392fc..c3b0edc 100644
--- a/src/dkp-device.c
+++ b/src/dkp-device.c
@@ -87,7 +87,6 @@ struct DkpDevicePrivate
static void dkp_device_class_init (DkpDeviceClass *klass);
static void dkp_device_init (DkpDevice *device);
static gboolean dkp_device_register_device (DkpDevice *device);
-static gboolean dkp_device_refresh_internal (DkpDevice *device);
enum
{
@@ -703,7 +702,7 @@ out:
/**
* dkp_device_refresh_internal:
**/
-static gboolean
+gboolean
dkp_device_refresh_internal (DkpDevice *device)
{
gboolean ret;
diff --git a/src/dkp-device.h b/src/dkp-device.h
index 0dbae82..e217dcf 100644
--- a/src/dkp-device.h
+++ b/src/dkp-device.h
@@ -91,6 +91,7 @@ gboolean dkp_device_get_low_battery (DkpDevice *device,
gboolean dkp_device_get_online (DkpDevice *device,
gboolean *online);
void dkp_device_emit_changed (DkpDevice *device);
+gboolean dkp_device_refresh_internal (DkpDevice *device);
/* exported methods */
gboolean dkp_device_refresh (DkpDevice *device,