diff options
author | Richard Hughes <richard@hughsie.com> | 2009-07-21 20:33:56 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2009-07-21 20:35:58 +0100 |
commit | fbbc823a480bfeaa5be8f8bcd95ada52629e327f (patch) | |
tree | f1a3d4ae4fbb9e045676481a9b048743ba5feb91 | |
parent | 969c6a928a7ff2b467cfd3d9df9c0e68fa82c5f9 (diff) |
Refresh all battery devices after a power event, and again after a short delay. Fixes rh#512995
-rw-r--r-- | src/dkp-daemon.c | 49 | ||||
-rw-r--r-- | src/dkp-device.c | 3 | ||||
-rw-r--r-- | src/dkp-device.h | 1 |
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, |