summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2009-10-16 15:30:38 +0100
committerRichard Hughes <richard@hughsie.com>2009-10-16 15:30:38 +0100
commitf4229cce743c2b61b2a3a3e8d583791bc6999199 (patch)
tree9b64822968e2daaf08ef6586cbecf56ef17ba640 /src
parentcd74873cbd42ace6486b0e3f9ef78a7a2b0c79be (diff)
Connect to the device changed signal rather than the backend changed signal so we get the event for all refreshed data
Diffstat (limited to 'src')
-rw-r--r--src/dkp-daemon.c87
-rw-r--r--src/dkp-device.c8
2 files changed, 55 insertions, 40 deletions
diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c
index 226d86e..5f6bca1 100644
--- a/src/dkp-daemon.c
+++ b/src/dkp-daemon.c
@@ -699,83 +699,96 @@ dkp_daemon_get_device_list (DkpDaemon *daemon)
}
/**
- * dkp_daemon_device_added_cb:
+ * dkp_daemon_device_changed_cb:
**/
static void
-dkp_daemon_device_added_cb (DkpBackend *backend, GObject *native, DkpDevice *device, DkpDaemon *daemon)
+dkp_daemon_device_changed_cb (DkpDevice *device, DkpDaemon *daemon)
{
const gchar *object_path;
+ DkpDeviceType type;
+ gboolean ret;
g_return_if_fail (DKP_IS_DAEMON (daemon));
g_return_if_fail (DKP_IS_DEVICE (device));
- g_return_if_fail (G_IS_OBJECT (native));
- /* add to device list */
- dkp_device_list_insert (daemon->priv->power_devices, native, G_OBJECT (device));
+ /* refresh battery devices when AC state changes */
+ g_object_get (device,
+ "type", &type,
+ NULL);
+ if (type == DKP_DEVICE_TYPE_LINE_POWER) {
+ /* refresh now, and again in a little while */
+ dkp_daemon_refresh_battery_devices (daemon);
+ g_timeout_add_seconds (DKP_DAEMON_ON_BATTERY_REFRESH_DEVICES_DELAY,
+ (GSourceFunc) dkp_daemon_refresh_battery_devices_cb, daemon);
+ }
+
+ /* second, check if the on_battery and on_low_battery state has changed */
+ ret = (dkp_daemon_get_on_battery_local (daemon) && !dkp_daemon_get_on_ac_local (daemon));
+ if (ret != daemon->priv->on_battery) {
+ g_object_set (daemon, "on-battery", ret, NULL);
+
+ /* set pm-utils power policy */
+ dkp_daemon_set_pmutils_powersave (daemon, ret);
+ }
+ ret = dkp_daemon_get_on_low_battery_local (daemon);
+ if (ret != daemon->priv->on_low_battery) {
+ g_object_set (daemon, "on-low-battery", ret, NULL);
+ }
/* emit */
if (!daemon->priv->during_coldplug) {
object_path = dkp_device_get_object_path (device);
- egg_debug ("emitting added: %s (during coldplug %i)", object_path, daemon->priv->during_coldplug);
+ egg_debug ("emitting device-changed: %s", object_path);
/* don't crash the session */
if (object_path == NULL) {
- egg_warning ("INTERNAL STATE CORRUPT: not sending NULL, native:%p, device:%p", native, device);
+ egg_warning ("INTERNAL STATE CORRUPT: not sending NULL, device:%p", device);
return;
}
- g_signal_emit (daemon, signals[SIGNAL_DEVICE_ADDED], 0, object_path);
+ g_signal_emit (daemon, signals[SIGNAL_DEVICE_CHANGED], 0, object_path);
}
}
/**
- * dkp_daemon_device_changed_cb:
+ * dkp_daemon_device_added_cb:
**/
static void
-dkp_daemon_device_changed_cb (DkpBackend *backend, GObject *native, DkpDevice *device, DkpDaemon *daemon)
+dkp_daemon_device_added_cb (DkpBackend *backend, GObject *native, DkpDevice *device, DkpDaemon *daemon)
{
- const gchar *object_path;
DkpDeviceType type;
- gboolean ret;
+ const gchar *object_path;
g_return_if_fail (DKP_IS_DAEMON (daemon));
g_return_if_fail (DKP_IS_DEVICE (device));
g_return_if_fail (G_IS_OBJECT (native));
- /* refresh battery devices when AC state changes */
+ /* add to device list */
+ dkp_device_list_insert (daemon->priv->power_devices, native, G_OBJECT (device));
+
+ /* connect, so we get changes */
+ g_signal_connect (device, "changed",
+ G_CALLBACK (dkp_daemon_device_changed_cb), daemon);
+
+ /* refresh after a short delay */
g_object_get (device,
"type", &type,
NULL);
- if (type == DKP_DEVICE_TYPE_LINE_POWER) {
- /* refresh now, and again in a little while */
- dkp_daemon_refresh_battery_devices (daemon);
+ if (type == DKP_DEVICE_TYPE_BATTERY) {
g_timeout_add_seconds (DKP_DAEMON_ON_BATTERY_REFRESH_DEVICES_DELAY,
(GSourceFunc) dkp_daemon_refresh_battery_devices_cb, daemon);
}
- /* second, check if the on_battery and on_low_battery state has changed */
- ret = (dkp_daemon_get_on_battery_local (daemon) && !dkp_daemon_get_on_ac_local (daemon));
- if (ret != daemon->priv->on_battery) {
- g_object_set (daemon, "on-battery", ret, NULL);
-
- /* set pm-utils power policy */
- dkp_daemon_set_pmutils_powersave (daemon, ret);
- }
- ret = dkp_daemon_get_on_low_battery_local (daemon);
- if (ret != daemon->priv->on_low_battery) {
- g_object_set (daemon, "on-low-battery", ret, NULL);
- }
-
/* emit */
if (!daemon->priv->during_coldplug) {
object_path = dkp_device_get_object_path (device);
- egg_debug ("emitting device-changed: %s", object_path);
+ egg_debug ("emitting added: %s (during coldplug %i)", object_path, daemon->priv->during_coldplug);
/* don't crash the session */
if (object_path == NULL) {
egg_warning ("INTERNAL STATE CORRUPT: not sending NULL, native:%p, device:%p", native, device);
return;
}
- g_signal_emit (daemon, signals[SIGNAL_DEVICE_CHANGED], 0, object_path);
+ g_signal_emit (daemon, signals[SIGNAL_DEVICE_ADDED], 0, object_path);
}
}
@@ -785,6 +798,7 @@ dkp_daemon_device_changed_cb (DkpBackend *backend, GObject *native, DkpDevice *d
static void
dkp_daemon_device_removed_cb (DkpBackend *backend, GObject *native, DkpDevice *device, DkpDaemon *daemon)
{
+ DkpDeviceType type;
const gchar *object_path;
g_return_if_fail (DKP_IS_DAEMON (daemon));
@@ -794,6 +808,15 @@ dkp_daemon_device_removed_cb (DkpBackend *backend, GObject *native, DkpDevice *d
/* remove from list */
dkp_device_list_remove (daemon->priv->power_devices, G_OBJECT(device));
+ /* refresh after a short delay */
+ g_object_get (device,
+ "type", &type,
+ NULL);
+ if (type == DKP_DEVICE_TYPE_BATTERY) {
+ g_timeout_add_seconds (DKP_DAEMON_ON_BATTERY_REFRESH_DEVICES_DELAY,
+ (GSourceFunc) dkp_daemon_refresh_battery_devices_cb, daemon);
+ }
+
/* emit */
if (!daemon->priv->during_coldplug) {
object_path = dkp_device_get_object_path (device);
@@ -850,8 +873,6 @@ dkp_daemon_init (DkpDaemon *daemon)
daemon->priv->backend = dkp_backend_new ();
g_signal_connect (daemon->priv->backend, "device-added",
G_CALLBACK (dkp_daemon_device_added_cb), daemon);
- g_signal_connect (daemon->priv->backend, "device-changed",
- G_CALLBACK (dkp_daemon_device_changed_cb), daemon);
g_signal_connect (daemon->priv->backend, "device-removed",
G_CALLBACK (dkp_daemon_device_removed_cb), daemon);
diff --git a/src/dkp-device.c b/src/dkp-device.c
index 613bfe3..b8ab766 100644
--- a/src/dkp-device.c
+++ b/src/dkp-device.c
@@ -860,15 +860,9 @@ dkp_device_perhaps_changed_cb (GObject *object, GParamSpec *pspec, DkpDevice *de
dkp_history_set_time_empty_data (device->priv->history, device->priv->time_to_empty);
/* The order here matters; we want Device::Changed() before
- * the DeviceChanged() signal on the main object; otherwise
- * clients that only listens on DeviceChanged() won't be
- * fully caught up...
- */
+ * the DeviceChanged() signal on the main object */
egg_debug ("emitting changed on %s", device->priv->native_path);
g_signal_emit (device, signals[SIGNAL_CHANGED], 0);
- egg_debug ("emitting device-changed on %s", device->priv->native_path);
- g_signal_emit_by_name (device->priv->daemon, "device-changed",
- device->priv->object_path, NULL);
}
/**