From cad70317771fa6ce1f52af9d357165d47e971d7d Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 26 Jun 2009 14:42:19 +0100 Subject: [PATCH 1/7] Interface with pm-powersave as external vendors are using this --- src/dkp-daemon.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c index de26291..847d84d 100644 --- a/src/dkp-daemon.c +++ b/src/dkp-daemon.c @@ -447,6 +447,30 @@ dkp_daemon_get_on_ac_local (DkpDaemon *daemon) return result; } +/** + * dkp_daemon_set_pmutils_powersave: + * + * Uses pm-utils to run scripts in power.d + **/ +static gboolean +dkp_daemon_set_pmutils_powersave (DkpDaemon *daemon, gboolean powersave) +{ + gboolean ret; + gchar *command; + GError *error; + + /* run script from pm-utils */ + command = g_strdup_printf ("pm-powersave %s", powersave ? "true" : "false"); + egg_debug ("excuting command: %s", command); + ret = g_spawn_command_line_async (command, &error); + if (!ret) { + egg_warning ("failed to run script: %s", error->message); + g_error_free (error); + } + + return ret; +} + /** * gpk_daemon_device_changed: **/ @@ -472,6 +496,9 @@ gpk_daemon_device_changed (DkpDaemon *daemon, DevkitDevice *d, gboolean synthesi daemon->priv->on_battery = ret; egg_debug ("now on_battery = %s", ret ? "yes" : "no"); g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0); + + /* set pm-utils power policy */ + dkp_daemon_set_pmutils_powersave (daemon, daemon->priv->on_battery); } ret = dkp_daemon_get_low_battery_local (daemon); if (ret != daemon->priv->low_battery) { @@ -875,6 +902,9 @@ dkp_daemon_new (void) !dkp_daemon_get_on_ac_local (daemon)); daemon->priv->low_battery = dkp_daemon_get_low_battery_local (daemon); + /* set pm-utils power policy */ + dkp_daemon_set_pmutils_powersave (daemon, daemon->priv->on_battery); + return daemon; } From b68b08a6cfee2161796598479def6814836cde8a Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 26 Jun 2009 14:43:29 +0100 Subject: [PATCH 2/7] Correct a few function names --- src/dkp-daemon.c | 56 ++++++++++++++++++++++++------------------------ src/dkp-polkit.c | 6 +++--- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c index 847d84d..962d23f 100644 --- a/src/dkp-daemon.c +++ b/src/dkp-daemon.c @@ -360,8 +360,8 @@ dkp_daemon_finalize (GObject *object) G_OBJECT_CLASS (dkp_daemon_parent_class)->finalize (object); } -static gboolean gpk_daemon_device_add (DkpDaemon *daemon, DevkitDevice *d, gboolean emit_event); -static void gpk_daemon_device_remove (DkpDaemon *daemon, DevkitDevice *d); +static gboolean dkp_daemon_device_add (DkpDaemon *daemon, DevkitDevice *d, gboolean emit_event); +static void dkp_daemon_device_remove (DkpDaemon *daemon, DevkitDevice *d); /** * dkp_daemon_get_on_battery_local: @@ -472,10 +472,10 @@ dkp_daemon_set_pmutils_powersave (DkpDaemon *daemon, gboolean powersave) } /** - * gpk_daemon_device_changed: + * dkp_daemon_device_changed: **/ static void -gpk_daemon_device_changed (DkpDaemon *daemon, DevkitDevice *d, gboolean synthesized) +dkp_daemon_device_changed (DkpDaemon *daemon, DevkitDevice *d, gboolean synthesized) { DkpDevice *device; gboolean ret; @@ -487,7 +487,7 @@ gpk_daemon_device_changed (DkpDaemon *daemon, DevkitDevice *d, gboolean synthesi dkp_device_changed (device, d, synthesized); } else { egg_debug ("treating change event as add on %s", dkp_device_get_object_path (device)); - gpk_daemon_device_add (daemon, d, TRUE); + dkp_daemon_device_add (daemon, d, TRUE); } /* second, check if the on_battery and low_battery state has changed */ @@ -509,10 +509,10 @@ gpk_daemon_device_changed (DkpDaemon *daemon, DevkitDevice *d, gboolean synthesi } /** - * gpk_daemon_device_went_away: + * dkp_daemon_device_went_away: **/ static void -gpk_daemon_device_went_away (gpointer user_data, GObject *_device) +dkp_daemon_device_went_away (gpointer user_data, GObject *_device) { DkpDaemon *daemon = DKP_DAEMON (user_data); DkpDevice *device = DKP_DEVICE (_device); @@ -520,10 +520,10 @@ gpk_daemon_device_went_away (gpointer user_data, GObject *_device) } /** - * gpk_daemon_device_get: + * dkp_daemon_device_get: **/ static DkpDevice * -gpk_daemon_device_get (DkpDaemon *daemon, DevkitDevice *d) +dkp_daemon_device_get (DkpDaemon *daemon, DevkitDevice *d) { const gchar *subsys; const gchar *native_path; @@ -600,10 +600,10 @@ out: } /** - * gpk_daemon_device_add: + * dkp_daemon_device_add: **/ static gboolean -gpk_daemon_device_add (DkpDaemon *daemon, DevkitDevice *d, gboolean emit_event) +dkp_daemon_device_add (DkpDaemon *daemon, DevkitDevice *d, gboolean emit_event) { DkpDevice *device; gboolean ret = TRUE; @@ -613,11 +613,11 @@ gpk_daemon_device_add (DkpDaemon *daemon, DevkitDevice *d, gboolean emit_event) if (device != NULL) { /* 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)); - gpk_daemon_device_changed (daemon, d, FALSE); + dkp_daemon_device_changed (daemon, d, FALSE); } else { /* get the right sort of device */ - device = gpk_daemon_device_get (daemon, d); + device = dkp_daemon_device_get (daemon, d); if (device == NULL) { egg_debug ("not adding device %s", devkit_device_get_native_path (d)); ret = FALSE; @@ -626,7 +626,7 @@ gpk_daemon_device_add (DkpDaemon *daemon, DevkitDevice *d, gboolean emit_event) /* 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), gpk_daemon_device_went_away, daemon); + g_object_weak_ref (G_OBJECT (device), dkp_daemon_device_went_away, daemon); dkp_device_list_insert (daemon->priv->list, d, device); if (emit_event) { g_signal_emit (daemon, signals[DEVICE_ADDED_SIGNAL], 0, @@ -638,10 +638,10 @@ out: } /** - * gpk_daemon_device_remove: + * dkp_daemon_device_remove: **/ static void -gpk_daemon_device_remove (DkpDaemon *daemon, DevkitDevice *d) +dkp_daemon_device_remove (DkpDaemon *daemon, DevkitDevice *d) { DkpDevice *device; @@ -658,23 +658,23 @@ gpk_daemon_device_remove (DkpDaemon *daemon, DevkitDevice *d) } /** - * gpk_daemon_device_event_signal_handler: + * dkp_daemon_device_event_signal_handler: **/ static void -gpk_daemon_device_event_signal_handler (DevkitClient *client, const char *action, +dkp_daemon_device_event_signal_handler (DevkitClient *client, const char *action, DevkitDevice *device, gpointer user_data) { DkpDaemon *daemon = DKP_DAEMON (user_data); if (g_strcmp0 (action, "add") == 0) { egg_debug ("add %s", devkit_device_get_native_path (device)); - gpk_daemon_device_add (daemon, device, TRUE); + dkp_daemon_device_add (daemon, device, TRUE); } else if (g_strcmp0 (action, "remove") == 0) { egg_debug ("remove %s", devkit_device_get_native_path (device)); - gpk_daemon_device_remove (daemon, device); + dkp_daemon_device_remove (daemon, device); } else if (g_strcmp0 (action, "change") == 0) { egg_debug ("change %s", devkit_device_get_native_path (device)); - gpk_daemon_device_changed (daemon, device, FALSE); + dkp_daemon_device_changed (daemon, device, FALSE); } else { egg_warning ("unhandled action '%s' on %s", action, devkit_device_get_native_path (device)); } @@ -682,10 +682,10 @@ gpk_daemon_device_event_signal_handler (DevkitClient *client, const char *action #if 0 /** - * gpk_daemon_throw_error: + * dkp_daemon_throw_error: **/ static gboolean -gpk_daemon_throw_error (DBusGMethodInvocation *context, int error_code, const char *format, ...) +dkp_daemon_throw_error (DBusGMethodInvocation *context, int error_code, const char *format, ...) { GError *error; va_list args; @@ -810,10 +810,10 @@ out: } /** - * gpk_daemon_register_power_daemon: + * dkp_daemon_register_power_daemon: **/ static gboolean -gpk_daemon_register_power_daemon (DkpDaemon *daemon) +dkp_daemon_register_power_daemon (DkpDaemon *daemon) { DBusConnection *connection; DBusError dbus_error; @@ -857,7 +857,7 @@ gpk_daemon_register_power_daemon (DkpDaemon *daemon) goto error; } g_signal_connect (daemon->priv->devkit_client, "device-event", - G_CALLBACK (gpk_daemon_device_event_signal_handler), daemon); + G_CALLBACK (dkp_daemon_device_event_signal_handler), daemon); return TRUE; error: @@ -878,7 +878,7 @@ dkp_daemon_new (void) daemon = DKP_DAEMON (g_object_new (DKP_TYPE_DAEMON, NULL)); daemon->priv->list = dkp_device_list_new (); - if (!gpk_daemon_register_power_daemon (DKP_DAEMON (daemon))) { + if (!dkp_daemon_register_power_daemon (DKP_DAEMON (daemon))) { g_object_unref (daemon); return NULL; } @@ -893,7 +893,7 @@ dkp_daemon_new (void) for (l = devices; l != NULL; l = l->next) { DevkitDevice *device = l->data; - gpk_daemon_device_add (daemon, device, FALSE); + dkp_daemon_device_add (daemon, device, FALSE); } g_list_foreach (devices, (GFunc) g_object_unref, NULL); g_list_free (devices); diff --git a/src/dkp-polkit.c b/src/dkp-polkit.c index 101b84a..0eb95d9 100644 --- a/src/dkp-polkit.c +++ b/src/dkp-polkit.c @@ -92,10 +92,10 @@ pk_polkit_io_remove_watch (PolKitContext *context, int watch_id) } /** - * gpk_polkit_dbus_filter: + * dkp_polkit_dbus_filter: **/ static DBusHandlerResult -gpk_polkit_dbus_filter (DBusConnection *connection, DBusMessage *message, void *user_data) +dkp_polkit_dbus_filter (DBusConnection *connection, DBusMessage *message, void *user_data) { DkpPolkit *polkit = DKP_POLKIT (user_data); const gchar *interface; @@ -274,7 +274,7 @@ dkp_polkit_init (DkpPolkit *polkit) goto out; } - if (!dbus_connection_add_filter (connection, gpk_polkit_dbus_filter, polkit, NULL)) { + if (!dbus_connection_add_filter (connection, dkp_polkit_dbus_filter, polkit, NULL)) { egg_warning ("Cannot add D-Bus filter: %s: %s", dbus_error.name, dbus_error.message); goto out; } From 3894b36273c597bc54a86f6a7ee43eab07ba8fba Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 26 Jun 2009 15:02:15 +0100 Subject: [PATCH 3/7] Don't show empty vendor, model or serials in the debug outputs --- devkit-power-gobject/dkp-device.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devkit-power-gobject/dkp-device.c b/devkit-power-gobject/dkp-device.c index 4426813..0ca881c 100644 --- a/devkit-power-gobject/dkp-device.c +++ b/devkit-power-gobject/dkp-device.c @@ -382,11 +382,11 @@ dkp_device_print (const DkpDevice *device) strftime (time_buf, sizeof time_buf, "%c", time_tm); g_print (" native-path: %s\n", device->priv->native_path); - if (device->priv->vendor != NULL) + if (device->priv->vendor != NULL && device->priv->vendor[0] != '\0') g_print (" vendor: %s\n", device->priv->vendor); - if (device->priv->model != NULL) + if (device->priv->model != NULL && device->priv->model[0] != '\0') g_print (" model: %s\n", device->priv->model); - if (device->priv->serial != NULL) + if (device->priv->serial != NULL && device->priv->serial[0] != '\0') g_print (" serial: %s\n", device->priv->serial); g_print (" power supply: %s\n", dkp_device_print_bool_to_text (device->priv->power_supply)); g_print (" updated: %s (%d seconds ago)\n", time_buf, (int) (time (NULL) - device->priv->update_time)); From e66bc06cfda0e183f77f40f39fb03e6782023511 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 26 Jun 2009 15:02:56 +0100 Subject: [PATCH 4/7] Fix a small memory leak on supply coldplugging --- src/dkp-device-supply.c | 45 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/dkp-device-supply.c b/src/dkp-device-supply.c index b11d82c..8f6e5cb 100644 --- a/src/dkp-device-supply.c +++ b/src/dkp-device-supply.c @@ -274,6 +274,31 @@ dkp_device_supply_convert_device_technology (const gchar *type) return DKP_DEVICE_TECHNOLOGY_UNKNOWN; } +/** + * dkp_device_supply_get_string: + **/ +static gchar * +dkp_device_supply_get_string (const gchar *native_path, const gchar *key) +{ + gchar *value; + + /* get value, and strip to remove spaces */ + value = g_strstrip (sysfs_get_string (native_path, key)); + + /* no value */ + if (value == NULL) + goto out; + + /* empty value */ + if (value[0] == '\0') { + g_free (value); + value = NULL; + goto out; + } +out: + return value; +} + /** * dkp_device_supply_refresh_battery: * @@ -301,6 +326,9 @@ dkp_device_supply_refresh_battery (DkpDeviceSupply *supply) gdouble voltage; guint64 time_to_empty; guint64 time_to_full; + gchar *manufacturer; + gchar *model_name; + gchar *serial_number; d = dkp_device_get_d (device); if (d == NULL) { @@ -341,19 +369,28 @@ dkp_device_supply_refresh_battery (DkpDeviceSupply *supply) g_object_set (device, "power-supply", TRUE, NULL); /* the ACPI spec is bad at defining battery type constants */ - technology_native = g_strstrip (sysfs_get_string (native_path, "technology")); + technology_native = dkp_device_supply_get_string (native_path, "technology"); g_object_set (device, "technology", dkp_device_supply_convert_device_technology (technology_native), NULL); g_free (technology_native); + /* get values which may be blank */ + manufacturer = dkp_device_supply_get_string (native_path, "manufacturer"); + model_name = dkp_device_supply_get_string (native_path, "model_name"); + serial_number = dkp_device_supply_get_string (native_path, "serial_number"); + g_object_set (device, - "vendor", g_strstrip (sysfs_get_string (native_path, "manufacturer")), - "model", g_strstrip (sysfs_get_string (native_path, "model_name")), - "serial", g_strstrip (sysfs_get_string (native_path, "serial_number")), + "vendor", manufacturer, + "model", model_name, + "serial", serial_number, "is-rechargeable", TRUE, /* assume true for laptops */ "has-history", TRUE, "has-statistics", TRUE, NULL); + g_free (manufacturer); + g_free (model_name); + g_free (serial_number); + /* these don't change at runtime */ energy_full = sysfs_get_double (native_path, "energy_full") / 1000000.0; energy_full_design = sysfs_get_double (native_path, "energy_full_design") / 1000000.0; From e808a5063bd4819ca499dcf114371299da88c665 Mon Sep 17 00:00:00 2001 From: Roland Dreier Date: Sun, 28 Jun 2009 08:15:52 +0100 Subject: [PATCH 5/7] Fix two issues with the pm-powersave code Signed-off-by: Richard Hughes --- src/dkp-daemon.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c index 962d23f..fe2b4a4 100644 --- a/src/dkp-daemon.c +++ b/src/dkp-daemon.c @@ -457,7 +457,7 @@ dkp_daemon_set_pmutils_powersave (DkpDaemon *daemon, gboolean powersave) { gboolean ret; gchar *command; - GError *error; + GError *error = NULL; /* run script from pm-utils */ command = g_strdup_printf ("pm-powersave %s", powersave ? "true" : "false"); @@ -466,8 +466,10 @@ dkp_daemon_set_pmutils_powersave (DkpDaemon *daemon, gboolean powersave) if (!ret) { egg_warning ("failed to run script: %s", error->message); g_error_free (error); + goto out; } - +out: + g_free (command); return ret; } From 269fc33a3bb1f8144439cc4c98543510708ab251 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Sun, 28 Jun 2009 12:44:40 +0100 Subject: [PATCH 6/7] hardcode pm-powersave like we do pm-suspend and pm-hibernate --- src/dkp-daemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c index fe2b4a4..3efe2ae 100644 --- a/src/dkp-daemon.c +++ b/src/dkp-daemon.c @@ -460,7 +460,7 @@ dkp_daemon_set_pmutils_powersave (DkpDaemon *daemon, gboolean powersave) GError *error = NULL; /* run script from pm-utils */ - command = g_strdup_printf ("pm-powersave %s", powersave ? "true" : "false"); + command = g_strdup_printf ("/usr/sbin/pm-powersave %s", powersave ? "true" : "false"); egg_debug ("excuting command: %s", command); ret = g_spawn_command_line_async (command, &error); if (!ret) { From db98ba1cb69d29206e2a6c737de6b5f515350fde Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Wed, 1 Jul 2009 12:50:18 +0200 Subject: [PATCH 7/7] suppress lid change event on startup Suppress lid change event on startup. Otherwise, gnome-power-manager picks up a "lid is closed" change event when dk-p gets D-BUS activated, and thus immediately suspends the machine on startup. http://bugs.freedesktop.org/show_bug.cgi?id=22574 https://launchpad.net/bugs/385135 --- src/dkp-daemon.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c index 3efe2ae..77c204b 100644 --- a/src/dkp-daemon.c +++ b/src/dkp-daemon.c @@ -102,6 +102,7 @@ gboolean dkp_daemon_set_lid_is_closed (DkpDaemon *daemon, gboolean lid_is_closed) { gboolean ret = FALSE; + static gboolean initialized = FALSE; g_return_val_if_fail (DKP_IS_DAEMON (daemon), FALSE); @@ -112,7 +113,16 @@ dkp_daemon_set_lid_is_closed (DkpDaemon *daemon, gboolean lid_is_closed) } /* save */ - g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0); + if (!initialized) { + /* 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"); + initialized = TRUE; + } else { + g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0); + } daemon->priv->lid_is_closed = lid_is_closed; ret = TRUE; out: