diff options
-rw-r--r-- | src/dkp-backend.h | 6 | ||||
-rw-r--r-- | src/dkp-daemon.c | 236 | ||||
-rw-r--r-- | src/dkp-daemon.h | 3 | ||||
-rw-r--r-- | src/dkp-device.c | 137 | ||||
-rw-r--r-- | src/dkp-device.h | 5 | ||||
-rw-r--r-- | src/dkp-qos.c | 3 | ||||
-rw-r--r-- | src/dummy/dkp-backend.c | 12 | ||||
-rw-r--r-- | src/linux/Makefile.am | 3 | ||||
-rw-r--r-- | src/linux/dkp-backend.c | 107 | ||||
-rw-r--r-- | src/linux/dkp-device-csr.c | 4 | ||||
-rw-r--r-- | src/linux/dkp-device-hid.c | 4 | ||||
-rw-r--r-- | src/linux/dkp-device-supply.c | 4 | ||||
-rw-r--r-- | src/linux/dkp-device-wup.c | 4 | ||||
-rw-r--r-- | src/linux/dkp-input.c | 9 | ||||
-rw-r--r-- | src/org.freedesktop.DeviceKit.Power.xml | 22 |
15 files changed, 266 insertions, 293 deletions
diff --git a/src/dkp-backend.h b/src/dkp-backend.h index 20d2e88..a866693 100644 --- a/src/dkp-backend.h +++ b/src/dkp-backend.h @@ -52,12 +52,10 @@ typedef struct GObjectClass parent_class; void (* device_added) (DkpBackend *backend, GObject *native, - DkpDevice *device, - gboolean emit_signal); + DkpDevice *device); void (* device_changed) (DkpBackend *backend, GObject *native, - DkpDevice *device, - gboolean emit_signal); + DkpDevice *device); void (* device_removed) (DkpBackend *backend, GObject *native, DkpDevice *device); diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c index ba1ceb7..e31154a 100644 --- a/src/dkp-daemon.c +++ b/src/dkp-daemon.c @@ -58,14 +58,14 @@ enum enum { - DEVICE_ADDED_SIGNAL, - DEVICE_REMOVED_SIGNAL, - DEVICE_CHANGED_SIGNAL, - CHANGED_SIGNAL, - LAST_SIGNAL, + SIGNAL_DEVICE_ADDED, + SIGNAL_DEVICE_REMOVED, + SIGNAL_DEVICE_CHANGED, + SIGNAL_CHANGED, + SIGNAL_LAST, }; -static guint signals[LAST_SIGNAL] = { 0 }; +static guint signals[SIGNAL_LAST] = { 0 }; struct DkpDaemonPrivate { @@ -75,17 +75,18 @@ struct DkpDaemonPrivate DkpBackend *backend; DkpDeviceList *power_devices; gboolean on_battery; - gboolean low_battery; + gboolean on_low_battery; gboolean lid_is_closed; gboolean lid_is_present; gboolean kernel_can_suspend; gboolean kernel_can_hibernate; gboolean kernel_has_swap_space; + gboolean during_coldplug; }; static void dkp_daemon_finalize (GObject *object); static gboolean dkp_daemon_get_on_battery_local (DkpDaemon *daemon); -static gboolean dkp_daemon_get_low_battery_local (DkpDaemon *daemon); +static gboolean dkp_daemon_get_on_low_battery_local (DkpDaemon *daemon); static gboolean dkp_daemon_get_on_ac_local (DkpDaemon *daemon); G_DEFINE_TYPE (DkpDaemon, dkp_daemon, G_TYPE_OBJECT) @@ -99,42 +100,10 @@ G_DEFINE_TYPE (DkpDaemon, dkp_daemon, G_TYPE_OBJECT) #define DKP_DAEMON_ON_BATTERY_REFRESH_DEVICES_DELAY 3 /* seconds */ /** - * dkp_daemon_set_lid_is_closed: - **/ -gboolean -dkp_daemon_set_lid_is_closed (DkpDaemon *daemon, gboolean lid_is_closed, gboolean notify) -{ - gboolean ret = FALSE; - - g_return_val_if_fail (DKP_IS_DAEMON (daemon), FALSE); - - egg_debug ("lid_is_closed=%i", lid_is_closed); - if (daemon->priv->lid_is_closed == lid_is_closed) { - egg_debug ("ignoring duplicate"); - goto out; - } - - /* save */ - if (!notify) { - /* Do not emit an event on startup. Otherwise, e. g. - * gnome-power-manager would pick up a "lid is closed" change - * event when dk-p gets D-BUS activated, and thus would - * immediately suspend the machine on startup. FD#22574 */ - egg_debug ("not emitting lid change event for daemon startup"); - } else { - g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0); - } - daemon->priv->lid_is_closed = lid_is_closed; - ret = TRUE; -out: - return ret; -} - -/** - * dkp_daemon_check_state: + * dkp_daemon_check_sleep_states: **/ static gboolean -dkp_daemon_check_state (DkpDaemon *daemon) +dkp_daemon_check_sleep_states (DkpDaemon *daemon) { gchar *contents = NULL; GError *error = NULL; @@ -261,17 +230,17 @@ dkp_daemon_get_number_devices_of_type (DkpDaemon *daemon, DkpDeviceType type) } /** - * dkp_daemon_get_low_battery_local: + * dkp_daemon_get_on_low_battery_local: * * As soon as _all_ batteries are low, this is true **/ static gboolean -dkp_daemon_get_low_battery_local (DkpDaemon *daemon) +dkp_daemon_get_on_low_battery_local (DkpDaemon *daemon) { guint i; gboolean ret; gboolean result = TRUE; - gboolean low_battery; + gboolean on_low_battery; DkpDevice *device; const GPtrArray *array; @@ -279,8 +248,8 @@ dkp_daemon_get_low_battery_local (DkpDaemon *daemon) 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); - ret = dkp_device_get_low_battery (device, &low_battery); - if (ret && !low_battery) { + ret = dkp_device_get_low_battery (device, &on_low_battery); + if (ret && !on_low_battery) { result = FALSE; break; } @@ -549,6 +518,8 @@ gboolean dkp_daemon_startup (DkpDaemon *daemon) { gboolean ret; + gboolean on_battery; + gboolean on_low_battery; /* register on bus */ ret = dkp_daemon_register_power_daemon (daemon); @@ -557,6 +528,10 @@ dkp_daemon_startup (DkpDaemon *daemon) goto out; } + /* stop signals and callbacks */ + g_object_freeze_notify (G_OBJECT(daemon)); + daemon->priv->during_coldplug = TRUE; + /* coldplug backend backend */ ret = dkp_backend_coldplug (daemon->priv->backend, daemon); if (!ret) { @@ -565,9 +540,17 @@ dkp_daemon_startup (DkpDaemon *daemon) } /* get battery state */ - daemon->priv->on_battery = (dkp_daemon_get_on_battery_local (daemon) && - !dkp_daemon_get_on_ac_local (daemon)); - daemon->priv->low_battery = dkp_daemon_get_low_battery_local (daemon); + on_battery = (dkp_daemon_get_on_battery_local (daemon) && + !dkp_daemon_get_on_ac_local (daemon)); + on_low_battery = dkp_daemon_get_on_low_battery_local (daemon); + g_object_set (daemon, + "on-battery", on_battery, + "on-low-battery", on_low_battery, + NULL); + + /* start signals and callbacks */ + g_object_thaw_notify (G_OBJECT(daemon)); + daemon->priv->during_coldplug = FALSE; /* set pm-utils power policy */ dkp_daemon_set_pmutils_powersave (daemon, daemon->priv->on_battery); @@ -587,16 +570,6 @@ dkp_daemon_refresh_battery_devices_cb (DkpDaemon *daemon) } /** - * dkp_daemon_device_went_away_cb: - **/ -static void -dkp_daemon_device_went_away_cb (gpointer user_data, GObject *device) -{ - DkpDaemon *daemon = DKP_DAEMON (user_data); - dkp_device_list_remove (daemon->priv->power_devices, device); -} - -/** * dkp_daemon_get_device_list: **/ DkpDeviceList * @@ -609,7 +582,7 @@ dkp_daemon_get_device_list (DkpDaemon *daemon) * dkp_daemon_device_added_cb: **/ static void -dkp_daemon_device_added_cb (DkpBackend *backend, GObject *native, DkpDevice *device, gboolean emit_signal, DkpDaemon *daemon) +dkp_daemon_device_added_cb (DkpBackend *backend, GObject *native, DkpDevice *device, DkpDaemon *daemon) { const gchar *object_path; @@ -617,24 +590,22 @@ dkp_daemon_device_added_cb (DkpBackend *backend, GObject *native, DkpDevice *dev g_return_if_fail (native != NULL); g_return_if_fail (device != NULL); - object_path = dkp_device_get_object_path (device); - egg_debug ("added: native:%p, device:%s (%i)", native, object_path, emit_signal); - - /* only take a weak ref; the device will stay on the bus until - * it's unreffed. So if we ref it, it'll never go away */ - g_object_weak_ref (G_OBJECT (device), dkp_daemon_device_went_away_cb, daemon); + /* add to device list */ dkp_device_list_insert (daemon->priv->power_devices, native, G_OBJECT (device)); /* emit */ - if (emit_signal) - g_signal_emit (daemon, signals[DEVICE_ADDED_SIGNAL], 0, object_path); + 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); + g_signal_emit (daemon, signals[SIGNAL_DEVICE_ADDED], 0, object_path); + } } /** * dkp_daemon_device_changed_cb: **/ static void -dkp_daemon_device_changed_cb (DkpBackend *backend, GObject *native, DkpDevice *device, gboolean emit_signal, DkpDaemon *daemon) +dkp_daemon_device_changed_cb (DkpBackend *backend, GObject *native, DkpDevice *device, DkpDaemon *daemon) { const gchar *object_path; DkpDeviceType type; @@ -644,11 +615,6 @@ dkp_daemon_device_changed_cb (DkpBackend *backend, GObject *native, DkpDevice *d g_return_if_fail (native != NULL); g_return_if_fail (device != NULL); - object_path = dkp_device_get_object_path (device); - egg_debug ("changed: native:%p, device:%s (%i)", native, object_path, emit_signal); - - dkp_device_changed (device, native, emit_signal); - /* refresh battery devices when AC state changes */ g_object_get (device, "type", &type, @@ -660,21 +626,24 @@ dkp_daemon_device_changed_cb (DkpBackend *backend, GObject *native, DkpDevice *d (GSourceFunc) dkp_daemon_refresh_battery_devices_cb, daemon); } - /* second, check if the on_battery and low_battery state has changed */ + /* 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) { - daemon->priv->on_battery = ret; - egg_debug ("now on_battery = %s", ret ? "yes" : "no"); - g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0); + g_object_set (daemon, "on-battery", ret, NULL); /* set pm-utils power policy */ - dkp_daemon_set_pmutils_powersave (daemon, daemon->priv->on_battery); + dkp_daemon_set_pmutils_powersave (daemon, ret); } - ret = dkp_daemon_get_low_battery_local (daemon); - if (ret != daemon->priv->low_battery) { - daemon->priv->low_battery = ret; - egg_debug ("now low_battery = %s", ret ? "yes" : "no"); - g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0); + 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); + g_signal_emit (daemon, signals[SIGNAL_DEVICE_CHANGED], 0, object_path); } } @@ -690,12 +659,28 @@ dkp_daemon_device_removed_cb (DkpBackend *backend, GObject *native, DkpDevice *d g_return_if_fail (native != NULL); g_return_if_fail (device != NULL); - object_path = dkp_device_get_object_path (device); - egg_debug ("removed: native:%p, device:%s", native, object_path); + /* remove from list */ + dkp_device_list_remove (daemon->priv->power_devices, G_OBJECT(device)); - dkp_device_removed (device); - g_signal_emit (daemon, signals[DEVICE_REMOVED_SIGNAL], 0, object_path); - g_object_unref (device); + /* emit */ + if (!daemon->priv->during_coldplug) { + object_path = dkp_device_get_object_path (device); + egg_debug ("emitting device-removed: %s", object_path); + g_signal_emit (daemon, signals[SIGNAL_DEVICE_REMOVED], 0, object_path); + } +} + +/** + * dkp_daemon_properties_changed_cb: + **/ +static void +dkp_daemon_properties_changed_cb (GObject *object, GParamSpec *pspec, DkpDaemon *daemon) +{ + /* emit */ + if (!daemon->priv->during_coldplug) { + egg_debug ("emitting changed"); + g_signal_emit (daemon, signals[SIGNAL_CHANGED], 0); + } } /** @@ -715,7 +700,8 @@ dkp_daemon_init (DkpDaemon *daemon) daemon->priv->kernel_has_swap_space = FALSE; daemon->priv->power_devices = dkp_device_list_new (); daemon->priv->on_battery = FALSE; - daemon->priv->low_battery = FALSE; + daemon->priv->on_low_battery = FALSE; + daemon->priv->during_coldplug = FALSE; daemon->priv->backend = dkp_backend_new (); g_signal_connect (daemon->priv->backend, "device-added", @@ -725,8 +711,18 @@ dkp_daemon_init (DkpDaemon *daemon) g_signal_connect (daemon->priv->backend, "device-removed", G_CALLBACK (dkp_daemon_device_removed_cb), daemon); + /* watch when these properties change */ + g_signal_connect (daemon, "notify::lid-is-present", + G_CALLBACK (dkp_daemon_properties_changed_cb), daemon); + g_signal_connect (daemon, "notify::lid-is-closed", + G_CALLBACK (dkp_daemon_properties_changed_cb), daemon); + g_signal_connect (daemon, "notify::on-battery", + G_CALLBACK (dkp_daemon_properties_changed_cb), daemon); + g_signal_connect (daemon, "notify::on-low-battery", + G_CALLBACK (dkp_daemon_properties_changed_cb), daemon); + /* check if we have support */ - dkp_daemon_check_state (daemon); + dkp_daemon_check_sleep_states (daemon); /* do we have enough swap? */ if (daemon->priv->kernel_can_hibernate) { @@ -773,59 +769,35 @@ dkp_daemon_error_get_type (void) } /** - * dkp_daemon_constructor: - **/ -static GObject * -dkp_daemon_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) -{ - DkpDaemon *daemon; - DkpDaemonClass *klass; - - klass = DKP_DAEMON_CLASS (g_type_class_peek (DKP_TYPE_DAEMON)); - daemon = DKP_DAEMON (G_OBJECT_CLASS (dkp_daemon_parent_class)->constructor (type, n_construct_properties, construct_properties)); - return G_OBJECT (daemon); -} - -/** * dkp_daemon_get_property: **/ static void dkp_daemon_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { DkpDaemon *daemon; - daemon = DKP_DAEMON (object); - switch (prop_id) { - case PROP_DAEMON_VERSION: g_value_set_string (value, PACKAGE_VERSION); break; - case PROP_CAN_SUSPEND: g_value_set_boolean (value, daemon->priv->kernel_can_suspend); break; - case PROP_CAN_HIBERNATE: g_value_set_boolean (value, (daemon->priv->kernel_can_hibernate && daemon->priv->kernel_has_swap_space)); break; - case PROP_ON_BATTERY: g_value_set_boolean (value, daemon->priv->on_battery); break; - case PROP_ON_LOW_BATTERY: - g_value_set_boolean (value, daemon->priv->on_battery && daemon->priv->low_battery); + g_value_set_boolean (value, daemon->priv->on_battery && daemon->priv->on_low_battery); break; - case PROP_LID_IS_CLOSED: g_value_set_boolean (value, daemon->priv->lid_is_closed); break; - case PROP_LID_IS_PRESENT: g_value_set_boolean (value, daemon->priv->lid_is_present); break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -839,15 +811,22 @@ static void dkp_daemon_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { DkpDaemon *daemon = DKP_DAEMON (object); - switch (prop_id) { - case PROP_LID_IS_CLOSED: daemon->priv->lid_is_closed = g_value_get_boolean (value); + egg_debug ("now lid_is_closed = %s", daemon->priv->lid_is_closed ? "yes" : "no"); break; - case PROP_LID_IS_PRESENT: daemon->priv->lid_is_present = g_value_get_boolean (value); + egg_debug ("now lid_is_present = %s", daemon->priv->lid_is_present ? "yes" : "no"); + break; + case PROP_ON_BATTERY: + daemon->priv->on_battery = g_value_get_boolean (value); + egg_debug ("now on_battery = %s", daemon->priv->on_battery ? "yes" : "no"); + break; + case PROP_ON_LOW_BATTERY: + daemon->priv->on_low_battery = g_value_get_boolean (value); + egg_debug ("now on_low_battery = %s", daemon->priv->on_low_battery ? "yes" : "no"); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -862,15 +841,13 @@ static void dkp_daemon_class_init (DkpDaemonClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->constructor = dkp_daemon_constructor; object_class->finalize = dkp_daemon_finalize; object_class->get_property = dkp_daemon_get_property; object_class->set_property = dkp_daemon_set_property; g_type_class_add_private (klass, sizeof (DkpDaemonPrivate)); - signals[DEVICE_ADDED_SIGNAL] = + signals[SIGNAL_DEVICE_ADDED] = g_signal_new ("device-added", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, @@ -878,7 +855,7 @@ dkp_daemon_class_init (DkpDaemonClass *klass) g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); - signals[DEVICE_REMOVED_SIGNAL] = + signals[SIGNAL_DEVICE_REMOVED] = g_signal_new ("device-removed", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, @@ -886,7 +863,7 @@ dkp_daemon_class_init (DkpDaemonClass *klass) g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); - signals[DEVICE_CHANGED_SIGNAL] = + signals[SIGNAL_DEVICE_CHANGED] = g_signal_new ("device-changed", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, @@ -894,7 +871,7 @@ dkp_daemon_class_init (DkpDaemonClass *klass) g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); - signals[CHANGED_SIGNAL] = + signals[SIGNAL_CHANGED] = g_signal_new ("changed", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, @@ -941,7 +918,7 @@ dkp_daemon_class_init (DkpDaemonClass *klass) "On Battery", "Whether the system is running on battery", FALSE, - G_PARAM_READABLE)); + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_ON_LOW_BATTERY, @@ -949,7 +926,7 @@ dkp_daemon_class_init (DkpDaemonClass *klass) "On Low Battery", "Whether the system is running on battery and if the battery is critically low", FALSE, - G_PARAM_READABLE)); + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_LID_IS_CLOSED, @@ -983,8 +960,7 @@ dkp_daemon_finalize (GObject *object) g_object_unref (daemon->priv->proxy); if (daemon->priv->connection != NULL) dbus_g_connection_unref (daemon->priv->connection); - if (daemon->priv->power_devices != NULL) - g_object_unref (daemon->priv->power_devices); + g_object_unref (daemon->priv->power_devices); g_object_unref (daemon->priv->polkit); g_object_unref (daemon->priv->backend); diff --git a/src/dkp-daemon.h b/src/dkp-daemon.h index 9ea1210..fa371fa 100644 --- a/src/dkp-daemon.h +++ b/src/dkp-daemon.h @@ -71,9 +71,6 @@ DkpDaemon *dkp_daemon_new (void); guint dkp_daemon_get_number_devices_of_type (DkpDaemon *daemon, DkpDeviceType type); DkpDeviceList *dkp_daemon_get_device_list (DkpDaemon *daemon); -gboolean dkp_daemon_set_lid_is_closed (DkpDaemon *daemon, - gboolean lid_is_closed, - gboolean notify); gboolean dkp_daemon_startup (DkpDaemon *daemon); /* exported */ diff --git a/src/dkp-device.c b/src/dkp-device.c index df57313..254724a 100644 --- a/src/dkp-device.c +++ b/src/dkp-device.c @@ -1,7 +1,7 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- * * Copyright (C) 2008 David Zeuthen <davidz@redhat.com> - * Copyright (C) 2008 Richard Hughes <richard@hughsie.com> + * Copyright (C) 2008-2009 Richard Hughes <richard@hughsie.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -119,11 +119,11 @@ enum enum { - CHANGED_SIGNAL, - LAST_SIGNAL, + SIGNAL_CHANGED, + SIGNAL_LAST, }; -static guint signals[LAST_SIGNAL] = { 0 }; +static guint signals[SIGNAL_LAST] = { 0 }; G_DEFINE_TYPE (DkpDevice, dkp_device, G_TYPE_OBJECT) #define DKP_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DKP_TYPE_DEVICE, DkpDevicePrivate)) @@ -368,18 +368,6 @@ dkp_device_set_property (GObject *object, guint prop_id, const GValue *value, GP } /** - * dkp_device_removed: - **/ -void -dkp_device_removed (DkpDevice *device) -{ - //DkpDeviceClass *klass = DKP_DEVICE_GET_CLASS (device); - //klass->removed (device); - g_return_if_fail (DKP_IS_DEVICE (device)); - egg_warning ("do something here?"); -} - -/** * dkp_device_get_on_battery: * * Note: Only implement for system devices, i.e. ones supplying the system @@ -485,8 +473,32 @@ dkp_device_get_id (DkpDevice *device) id = g_string_free (string, FALSE); } else { - /* generic fallback */ - id = g_strdup_printf ("%s-%s-%s", device->priv->vendor, device->priv->model, device->priv->serial); + /* generic fallback, get what data we can */ + string = g_string_new (""); + if (device->priv->vendor != NULL) { + g_string_append (string, device->priv->vendor); + g_string_append_c (string, '-'); + } + if (device->priv->model != NULL) { + g_string_append (string, device->priv->model); + g_string_append_c (string, '-'); + } + if (device->priv->serial != NULL) { + g_string_append (string, device->priv->serial); + g_string_append_c (string, '-'); + } + + /* make sure we are sane */ + if (string->len == 0) { + /* just use something generic */ + g_string_append (string, "generic_id"); + } else { + /* remove trailing '-' */ + g_string_set_size (string, string->len - 1); + } + + /* the id may have invalid chars that need to be replaced */ + id = g_string_free (string, FALSE); } g_strdelimit (id, "\\\t\"?' /,.", '_'); @@ -534,7 +546,7 @@ dkp_device_coldplug (DkpDevice *device, DkpDaemon *daemon, GObject *native) if (klass->coldplug != NULL) { ret = klass->coldplug (device); if (!ret) { - egg_debug ("failed to coldplug %p", device); + egg_debug ("failed to coldplug %s", device->priv->native_path); goto out; } } @@ -542,14 +554,14 @@ dkp_device_coldplug (DkpDevice *device, DkpDaemon *daemon, GObject *native) /* only put on the bus if we succeeded */ ret = dkp_device_register_device (device); if (!ret) { - egg_warning ("failed to register device"); + egg_warning ("failed to register device %s", device->priv->native_path); goto out; } /* force a refresh, although failure isn't fatal */ ret = dkp_device_refresh_internal (device); if (!ret) { - egg_debug ("failed to refresh"); + egg_debug ("failed to refresh %s", device->priv->native_path); /* TODO: refresh should really have seporate * success _and_ changed parameters */ @@ -744,32 +756,6 @@ dkp_device_refresh (DkpDevice *device, DBusGMethodInvocation *context) return ret; } - -/** - * dkp_device_changed: - **/ -gboolean -dkp_device_changed (DkpDevice *device, GObject *native, gboolean emit_signal) -{ - gboolean ret; - - g_return_val_if_fail (DKP_IS_DEVICE (device), FALSE); - - g_object_unref (device->priv->native); - device->priv->native = g_object_ref (native); - - ret = dkp_device_refresh_internal (device); - - /* we failed to refresh, don't emit changed */ - if (!ret) - goto out; - - /* no, it's good .. keep it */ - dkp_device_emit_changed (device); -out: - return ret; -} - /** * dkp_device_get_object_path: **/ @@ -788,33 +774,6 @@ dkp_device_get_native (DkpDevice *device) } /** - * dkp_device_emit_changed: - **/ -void -dkp_device_emit_changed (DkpDevice *device) -{ - g_return_if_fail (DKP_IS_DEVICE (device)); - - /* save new history */ - dkp_history_set_state (device->priv->history, device->priv->state); - dkp_history_set_charge_data (device->priv->history, device->priv->percentage); - dkp_history_set_rate_data (device->priv->history, device->priv->energy_rate); - dkp_history_set_time_full_data (device->priv->history, device->priv->time_to_full); - dkp_history_set_time_empty_data (device->priv->history, device->priv->time_to_empty); - - egg_debug ("emitting changed on %s", device->priv->native_path); - - /* 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... - */ - g_signal_emit (device, signals[CHANGED_SIGNAL], 0); - g_signal_emit_by_name (device->priv->daemon, "device-changed", - device->priv->object_path, NULL); -} - -/** * dkp_device_compute_object_path: **/ static gchar * @@ -871,6 +830,33 @@ dkp_device_register_device (DkpDevice *device) } /** + * dkp_device_perhaps_changed_cb: + **/ +static void +dkp_device_perhaps_changed_cb (GObject *object, GParamSpec *pspec, DkpDevice *device) +{ + g_return_if_fail (DKP_IS_DEVICE (device)); + + /* save new history */ + dkp_history_set_state (device->priv->history, device->priv->state); + dkp_history_set_charge_data (device->priv->history, device->priv->percentage); + dkp_history_set_rate_data (device->priv->history, device->priv->energy_rate); + dkp_history_set_time_full_data (device->priv->history, device->priv->time_to_full); + 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... + */ + 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); +} + +/** * dkp_device_init: **/ static void @@ -892,6 +878,7 @@ dkp_device_init (DkpDevice *device) egg_error ("error getting system bus: %s", error->message); g_error_free (error); } + g_signal_connect (device, "notify::update-time", G_CALLBACK (dkp_device_perhaps_changed_cb), device); } /** @@ -934,7 +921,7 @@ dkp_device_class_init (DkpDeviceClass *klass) g_type_class_add_private (klass, sizeof (DkpDevicePrivate)); - signals[CHANGED_SIGNAL] = + signals[SIGNAL_CHANGED] = g_signal_new ("changed", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, diff --git a/src/dkp-device.h b/src/dkp-device.h index f26dba0..0e03f0f 100644 --- a/src/dkp-device.h +++ b/src/dkp-device.h @@ -78,10 +78,6 @@ gboolean dkp_device_coldplug (DkpDevice *device, DkpDaemon *daemon, GObject *native); DkpDaemon *dkp_device_get_daemon (DkpDevice *device); -gboolean dkp_device_changed (DkpDevice *device, - GObject *native, - gboolean synthesized); -void dkp_device_removed (DkpDevice *device); GObject *dkp_device_get_native (DkpDevice *device); const gchar *dkp_device_get_object_path (DkpDevice *device); gboolean dkp_device_get_on_battery (DkpDevice *device, @@ -90,7 +86,6 @@ gboolean dkp_device_get_low_battery (DkpDevice *device, gboolean *low_battery); 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 */ diff --git a/src/dkp-qos.c b/src/dkp-qos.c index e1d4c60..407e369 100644 --- a/src/dkp-qos.c +++ b/src/dkp-qos.c @@ -620,7 +620,8 @@ dkp_qos_finalize (GObject *object) g_ptr_array_foreach (qos->priv->data, (GFunc) dkp_qos_free_data_obj, NULL); g_ptr_array_free (qos->priv->data, TRUE); g_object_unref (qos->priv->proxy); - g_object_unref (qos->priv->polkit); +//FIXME: causes bt +// g_object_unref (qos->priv->polkit); G_OBJECT_CLASS (dkp_qos_parent_class)->finalize (object); } diff --git a/src/dummy/dkp-backend.c b/src/dummy/dkp-backend.c index 0241a76..8db6277 100644 --- a/src/dummy/dkp-backend.c +++ b/src/dummy/dkp-backend.c @@ -66,7 +66,7 @@ static gboolean dkp_backend_changed_time_cb (DkpBackend *backend) { /* emit */ - g_signal_emit (backend, signals[SIGNAL_DEVICE_CHANGED], 0, backend->priv->native, backend->priv->device, TRUE); + g_signal_emit (backend, signals[SIGNAL_DEVICE_CHANGED], 0, backend->priv->native, backend->priv->device); return TRUE; } @@ -86,7 +86,7 @@ dkp_backend_add_cb (DkpBackend *backend) } /* emit */ - g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, backend->priv->native, backend->priv->device, TRUE); + g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, backend->priv->native, backend->priv->device); /* setup poll */ g_timeout_add_seconds (2, (GSourceFunc) dkp_backend_changed_time_cb, backend); @@ -130,14 +130,14 @@ dkp_backend_class_init (DkpBackendClass *klass) g_signal_new ("device-added", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (DkpBackendClass, device_added), - NULL, NULL, dkp_marshal_VOID__POINTER_POINTER_BOOLEAN, - G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_BOOLEAN); + NULL, NULL, dkp_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); signals [SIGNAL_DEVICE_CHANGED] = g_signal_new ("device-changed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (DkpBackendClass, device_changed), - NULL, NULL, dkp_marshal_VOID__POINTER_POINTER_BOOLEAN, - G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_BOOLEAN); + NULL, NULL, dkp_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); signals [SIGNAL_DEVICE_REMOVED] = g_signal_new ("device-removed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, diff --git a/src/linux/Makefile.am b/src/linux/Makefile.am index d5fd21d..039cccb 100644 --- a/src/linux/Makefile.am +++ b/src/linux/Makefile.am @@ -36,6 +36,9 @@ libdkpshared_la_SOURCES = \ sysfs-utils.h \ $(BUILT_SOURCES) +libdkpshared_la_CFLAGS = \ + $(WARNINGFLAGS_C) + clean-local : rm -f *~ diff --git a/src/linux/dkp-backend.c b/src/linux/dkp-backend.c index 5788acc..4210561 100644 --- a/src/linux/dkp-backend.c +++ b/src/linux/dkp-backend.c @@ -66,40 +66,14 @@ static guint signals [SIGNAL_LAST] = { 0 }; G_DEFINE_TYPE (DkpBackend, dkp_backend, G_TYPE_OBJECT) -static gboolean dkp_backend_device_add (DkpBackend *backend, GUdevDevice *native, gboolean emit_signal); +static gboolean dkp_backend_device_add (DkpBackend *backend, GUdevDevice *native); static void dkp_backend_device_remove (DkpBackend *backend, GUdevDevice *native); /** - * dkp_backend_device_changed: - **/ -static void -dkp_backend_device_changed (DkpBackend *backend, GUdevDevice *native, gboolean emit_signal) -{ - GObject *object; - DkpDevice *device; - - /* first, change the device and add it if it doesn't exist */ - object = dkp_device_list_lookup (backend->priv->device_list, G_OBJECT (native)); - if (object == NULL) { - egg_debug ("treating change event as add on %s", g_udev_device_get_sysfs_path (native)); - dkp_backend_device_add (backend, native, TRUE); - goto out; - } - - device = DKP_DEVICE (object); - egg_debug ("changed %s", dkp_device_get_object_path (device)); - - /* emit */ - g_signal_emit (backend, signals[SIGNAL_DEVICE_CHANGED], 0, native, device, emit_signal); -out: - return; -} - -/** - * dkp_backend_device_get: + * dkp_backend_device_new: **/ static DkpDevice * -dkp_backend_device_get (DkpBackend *backend, GUdevDevice *native) +dkp_backend_device_new (DkpBackend *backend, GUdevDevice *native) { const gchar *subsys; const gchar *native_path; @@ -129,7 +103,7 @@ dkp_backend_device_get (DkpBackend *backend, GUdevDevice *native) goto out; g_object_unref (device); - /* no valid TTY object ;-( */ + /* no valid TTY object */ device = NULL; } else if (g_strcmp0 (subsys, "usb") == 0) { @@ -148,7 +122,7 @@ dkp_backend_device_get (DkpBackend *backend, GUdevDevice *native) goto out; g_object_unref (device); - /* no valid USB object ;-( */ + /* no valid USB object */ device = NULL; } else if (g_strcmp0 (subsys, "input") == 0) { @@ -181,10 +155,43 @@ out: } /** + * dkp_backend_device_changed: + **/ +static void +dkp_backend_device_changed (DkpBackend *backend, GUdevDevice *native) +{ + GObject *object; + DkpDevice *device; + gboolean ret; + + /* first, check the device and add it if it doesn't exist */ + object = dkp_device_list_lookup (backend->priv->device_list, G_OBJECT (native)); + if (object == NULL) { + egg_warning ("treating change event as add on %s", g_udev_device_get_sysfs_path (native)); + dkp_backend_device_add (backend, native); + goto out; + } + + /* need to refresh device */ + device = DKP_DEVICE (object); + ret = dkp_device_refresh_internal (device); + if (!ret) { + egg_debug ("no changes on %s", dkp_device_get_object_path (device)); + goto out; + } + + /* emit */ + egg_debug ("emitting changed %s", dkp_device_get_object_path (device)); + g_signal_emit (backend, signals[SIGNAL_DEVICE_CHANGED], 0, native, device); +out: + return; +} + +/** * dkp_backend_device_add: **/ static gboolean -dkp_backend_device_add (DkpBackend *backend, GUdevDevice *native, gboolean emit_signal) +dkp_backend_device_add (DkpBackend *backend, GUdevDevice *native) { GObject *object; DkpDevice *device; @@ -195,21 +202,21 @@ dkp_backend_device_add (DkpBackend *backend, GUdevDevice *native, gboolean emit_ if (object != NULL) { device = DKP_DEVICE (object); /* we already have the device; treat as change event */ - egg_debug ("treating add event as change event on %s", dkp_device_get_object_path (device)); - dkp_backend_device_changed (backend, native, FALSE); + egg_warning ("treating add event as change event on %s", dkp_device_get_object_path (device)); + dkp_backend_device_changed (backend, native); goto out; } /* get the right sort of device */ - device = dkp_backend_device_get (backend, native); + device = dkp_backend_device_new (backend, native); if (device == NULL) { - egg_debug ("not adding device %s", g_udev_device_get_sysfs_path (native)); ret = FALSE; goto out; } /* emit */ - g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, native, device, emit_signal); + g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, native, device); + g_object_unref (device); out: return ret; } @@ -226,11 +233,15 @@ dkp_backend_device_remove (DkpBackend *backend, GUdevDevice *native) /* does device exist in db? */ object = dkp_device_list_lookup (backend->priv->device_list, G_OBJECT (native)); if (object == NULL) { - egg_debug ("ignoring remove event on %s", g_udev_device_get_sysfs_path (native)); + egg_warning ("ignoring remove event on %s", g_udev_device_get_sysfs_path (native)); } else { device = DKP_DEVICE (object); /* emit */ + egg_debug ("emitting device-removed: %s", g_udev_device_get_sysfs_path (native)); g_signal_emit (backend, signals[SIGNAL_DEVICE_REMOVED], 0, native, device); + + /* destroy */ + g_object_unref (device); } } @@ -244,14 +255,14 @@ dkp_backend_uevent_signal_handler_cb (GUdevClient *client, const gchar *action, DkpBackend *backend = DKP_BACKEND (user_data); if (g_strcmp0 (action, "add") == 0) { - egg_debug ("add %s", g_udev_device_get_sysfs_path (device)); - dkp_backend_device_add (backend, device, TRUE); + egg_debug ("SYSFS add %s", g_udev_device_get_sysfs_path (device)); + dkp_backend_device_add (backend, device); } else if (g_strcmp0 (action, "remove") == 0) { - egg_debug ("remove %s", g_udev_device_get_sysfs_path (device)); + egg_debug ("SYSFS remove %s", g_udev_device_get_sysfs_path (device)); dkp_backend_device_remove (backend, device); } else if (g_strcmp0 (action, "change") == 0) { - egg_debug ("change %s", g_udev_device_get_sysfs_path (device)); - dkp_backend_device_changed (backend, device, FALSE); + egg_debug ("SYSFS change %s", g_udev_device_get_sysfs_path (device)); + dkp_backend_device_changed (backend, device); } else { egg_warning ("unhandled action '%s' on %s", action, g_udev_device_get_sysfs_path (device)); } @@ -288,7 +299,7 @@ dkp_backend_coldplug (DkpBackend *backend, DkpDaemon *daemon) devices = g_udev_client_query_by_subsystem (backend->priv->gudev_client, subsystems[i]); for (l = devices; l != NULL; l = l->next) { native = l->data; - dkp_backend_device_add (backend, native, FALSE); + dkp_backend_device_add (backend, native); } g_list_foreach (devices, (GFunc) g_object_unref, NULL); g_list_free (devices); @@ -311,14 +322,14 @@ dkp_backend_class_init (DkpBackendClass *klass) g_signal_new ("device-added", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (DkpBackendClass, device_added), - NULL, NULL, dkp_marshal_VOID__POINTER_POINTER_BOOLEAN, - G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_BOOLEAN); + NULL, NULL, dkp_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); signals [SIGNAL_DEVICE_CHANGED] = g_signal_new ("device-changed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (DkpBackendClass, device_changed), - NULL, NULL, dkp_marshal_VOID__POINTER_POINTER_BOOLEAN, - G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_BOOLEAN); + NULL, NULL, dkp_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); signals [SIGNAL_DEVICE_REMOVED] = g_signal_new ("device-removed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, diff --git a/src/linux/dkp-device-csr.c b/src/linux/dkp-device-csr.c index b2f5d8a..75ac383 100644 --- a/src/linux/dkp-device-csr.c +++ b/src/linux/dkp-device-csr.c @@ -78,8 +78,8 @@ dkp_device_csr_poll_cb (DkpDeviceCsr *csr) egg_debug ("Polling: %s", dkp_device_get_object_path (device)); ret = dkp_device_csr_refresh (device); - if (ret) - dkp_device_emit_changed (device); + + /* always continue polling */ return TRUE; } diff --git a/src/linux/dkp-device-hid.c b/src/linux/dkp-device-hid.c index 9ecf08e..77b0a44 100644 --- a/src/linux/dkp-device-hid.c +++ b/src/linux/dkp-device-hid.c @@ -137,8 +137,8 @@ dkp_device_hid_poll (DkpDeviceHid *hid) egg_debug ("Polling: %s", dkp_device_get_object_path (device)); ret = dkp_device_hid_refresh (device); - if (ret) - dkp_device_emit_changed (device); + + /* always continue polling */ return TRUE; } diff --git a/src/linux/dkp-device-supply.c b/src/linux/dkp-device-supply.c index 05ce8fa..56f873a 100644 --- a/src/linux/dkp-device-supply.c +++ b/src/linux/dkp-device-supply.c @@ -614,8 +614,8 @@ dkp_device_supply_poll_battery (DkpDeviceSupply *supply) egg_debug ("No updates on supply %s for %i seconds; forcing update", dkp_device_get_object_path (device), DKP_DEVICE_SUPPLY_REFRESH_TIMEOUT); supply->priv->poll_timer_id = 0; ret = dkp_device_supply_refresh (device); - if (ret) - dkp_device_emit_changed (device); + + /* never repeat */ return FALSE; } diff --git a/src/linux/dkp-device-wup.c b/src/linux/dkp-device-wup.c index d321342..99f9393 100644 --- a/src/linux/dkp-device-wup.c +++ b/src/linux/dkp-device-wup.c @@ -90,8 +90,8 @@ dkp_device_wup_poll_cb (DkpDeviceWup *wup) egg_debug ("Polling: %s", dkp_device_get_object_path (device)); ret = dkp_device_wup_refresh (device); - if (ret) - dkp_device_emit_changed (device); + + /* always continue polling */ return TRUE; } diff --git a/src/linux/dkp-input.c b/src/linux/dkp-input.c index 59b4cf4..0ea72b5 100644 --- a/src/linux/dkp-input.c +++ b/src/linux/dkp-input.c @@ -152,7 +152,9 @@ dkp_input_event_io (GIOChannel *channel, GIOCondition condition, gpointer data) /* are we set */ ret = test_bit (input->priv->event.code, bitmask); - dkp_daemon_set_lid_is_closed (input->priv->daemon, ret, TRUE); + g_object_set (input->priv->daemon, + "lid-is-closed", ret, + NULL); } out: return TRUE; @@ -251,8 +253,9 @@ dkp_input_coldplug (DkpInput *input, DkpDaemon *daemon, GUdevDevice *d) /* set if we are closed */ egg_debug ("using %s for lid event", native_path); - dkp_daemon_set_lid_is_closed (daemon, test_bit (SW_LID, bitmask), FALSE); - + g_object_set (input->priv->daemon, + "lid-is-closed", test_bit (SW_LID, bitmask), + NULL); out: g_free (path); g_free (contents); diff --git a/src/org.freedesktop.DeviceKit.Power.xml b/src/org.freedesktop.DeviceKit.Power.xml index dd310cd..f6f3df9 100644 --- a/src/org.freedesktop.DeviceKit.Power.xml +++ b/src/org.freedesktop.DeviceKit.Power.xml @@ -101,6 +101,17 @@ method return sender=:1.386 -> dest=:1.451 reply_serial=2 <!-- ************************************************************ --> + <signal name="Changed"> + <doc:doc> + <doc:description> + <doc:para> + Emitted when one or more properties on the object changes. + </doc:para> + </doc:description> + </doc:doc> + </signal> + <!-- ************************************************************ --> + <method name="Suspend"> <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> <doc:doc> @@ -127,6 +138,7 @@ method return sender=:1.386 -> dest=:1.451 reply_serial=2 </doc:doc> </method> + <!-- ************************************************************ --> <property name="daemon-version" type="s" access="read"> @@ -181,16 +193,6 @@ method return sender=:1.386 -> dest=:1.451 reply_serial=2 </doc:doc> </property> - <signal name="Changed"> - <doc:doc> - <doc:description> - <doc:para> - Emitted when one or more properties on the object changes. - </doc:para> - </doc:description> - </doc:doc> - </signal> - </interface> </node> |