diff options
author | Richard Hughes <richard@hughsie.com> | 2009-10-16 15:30:38 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2009-10-16 15:30:38 +0100 |
commit | f4229cce743c2b61b2a3a3e8d583791bc6999199 (patch) | |
tree | 9b64822968e2daaf08ef6586cbecf56ef17ba640 /src | |
parent | cd74873cbd42ace6486b0e3f9ef78a7a2b0c79be (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.c | 87 | ||||
-rw-r--r-- | src/dkp-device.c | 8 |
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); } /** |