Refresh all battery devices after a power event, and again after a short delay. Fixes rh#512995

This commit is contained in:
Richard Hughes 2009-07-21 20:33:56 +01:00
parent 969c6a928a
commit fbbc823a48
3 changed files with 50 additions and 3 deletions

View file

@ -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:
@ -616,6 +619,43 @@ out:
return ret;
}
/**
* 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:
**/
@ -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);
}

View file

@ -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;

View file

@ -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,