[gnome-settings-daemon] power: Show a modal dialog if any battery in the system has been recalled and may be dangerous
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] power: Show a modal dialog if any battery in the system has been recalled and may be dangerous
- Date: Wed, 13 Jul 2011 10:43:51 +0000 (UTC)
commit 52ef660a87e8c4d7b8053ae9db69009c13386669
Author: Richard Hughes <richard hughsie com>
Date: Tue Jul 5 10:43:20 2011 +0100
power: Show a modal dialog if any battery in the system has been recalled and may be dangerous
...settings-daemon.plugins.power.gschema.xml.in.in | 5 +
plugins/power/gsd-power-manager.c | 141 ++++++++++++++++++++
2 files changed, 146 insertions(+), 0 deletions(-)
---
diff --git a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in
index 52c1b0c..f2cc26e 100644
--- a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in
+++ b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in
@@ -141,5 +141,10 @@
<_summary>Whether to use time-based notifications</_summary>
<_description>If time based notifications should be used. If set to false, then the percentage change is used instead, which may fix a broken ACPI BIOS.</_description>
</key>
+ <key name="notify-perhaps-recall" type="b">
+ <default>true</default>
+ <_summary>If we should show the recalled battery warning for a broken battery</_summary>
+ <_description>If we should show the recalled battery warning for a broken battery. Set this to false only if you know your battery is okay.</_description>
+ </key>
</schema>
</schemalist>
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index 540c50d..32b09d9 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -69,6 +69,7 @@
#define GSD_POWER_MANAGER_NOTIFY_TIMEOUT_LONG 30 * 1000 /* ms */
#define GSD_POWER_MANAGER_CRITICAL_ALERT_TIMEOUT 5 /* seconds */
+#define GSD_POWER_MANAGER_RECALL_DELAY 30 /* seconds */
static const gchar introspection_xml[] =
"<node>"
@@ -814,9 +815,144 @@ out:
return device;
}
+typedef struct {
+ GsdPowerManager *manager;
+ UpDevice *device;
+} GsdPowerManagerRecallData;
+
+static void
+device_perhaps_recall_response_cb (GtkDialog *dialog,
+ gint response_id,
+ GsdPowerManagerRecallData *recall_data)
+{
+ GdkScreen *screen;
+ GtkWidget *dialog_error;
+ GError *error = NULL;
+ gboolean ret;
+ gchar *website = NULL;
+
+ /* don't show this again */
+ if (response_id == GTK_RESPONSE_CANCEL) {
+ g_settings_set_boolean (recall_data->manager->priv->settings,
+ "notify-perhaps-recall",
+ FALSE);
+ goto out;
+ }
+
+ /* visit recall website */
+ if (response_id == GTK_RESPONSE_OK) {
+
+ g_object_get (recall_data->device,
+ "recall-url", &website,
+ NULL);
+
+ screen = gdk_screen_get_default();
+ ret = gtk_show_uri (screen,
+ website,
+ gtk_get_current_event_time (),
+ &error);
+ if (!ret) {
+ dialog_error = gtk_message_dialog_new (NULL,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_OK,
+ "Failed to show url %s",
+ error->message);
+ gtk_dialog_run (GTK_DIALOG (dialog_error));
+ g_error_free (error);
+ }
+ }
+out:
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ g_object_unref (recall_data->device);
+ g_object_unref (recall_data->manager);
+ g_free (recall_data);
+ g_free (website);
+ return;
+}
+
+static gboolean
+device_perhaps_recall_delay_cb (gpointer user_data)
+{
+ gchar *vendor;
+ const gchar *title = NULL;
+ GString *message = NULL;
+ GtkWidget *dialog;
+ GsdPowerManagerRecallData *recall_data = (GsdPowerManagerRecallData *) user_data;
+
+ g_object_get (recall_data->device,
+ "recall-vendor", &vendor,
+ NULL);
+
+ /* TRANSLATORS: the battery may be recalled by it's vendor */
+ title = _("Battery may be recalled");
+ message = g_string_new (_("A battery in your computer may have been "
+ "recalled by %s and you may be at risk."));
+ g_string_append (message, "\n\n");
+ g_string_append (message, _("For more information visit the battery recall website."));
+ dialog = gtk_message_dialog_new_with_markup (NULL,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_CLOSE,
+ "<span size='larger'><b>%s</b></span>",
+ title);
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
+ "%s", message->str);
+
+ /* TRANSLATORS: button text, visit the manufacturers recall website */
+ gtk_dialog_add_button (GTK_DIALOG (dialog), _("Visit recall website"),
+ GTK_RESPONSE_OK);
+
+ /* TRANSLATORS: button text, do not show this bubble again */
+ gtk_dialog_add_button (GTK_DIALOG (dialog), _("Do not show me this again"),
+ GTK_RESPONSE_CANCEL);
+
+ gtk_widget_show (dialog);
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (device_perhaps_recall_response_cb),
+ recall_data);
+
+ g_string_free (message, TRUE);
+ g_free (vendor);
+ return FALSE;
+}
+
+static void
+device_perhaps_recall (GsdPowerManager *manager, UpDevice *device)
+{
+ gboolean ret;
+ guint timer_id;
+ GsdPowerManagerRecallData *recall_data;
+
+ /* don't show when running under GDM */
+ if (g_getenv ("RUNNING_UNDER_GDM") != NULL) {
+ g_debug ("running under gdm, so no notification");
+ return;
+ }
+
+ /* already shown, and dismissed */
+ ret = g_settings_get_boolean (manager->priv->settings,
+ "notify-perhaps-recall");
+ if (!ret) {
+ g_debug ("settings prevents recall notification");
+ return;
+ }
+
+ recall_data = g_new0 (GsdPowerManagerRecallData, 1);
+ recall_data->manager = g_object_ref (manager);
+ recall_data->device = g_object_ref (device);
+
+ /* delay by a few seconds so the session can load */
+ timer_id = g_timeout_add_seconds (GSD_POWER_MANAGER_RECALL_DELAY,
+ device_perhaps_recall_delay_cb,
+ recall_data);
+ g_source_set_name_by_id (timer_id, "[GsdPowerManager] perhaps-recall");
+}
+
static void
engine_device_add (GsdPowerManager *manager, UpDevice *device)
{
+ gboolean recall_notice;
GsdPowerManagerWarning warning;
UpDeviceState state;
UpDeviceKind kind;
@@ -832,6 +968,7 @@ engine_device_add (GsdPowerManager *manager, UpDevice *device)
g_object_get (device,
"kind", &kind,
"state", &state,
+ "recall-notice", &recall_notice,
NULL);
/* add old state for transitions */
@@ -855,6 +992,10 @@ engine_device_add (GsdPowerManager *manager, UpDevice *device)
"engine-state-old",
GUINT_TO_POINTER(state));
}
+
+ /* the device is recalled */
+ if (recall_notice)
+ device_perhaps_recall (manager, device);
}
static gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]