[gnome-control-center/wip/power: 4/9] power: complete new design



commit c25892a5f0fe83d2f59fa7294630c47a3a90c5f2
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Dec 1 23:30:39 2012 -0500

    power: complete new design
    
    Mostly done; whats missing is handling of secondary batteries
    and the wifi/bluetooth power saving.

 panels/power/cc-power-panel.c |  825 ++++++++++++++++++++++-------------------
 panels/power/power.ui         |  335 ++++++-----------
 2 files changed, 561 insertions(+), 599 deletions(-)
---
diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
index 2849930..cab6b25 100644
--- a/panels/power/cc-power-panel.c
+++ b/panels/power/cc-power-panel.c
@@ -38,18 +38,27 @@ CC_PANEL_REGISTER (CcPowerPanel, cc_power_panel)
 
 struct _CcPowerPanelPrivate
 {
-  GSettings     *lock_settings;
   GSettings     *gsd_settings;
   GCancellable  *cancellable;
   GtkBuilder    *builder;
   GDBusProxy    *proxy;
   UpClient      *up_client;
-  GtkWidget     *levelbar_primary;
   GDBusProxy    *screen_proxy;
-  GSettings     *session_settings;
-  GtkWidget     *screen_power_saving;
+  gboolean       has_batteries;
+
+  GtkWidget     *battery_section;
+  GtkWidget     *battery_list;
+  GtkSizeGroup  *battery_sizegroup;
+  GtkSizeGroup  *charge_sizegroup;
+
+  GtkWidget     *brightness_row;
   GtkWidget     *brightness_scale;
   gboolean       setting_brightness;
+
+  GtkWidget     *automatic_suspend_row;
+  GtkWidget     *automatic_suspend_label;
+  GtkWidget     *critical_battery_row;
+  GtkWidget     *critical_battery_combo;
 };
 
 enum
@@ -60,32 +69,6 @@ enum
 };
 
 static void
-cc_power_panel_get_property (GObject    *object,
-                              guint       property_id,
-                              GValue     *value,
-                              GParamSpec *pspec)
-{
-  switch (property_id)
-    {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    }
-}
-
-static void
-cc_power_panel_set_property (GObject      *object,
-                              guint         property_id,
-                              const GValue *value,
-                              GParamSpec   *pspec)
-{
-  switch (property_id)
-    {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    }
-}
-
-static void
 cc_power_panel_dispose (GObject *object)
 {
   CcPowerPanelPrivate *priv = CC_POWER_PANEL (object)->priv;
@@ -95,11 +78,6 @@ cc_power_panel_dispose (GObject *object)
       g_object_unref (priv->gsd_settings);
       priv->gsd_settings = NULL;
     }
-  if (priv->session_settings)
-    {
-      g_object_unref (priv->session_settings);
-      priv->session_settings = NULL;
-    }
   if (priv->cancellable != NULL)
     {
       g_cancellable_cancel (priv->cancellable);
@@ -130,13 +108,6 @@ cc_power_panel_dispose (GObject *object)
   G_OBJECT_CLASS (cc_power_panel_parent_class)->dispose (object);
 }
 
-static void
-on_lock_settings_changed (GSettings     *settings,
-                          const char    *key,
-                          CcPowerPanel *panel)
-{
-}
-
 static const char *
 cc_power_panel_get_help_uri (CcPanel *panel)
 {
@@ -151,8 +122,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
 
   g_type_class_add_private (klass, sizeof (CcPowerPanelPrivate));
 
-  object_class->get_property = cc_power_panel_get_property;
-  object_class->set_property = cc_power_panel_set_property;
   object_class->dispose = cc_power_panel_dispose;
 
   panel_class->get_help_uri = cc_power_panel_get_help_uri;
@@ -203,13 +172,65 @@ get_timestring (guint64 time_secs)
 }
 
 static void
-set_device_battery_primary (CcPowerPanel *panel, GVariant *device)
+add_primary (CcPowerPanel *panel,
+             const gchar  *name,
+             const gchar  *details,
+             gdouble       percentage)
 {
   CcPowerPanelPrivate *priv = panel->priv;
+  GtkWidget *box;
+  GtkWidget *box2;
+  GtkWidget *label;
+  GtkWidget *levelbar;
+  gchar *s;
+
+  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  gtk_size_group_add_widget (priv->battery_sizegroup, box2);
+  gtk_widget_set_margin_left (box2, 12);
+  gtk_widget_set_margin_right (box2, 50);
+  gtk_widget_set_margin_top (box2, 6);
+  gtk_widget_set_margin_bottom (box2, 6);
+  gtk_box_pack_start (GTK_BOX (box), box2, FALSE, TRUE, 0);
+
+  label = gtk_label_new (name);
+  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+  gtk_box_pack_start (GTK_BOX (box2), label, TRUE, TRUE, 0);
+
+  label = gtk_label_new (details);
+  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+  gtk_style_context_add_class (gtk_widget_get_style_context (label), GTK_STYLE_CLASS_DIM_LABEL);
+  gtk_box_pack_start (GTK_BOX (box2), label, TRUE, TRUE, 0);
+
+  s = g_strdup_printf ("%d%%", (int)percentage);
+  label = gtk_label_new (s);
+  g_free (s);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  gtk_style_context_add_class (gtk_widget_get_style_context (label), GTK_STYLE_CLASS_DIM_LABEL);
+  gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+  gtk_size_group_add_widget (priv->charge_sizegroup, label);
+
+  levelbar = gtk_level_bar_new ();
+  gtk_level_bar_set_value (GTK_LEVEL_BAR (levelbar), percentage / 100.0);
+  gtk_widget_set_margin_left (levelbar, 0);
+  gtk_widget_set_margin_right (levelbar, 12);
+  gtk_widget_set_hexpand (levelbar, TRUE);
+  gtk_widget_set_halign (levelbar, GTK_ALIGN_FILL);
+  gtk_widget_set_valign (levelbar, GTK_ALIGN_CENTER);
+  gtk_box_pack_start (GTK_BOX (box), levelbar, TRUE, TRUE, 0);
+
+  gtk_container_add (GTK_CONTAINER (priv->battery_list), box);
+  gtk_widget_show_all (box);
+
+  g_object_set_data (G_OBJECT (box), "primary", GINT_TO_POINTER (TRUE));
+}
+
+static void
+set_device_battery_primary (CcPowerPanel *panel, GVariant *device)
+{
   gchar *details = NULL;
   gchar *time_string = NULL;
   gdouble percentage;
-  GtkWidget *widget;
   guint64 time;
   UpDeviceState state;
 
@@ -223,15 +244,6 @@ set_device_battery_primary (CcPowerPanel *panel, GVariant *device)
                  &state,
                  &time);
 
-  /* set the percentage */
-  gtk_level_bar_set_value (GTK_LEVEL_BAR (priv->levelbar_primary),
-                           percentage / 100.0f);
-
-  /* clear the warning */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "image_primary_warning"));
-  gtk_widget_hide (widget);
-
   /* set the description */
   if (time > 0)
     {
@@ -241,29 +253,23 @@ set_device_battery_primary (CcPowerPanel *panel, GVariant *device)
           case UP_DEVICE_STATE_CHARGING:
           case UP_DEVICE_STATE_PENDING_CHARGE:
             /* TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" */
-            details = g_strdup_printf(_("Charging - %s until fully charged"),
-                                      time_string);
+            details = g_strdup_printf (_("%s until fully charged"), time_string);
             break;
           case UP_DEVICE_STATE_DISCHARGING:
           case UP_DEVICE_STATE_PENDING_DISCHARGE:
             if (percentage < 20)
               {
                 /* TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" */
-                details = g_strdup_printf(_("Caution low battery, %s remaining"),
-                                          time_string);
-                /* show the warning */
-                gtk_widget_show (widget);
+                details = g_strdup_printf (_("Caution: %s remaining"), time_string);
               }
             else
               {
                 /* TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" */
-                details = g_strdup_printf(_("Using battery power - %s remaining"),
-                                          time_string);
+                details = g_strdup_printf (_("%s remaining"), time_string);
               }
             break;
           default:
-            details = g_strdup_printf ("error: %s",
-                                       up_device_state_to_string (state));
+            details = g_strdup_printf ("error: %s", up_device_state_to_string (state));
             break;
         }
     }
@@ -274,20 +280,20 @@ set_device_battery_primary (CcPowerPanel *panel, GVariant *device)
           case UP_DEVICE_STATE_CHARGING:
           case UP_DEVICE_STATE_PENDING_CHARGE:
             /* TRANSLATORS: primary battery */
-            details = g_strdup(_("Charging"));
+            details = g_strdup (_("Charging"));
             break;
           case UP_DEVICE_STATE_DISCHARGING:
           case UP_DEVICE_STATE_PENDING_DISCHARGE:
             /* TRANSLATORS: primary battery */
-            details = g_strdup(_("Using battery power"));
+            details = g_strdup (_("Using battery power"));
             break;
           case UP_DEVICE_STATE_FULLY_CHARGED:
             /* TRANSLATORS: primary battery */
-            details = g_strdup(_("Charging - fully charged"));
+            details = g_strdup (_("Charging - fully charged"));
             break;
           case UP_DEVICE_STATE_EMPTY:
             /* TRANSLATORS: primary battery */
-            details = g_strdup(_("Empty"));
+            details = g_strdup (_("Empty"));
             break;
           default:
             details = g_strdup_printf ("error: %s",
@@ -295,22 +301,9 @@ set_device_battery_primary (CcPowerPanel *panel, GVariant *device)
             break;
         }
     }
-  if (details == NULL)
-    goto out;
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "label_battery_primary"));
-  gtk_label_set_label (GTK_LABEL (widget), details);
 
-  /* show the primary device */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "box_primary"));
-  gtk_widget_show (widget);
+  add_primary (panel, _("Battery"), details, percentage);
 
-  /* hide the addon device until we stumble upon the device */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "box_battery_addon"));
-  gtk_widget_hide (widget);
-out:
   g_free (time_string);
   g_free (details);
 }
@@ -318,11 +311,9 @@ out:
 static void
 set_device_ups_primary (CcPowerPanel *panel, GVariant *device)
 {
-  CcPowerPanelPrivate *priv = panel->priv;
   gchar *details = NULL;
   gchar *time_string = NULL;
   gdouble percentage;
-  GtkWidget *widget;
   guint64 time;
   UpDeviceState state;
 
@@ -336,15 +327,6 @@ set_device_ups_primary (CcPowerPanel *panel, GVariant *device)
                  &state,
                  &time);
 
-  /* set the percentage */
-  gtk_level_bar_set_value (GTK_LEVEL_BAR (priv->levelbar_primary),
-                           percentage / 100.0f);
-
-  /* always show the warning */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "image_primary_warning"));
-  gtk_widget_show (widget);
-
   /* set the description */
   if (time > 0)
     {
@@ -355,19 +337,16 @@ set_device_ups_primary (CcPowerPanel *panel, GVariant *device)
             if (percentage < 20)
               {
                 /* TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" */
-                details = g_strdup_printf(_("Caution low UPS, %s remaining"),
-                                          time_string);
+                details = g_strdup_printf (_("Caution: %s remaining"), time_string);
               }
             else
               {
                 /* TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" */
-                details = g_strdup_printf(_("Using UPS power - %s remaining"),
-                                          time_string);
+                details = g_strdup_printf (_("%s remaining"), time_string);
               }
             break;
           default:
-            details = g_strdup_printf ("error: %s",
-                                       up_device_state_to_string (state));
+            details = g_strdup_printf ("error: %s", up_device_state_to_string (state));
             break;
         }
     }
@@ -379,12 +358,12 @@ set_device_ups_primary (CcPowerPanel *panel, GVariant *device)
             if (percentage < 20)
               {
                 /* TRANSLATORS: UPS battery */
-                details = g_strdup(_("Caution low UPS"));
+                details = g_strdup (_("Caution low UPS"));
               }
             else
               {
                 /* TRANSLATORS: UPS battery */
-                details = g_strdup(_("Using UPS power"));
+                details = g_strdup (_("Using UPS power"));
               }
             break;
           default:
@@ -393,22 +372,9 @@ set_device_ups_primary (CcPowerPanel *panel, GVariant *device)
             break;
         }
     }
-  if (details == NULL)
-    goto out;
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "label_battery_primary"));
-  gtk_label_set_label (GTK_LABEL (widget), details);
 
-  /* show the primary device */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "box_primary"));
-  gtk_widget_show (widget);
+  add_primary (panel, _("Uninterruptible power supply"), details, percentage);
 
-  /* hide the addon device as extra UPS devices are not possible */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "box_battery_addon"));
-  gtk_widget_hide (widget);
-out:
   g_free (time_string);
   g_free (details);
 }
@@ -461,20 +427,18 @@ out:
 
 static void
 add_device_secondary (CcPowerPanel *panel,
-                      GVariant *device,
-                      guint *secondary_devices_cnt)
+                      GVariant *device)
 {
   CcPowerPanelPrivate *priv = panel->priv;
-  const gchar *icon_name = NULL;
   gdouble percentage;
   guint64 time;
   UpDeviceKind kind;
   UpDeviceState state;
-  GtkWidget *vbox;
   GtkWidget *hbox;
   GtkWidget *widget;
   GString *status;
   GString *description;
+  gchar *s;
   gboolean show_caution = FALSE;
 
   g_variant_get (device,
@@ -488,39 +452,6 @@ add_device_secondary (CcPowerPanel *panel,
 
   switch (kind)
     {
-      case UP_DEVICE_KIND_UPS:
-        icon_name = "uninterruptible-power-supply";
-        show_caution = TRUE;
-        break;
-      case UP_DEVICE_KIND_MOUSE:
-        icon_name = "input-mouse";
-        break;
-      case UP_DEVICE_KIND_KEYBOARD:
-        icon_name = "input-keyboard";
-        break;
-      case UP_DEVICE_KIND_TABLET:
-        icon_name = "input-tablet";
-        break;
-      case UP_DEVICE_KIND_PDA:
-        icon_name = "pda";
-        break;
-      case UP_DEVICE_KIND_PHONE:
-        icon_name = "phone";
-        break;
-      case UP_DEVICE_KIND_MEDIA_PLAYER:
-        icon_name = "multimedia-player";
-        break;
-      case UP_DEVICE_KIND_COMPUTER:
-        icon_name = "computer";
-        show_caution = TRUE;
-        break;
-      default:
-        icon_name = "battery";
-        break;
-    }
-
-  switch (kind)
-    {
       case UP_DEVICE_KIND_MOUSE:
         /* TRANSLATORS: secondary battery */
         description = g_string_new (_("Wireless mouse"));
@@ -532,6 +463,7 @@ add_device_secondary (CcPowerPanel *panel,
       case UP_DEVICE_KIND_UPS:
         /* TRANSLATORS: secondary battery */
         description = g_string_new (_("Uninterruptible power supply"));
+        show_caution = TRUE;
         break;
       case UP_DEVICE_KIND_PDA:
         /* TRANSLATORS: secondary battery */
@@ -558,8 +490,6 @@ add_device_secondary (CcPowerPanel *panel,
         description = g_string_new (_("Battery"));
         break;
     }
-  g_string_prepend (description, "<b>");
-  g_string_append (description, "</b>");
 
   switch (state)
     {
@@ -602,43 +532,37 @@ add_device_secondary (CcPowerPanel *panel,
   g_string_append (status, "</small>");
 
   /* create the new widget */
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-  gtk_widget_set_hexpand (hbox, TRUE);
-  widget = gtk_image_new ();
-  gtk_misc_set_alignment (GTK_MISC (widget), 0.5f, 0.0f);
-  gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon_name, GTK_ICON_SIZE_DND);
-  gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
   widget = gtk_label_new ("");
   gtk_misc_set_alignment (GTK_MISC (widget), 0.0f, 0.5f);
   gtk_label_set_markup (GTK_LABEL (widget), description->str);
-  gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
-  widget = gtk_label_new ("");
-  gtk_misc_set_alignment (GTK_MISC (widget), 0.0f, 0.5f);
-  gtk_label_set_markup (GTK_LABEL (widget), status->str);
-  gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
-  widget = gtk_level_bar_new ();
-  gtk_widget_set_margin_right (widget, 32);
-  gtk_widget_set_margin_top (widget, 3);
-  gtk_level_bar_set_value (GTK_LEVEL_BAR (widget), percentage / 100.0f);
-  gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+  gtk_widget_set_margin_left (widget, 12);
+  gtk_widget_set_margin_right (widget, 50);
+  gtk_widget_set_margin_top (widget, 6);
+  gtk_widget_set_margin_bottom (widget, 6);
+  gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, TRUE, 0);
+  gtk_size_group_add_widget (priv->battery_sizegroup, widget);
 
-  /* add to the grid */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "grid_secondary"));
+  s = g_strdup_printf ("%d%%", (int)percentage);
+  widget = gtk_label_new (s);
+  g_free (s);
+  gtk_misc_set_alignment (GTK_MISC (widget), 1, 0.5);
+  gtk_style_context_add_class (gtk_widget_get_style_context (widget), GTK_STYLE_CLASS_DIM_LABEL);
+  gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, TRUE, 0);
+  gtk_size_group_add_widget (priv->charge_sizegroup, widget);
 
-  /* two devices wide */
-  gtk_grid_attach (GTK_GRID (widget), hbox,
-                   *secondary_devices_cnt % 2,
-                   (*secondary_devices_cnt / 2) - 1,
-                   1, 1);
-  (*secondary_devices_cnt)++;
+  widget = gtk_level_bar_new ();
+  gtk_widget_set_margin_left (widget, 0);
+  gtk_widget_set_margin_right (widget, 12);
+  gtk_widget_set_halign (widget, TRUE);
+  gtk_widget_set_halign (widget, GTK_ALIGN_FILL);
+  gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
+  gtk_level_bar_set_value (GTK_LEVEL_BAR (widget), percentage / 100.0f);
+  gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
+  gtk_widget_show_all (hbox);
 
-  /* show panel */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "box_secondary"));
-  gtk_widget_show_all (widget);
+  gtk_container_add (GTK_CONTAINER (priv->battery_list), hbox);
+  g_object_set_data (G_OBJECT (hbox), "kind", GINT_TO_POINTER (kind));
 
   g_string_free (description, TRUE);
   g_string_free (status, TRUE);
@@ -655,9 +579,7 @@ get_devices_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
   gsize n_devices;
   GList *children;
   GList *l;
-  GtkWidget *widget;
   guint i;
-  guint secondary_devices_cnt = 0;
   GVariant *child;
   GVariant *result;
   GVariant *untuple;
@@ -674,22 +596,12 @@ get_devices_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
   panel = CC_POWER_PANEL (user_data);
   priv = panel->priv;
 
-  /* empty the secondary box */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "grid_secondary"));
-  children = gtk_container_get_children (GTK_CONTAINER (widget));
+  /* remove all secondary batteries */
+  children = gtk_container_get_children (GTK_CONTAINER (priv->battery_list));
   for (l = children; l != NULL; l = l->next)
-    gtk_container_remove (GTK_CONTAINER (widget), l->data);
+    gtk_container_remove (GTK_CONTAINER (priv->battery_list), l->data);
   g_list_free (children);
 
-  /* hide both panels initially */
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "box_primary"));
-  gtk_widget_hide (widget);
-  widget = GTK_WIDGET (gtk_builder_get_object (priv->builder,
-                                               "box_secondary"));
-  gtk_widget_hide (widget);
-
   if (result == NULL)
     {
       g_printerr ("Error getting devices: %s\n", error->message);
@@ -756,13 +668,31 @@ get_devices_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
         }
       else
         {
-          add_device_secondary (panel, child, &secondary_devices_cnt);
+          add_device_secondary (panel, child);
         }
       g_variant_unref (child);
     }
 
+#if 1
+  g_print ("adding fake devices\n");
+  child = g_variant_new_parsed ("('/',%u,'',%d,%u,%t)",
+                                UP_DEVICE_KIND_MOUSE, 100.0,
+                                UP_DEVICE_STATE_DISCHARGING, 287);
+  add_device_secondary (panel, child);
+  g_variant_unref (child);
+  child = g_variant_new_parsed ("('/',%u,'',%d,%u,%t)",
+                                UP_DEVICE_KIND_KEYBOARD, 11.0,
+                                UP_DEVICE_STATE_DISCHARGING, 200);
+  add_device_secondary (panel, child);
+  g_variant_unref (child);
+#endif
+
   g_variant_unref (untuple);
   g_variant_unref (result);
+
+  children = gtk_container_get_children (GTK_CONTAINER (priv->battery_list));
+  gtk_widget_set_visible (priv->battery_section, children != NULL);
+  g_list_free (children);
 }
 
 static void
@@ -830,11 +760,11 @@ brightness_slider_value_changed_cb (GtkRange *range, gpointer user_data)
 static void
 get_brightness_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
+  CcPowerPanel *self = CC_POWER_PANEL (user_data);
   GError *error = NULL;
   GVariant *result;
   guint brightness;
   GtkRange *range;
-  CcPowerPanel *self = CC_POWER_PANEL (user_data);
 
   result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error);
   if (result == NULL)
@@ -846,7 +776,7 @@ get_brightness_cb (GObject *source_object, GAsyncResult *res, gpointer user_data
           return;
         }
 
-      gtk_widget_hide (self->priv->screen_power_saving);
+      gtk_widget_hide (self->priv->brightness_row);
 
       if (error->message &&
           strstr (error->message, "No backlight devices present") == NULL)
@@ -1074,7 +1004,7 @@ set_value_for_combo (GtkComboBox *combo_box, gint value)
   do
     {
       gtk_tree_model_get (model, &iter,
-                          1, &value_tmp,
+                          ACTION_MODEL_VALUE, &value_tmp,
                           -1);
       if (value == value_tmp)
         {
@@ -1094,7 +1024,6 @@ set_ac_battery_ui_mode (CcPowerPanel *self)
   guint i;
   UpDevice *device;
   UpDeviceKind kind;
-  CcPowerPanelPrivate *priv = self->priv;
 
   /* this is sync, but it's cached in the daemon and so quick */
   ret = up_client_enumerate_devices_sync (self->priv->up_client, NULL, &error);
@@ -1106,12 +1035,10 @@ set_ac_battery_ui_mode (CcPowerPanel *self)
     }
 
   devices = up_client_get_devices (self->priv->up_client);
-  for (i=0; i<devices->len; i++)
+  for (i = 0; i < devices->len; i++)
     {
       device = g_ptr_array_index (devices, i);
-      g_object_get (device,
-                    "kind", &kind,
-                    NULL);
+      g_object_get (device, "kind", &kind, NULL);
       if (kind == UP_DEVICE_KIND_BATTERY ||
           kind == UP_DEVICE_KIND_UPS)
         {
@@ -1120,27 +1047,26 @@ set_ac_battery_ui_mode (CcPowerPanel *self)
         }
     }
   g_ptr_array_unref (devices);
+
+#if 0
+  g_print ("forcing no batteries\n");
+  has_batteries = FALSE;
+#endif
+
 out:
-  gtk_widget_set_visible (WID (priv->builder, "label_header_battery"), has_batteries);
-  gtk_widget_set_visible (WID (priv->builder, "label_header_ac"), has_batteries);
-  gtk_widget_set_visible (WID (priv->builder, "combobox_sleep_battery"), has_batteries);
-  gtk_widget_set_visible (WID (priv->builder, "label_critical"), has_batteries);
-  gtk_widget_set_visible (WID (priv->builder, "combobox_critical"), has_batteries);
-}
+  self->priv->has_batteries = has_batteries;
 
-static gboolean
-activate_link_cb (GtkLabel *label, gchar *uri, CcPowerPanel *self)
-{
-  CcShell *shell;
-  GError *error = NULL;
+  gtk_widget_set_visible (self->priv->critical_battery_row, has_batteries);
 
-  shell = cc_panel_get_shell (CC_PANEL (self));
-  if (cc_shell_set_active_panel_from_id (shell, uri, NULL, &error) == FALSE)
+  if (!has_batteries)
     {
-      g_warning ("Failed to activate %s panel: %s", uri, error->message);
-      g_error_free (error);
+      gtk_widget_hide (WID (self->priv->builder, "suspend_on_battery_switch"));
+      gtk_widget_hide (WID (self->priv->builder, "suspend_on_battery_label"));
+      gtk_widget_hide (WID (self->priv->builder, "suspend_on_battery_delay_label"));
+      gtk_widget_hide (WID (self->priv->builder, "suspend_on_battery_delay_combo"));
+      gtk_label_set_label (GTK_LABEL (WID (self->priv->builder, "suspend_on_ac_label")),
+                           _("Suspend when _idle"));
     }
-  return TRUE;
 }
 
 static void
@@ -1149,6 +1075,9 @@ update_separator_func (GtkWidget **separator,
                        GtkWidget  *before,
                        gpointer    user_data)
 {
+  if (before == NULL)
+    return;
+
   if (*separator == NULL)
     {
       *separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
@@ -1157,114 +1086,213 @@ update_separator_func (GtkWidget **separator,
 }
 
 static void
-activate_child (CcPowerPanel *self,
-                GtkWidget    *child)
+add_power_saving_section (CcPowerPanel *self)
 {
-  GtkWidget *w;
-  GtkWidget *toplevel;
+  CcPowerPanelPrivate *priv = self->priv;
+  GtkWidget *vbox;
+  GtkWidget *widget, *box, *label, *scale;
+  GtkWidget *sw;
+  gchar *s;
 
-  if (child != self->priv->screen_power_saving)
-    return;
+  vbox = WID (priv->builder, "vbox_power");
+
+  s = g_strdup_printf ("<b>%s</b>", _("Power Saving"));
+  widget = gtk_label_new (s);
+  g_free (s);
+  gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
+  gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
+  gtk_widget_set_margin_left (widget, 50);
+  gtk_widget_set_margin_right (widget, 50);
+  gtk_widget_set_margin_top (widget, 24);
+  gtk_widget_set_margin_bottom (widget, 6);
+  gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, TRUE, 0);
+  gtk_widget_show (widget);
 
-  w = WID (self->priv->builder, "screen_power_saving_dialog");
+  widget = GTK_WIDGET (egg_list_box_new ());
+  egg_list_box_set_selection_mode (EGG_LIST_BOX (widget), GTK_SELECTION_NONE);
+  egg_list_box_set_separator_funcs (EGG_LIST_BOX (widget),
+                                    update_separator_func,
+                                    NULL, NULL);
 
-  toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-  gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (toplevel));
-  gtk_window_set_modal (GTK_WINDOW (w), TRUE);
-  gtk_window_present (GTK_WINDOW (w));
+  box = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (box),
+                                  GTK_POLICY_NEVER, GTK_POLICY_NEVER);
+  gtk_widget_set_margin_left (box, 50);
+  gtk_widget_set_margin_right (box, 50);
+  gtk_widget_show (box);
+  egg_list_box_add_to_scrolled (EGG_LIST_BOX (widget), GTK_SCROLLED_WINDOW (box));
+  gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
+
+  priv->brightness_row = box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  label = gtk_label_new (_("Screen _Brightness"));
+  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+  gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
+  gtk_widget_set_margin_left (label, 12);
+  gtk_widget_set_margin_right (label, 50);
+  gtk_widget_set_margin_top (label, 6);
+  gtk_widget_set_margin_bottom (label, 6);
+  gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+
+  scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
+  gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
+  gtk_widget_set_margin_left (scale, 12);
+  gtk_widget_set_margin_right (scale, 12);
+  gtk_box_pack_start (GTK_BOX (box), scale, TRUE, TRUE, 0);
+  priv->brightness_scale = scale;
+
+  gtk_container_add (GTK_CONTAINER (widget), box);
+
+  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  label = gtk_label_new (_("Screen Power _Saving"));
+  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+  gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
+  gtk_widget_set_margin_left (label, 12);
+  gtk_widget_set_margin_right (label, 12);
+  gtk_widget_set_margin_top (label, 6);
+  gtk_widget_set_margin_bottom (label, 6);
+  gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
+
+  /* FIXME: implement and use a screen-power-saving setting */
+  sw = gtk_switch_new ();
+  g_settings_bind (priv->gsd_settings, "idle-dim-battery",
+                   sw, "active",
+                   G_SETTINGS_BIND_DEFAULT);
+  gtk_widget_set_margin_left (sw, 12);
+  gtk_widget_set_margin_right (sw, 12);
+  gtk_box_pack_start (GTK_BOX (box), sw, FALSE, TRUE, 0);
+  gtk_label_set_mnemonic_widget (GTK_LABEL (label), sw);
+  gtk_container_add (GTK_CONTAINER (widget), box);
+
+  gtk_widget_show_all (widget);
 }
 
 static void
-set_idle_delay_from_dpms (CcPowerPanel *self,
-                          int           value)
+update_automatic_suspend_label (CcPowerPanel *self)
 {
-  guint off_delay;
-
-  off_delay = 0;
-
-  if (value > 0)
-    off_delay = (guint) value;
+  CcPowerPanelPrivate *priv = self->priv;
+  gint ac_action;
+  gint battery_action;
+  gint ac_timeout;
+  gint battery_timeout;
+  const gchar *s;
+
+  ac_action = g_settings_get_enum (priv->gsd_settings, "sleep-inactive-ac-type");
+  battery_action = g_settings_get_enum (priv->gsd_settings, "sleep-inactive-battery-type");
+  ac_timeout = g_settings_get_int (priv->gsd_settings, "sleep-inactive-ac-timeout");
+  battery_timeout = g_settings_get_int (priv->gsd_settings, "sleep-inactive-battery-timeout");
+
+  if (ac_action == 5)
+    ac_timeout = 0;
+  if (battery_action == 5)
+    battery_timeout = 0;
+
+  if (priv->has_batteries)
+    {
+      if (ac_timeout == 0 && battery_timeout == 0)
+        s = _("Off");
+      else if (ac_timeout == 0 && battery_timeout != 0)
+        s = _("When on Battery Power");
+      else if (ac_timeout != 0 && battery_timeout == 0)
+        s = _("When Plugged In");
+      else
+        s = _("On");
+    }
+  else
+    {
+      if (ac_timeout == 0)
+        s = _("Off");
+      else
+        s = _("On");
+    }
 
-  g_settings_set (self->priv->session_settings, "idle-delay", "u", off_delay);
+  gtk_label_set_label (GTK_LABEL (priv->automatic_suspend_label), s);
 }
 
 static void
-dpms_combo_changed_cb (GtkWidget *widget, CcPowerPanel *self)
+on_suspend_settings_changed (GSettings    *settings,
+                             const char   *key,
+                             CcPowerPanel *self)
 {
-  GtkTreeIter iter;
-  GtkTreeModel *model;
+  CcPowerPanelPrivate *priv = self->priv;
   gint value;
-  gboolean ret;
-
-  /* no selection */
-  ret = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
-  if (!ret)
-    return;
 
-  /* get entry */
-  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
-  gtk_tree_model_get (model, &iter,
-                      1, &value,
-                      -1);
+  if (g_strcmp0 (key, "critical-battery-action") == 0)
+    {
+      value = g_settings_get_enum (settings, "critical-battery-action");
+      set_value_for_combo (GTK_COMBO_BOX (priv->critical_battery_combo), value);
+    }
+  if (g_str_has_prefix (key, "sleep-inactive-"))
+    {
+      update_automatic_suspend_label (self);
+    }
+}
 
-  /* set both battery and ac keys */
-  g_settings_set_int (self->priv->gsd_settings, "sleep-display-ac", value);
-  g_settings_set_int (self->priv->gsd_settings, "sleep-display-battery", value);
+static void
+activate_child (CcPowerPanel *self,
+                GtkWidget    *child)
+{
+  CcPowerPanelPrivate *priv = self->priv;
+  GtkWidget *w;
+  GtkWidget *toplevel;
 
-  set_idle_delay_from_dpms (self, value);
+  if (child == priv->automatic_suspend_row)
+    {
+      w = WID (priv->builder, "automatic_suspend_dialog");
+      toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
+      gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (toplevel));
+      gtk_window_set_modal (GTK_WINDOW (w), TRUE);
+      gtk_window_present (GTK_WINDOW (w));
+    }
 }
 
-static void
-set_dpms_value_for_combo (GtkComboBox *combo_box, CcPowerPanel *self)
+static gboolean
+get_sleep_type (GValue   *value,
+                GVariant *variant,
+                gpointer  data)
 {
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  gint value;
-  gint value_tmp, value_prev;
-  gboolean ret;
-  guint i;
+  gboolean enabled;
 
-  /* get entry */
-  model = gtk_combo_box_get_model (combo_box);
-  ret = gtk_tree_model_get_iter_first (model, &iter);
-  if (!ret)
-    return;
+  if (g_strcmp0 (g_variant_get_string (variant, NULL), "nothing") == 0)
+    enabled = FALSE;
+  else
+    enabled = TRUE;
 
-  value_prev = 0;
-  i = 0;
+  g_value_set_boolean (value, enabled);
 
-  /* try to make the UI match the AC setting */
-  value = g_settings_get_int (self->priv->gsd_settings, "sleep-display-ac");
-  do
-    {
-      gtk_tree_model_get (model, &iter,
-                          1, &value_tmp,
-                          -1);
-      if (value == value_tmp ||
-          (value_tmp > value_prev && value < value_tmp))
-        {
-          gtk_combo_box_set_active_iter (combo_box, &iter);
-          return;
-        }
-      value_prev = value_tmp;
-      i++;
-    } while (gtk_tree_model_iter_next (model, &iter));
+  return TRUE;
+}
+
+static GVariant *
+set_sleep_type (const GValue       *value,
+                const GVariantType *expected_type,
+                gpointer            data)
+{
+  GVariant *res;
+
+  if (g_value_get_boolean (value))
+    res = g_variant_new_string ("suspend");
+  else
+    res = g_variant_new_string ("nothing");
 
-  /* If we didn't find the setting in the list */
-  gtk_combo_box_set_active (combo_box, i - 1);
+  return res;
 }
 
 static void
-add_power_saving_section (CcPowerPanel *self)
+add_automatic_suspend_section (CcPowerPanel *self)
 {
+  CcPowerPanelPrivate *priv = self->priv;
   GtkWidget *vbox;
-  GtkWidget *widget, *box, *label, *scale;
+  GtkWidget *widget, *box, *label;
   GtkWidget *sw;
   gchar *s;
+  gint value;
+  GtkTreeModel *model;
+  GtkWidget *dialog;
+  GtkWidget *combo;
 
-  vbox = WID (self->priv->builder, "vbox_power");
+  vbox = WID (priv->builder, "vbox_power");
 
-  s = g_strdup_printf ("<b>%s</b>", _("Power Saving"));
+  s = g_markup_printf_escaped ("<b>%s</b>", _("Suspend & Power Off"));
   widget = gtk_label_new (s);
   g_free (s);
   gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
@@ -1277,13 +1305,13 @@ add_power_saving_section (CcPowerPanel *self)
   gtk_widget_show (widget);
 
   widget = GTK_WIDGET (egg_list_box_new ());
+  egg_list_box_set_selection_mode (EGG_LIST_BOX (widget), GTK_SELECTION_NONE);
   egg_list_box_set_separator_funcs (EGG_LIST_BOX (widget),
                                     update_separator_func,
                                     NULL, NULL);
   g_signal_connect_swapped (widget, "child-activated",
                             G_CALLBACK (activate_child), self);
 
-
   box = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (box),
                                   GTK_POLICY_NEVER, GTK_POLICY_NEVER);
@@ -1293,47 +1321,143 @@ add_power_saving_section (CcPowerPanel *self)
   egg_list_box_add_to_scrolled (EGG_LIST_BOX (widget), GTK_SCROLLED_WINDOW (box));
   gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
 
-  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-  label = gtk_label_new (_("Screen _Brightness"));
+  self->priv->automatic_suspend_row = box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  label = gtk_label_new (_("_Automatic Suspend"));
   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
   gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
   gtk_widget_set_margin_left (label, 12);
   gtk_widget_set_margin_right (label, 50);
   gtk_widget_set_margin_top (label, 6);
   gtk_widget_set_margin_bottom (label, 6);
-  gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
-
-  scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
-  gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
-  gtk_widget_set_margin_left (scale, 12);
-  gtk_widget_set_margin_right (scale, 12);
-  gtk_box_pack_start (GTK_BOX (box), scale, TRUE, TRUE, 0);
-  self->priv->brightness_scale = scale;
+  gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
 
+  priv->automatic_suspend_label = sw = gtk_label_new ("");
+  gtk_label_set_mnemonic_widget (GTK_LABEL (label), sw);
+  gtk_misc_set_alignment (GTK_MISC (sw), 1, 0.5);
+  gtk_widget_set_margin_left (sw, 12);
+  gtk_widget_set_margin_right (sw, 12);
+  gtk_box_pack_start (GTK_BOX (box), sw, FALSE, TRUE, 0);
   gtk_container_add (GTK_CONTAINER (widget), box);
+  update_automatic_suspend_label (self);
 
-  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-  label = gtk_label_new (_("Screen Power _Saving"));
+  priv->critical_battery_row = box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  label = gtk_label_new (_("When Battery Power is _Critical"));
   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
   gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
   gtk_widget_set_margin_left (label, 12);
-  gtk_widget_set_margin_right (label, 12);
+  gtk_widget_set_margin_right (label, 50);
   gtk_widget_set_margin_top (label, 6);
   gtk_widget_set_margin_bottom (label, 6);
   gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
 
-  /* FIXME: implement and use a screen-power-saving setting */
-  sw = gtk_switch_new ();
-  g_settings_bind (self->priv->gsd_settings, "idle-dim-battery",
-                   sw, "active",
-                   G_SETTINGS_BIND_DEFAULT);
+  model = (GtkTreeModel*)gtk_builder_get_object (priv->builder, "liststore_critical");
+  priv->critical_battery_combo = sw = gtk_combo_box_new_with_model (model);
   gtk_widget_set_margin_left (sw, 12);
   gtk_widget_set_margin_right (sw, 12);
+
+  g_object_set_data (G_OBJECT (sw), "_gsettings_key", "critical-battery-action");
+  disable_unavailable_combo_items (self, GTK_COMBO_BOX (sw));
+  value = g_settings_get_enum (priv->gsd_settings, "critical-battery-action");
+  set_value_for_combo (GTK_COMBO_BOX (sw), value);
+  g_signal_connect (sw, "changed",
+                    G_CALLBACK (combo_enum_changed_cb), self);
+
   gtk_box_pack_start (GTK_BOX (box), sw, FALSE, TRUE, 0);
-  gtk_label_set_mnemonic_widget (GTK_LABEL (label), sw);
-  gtk_container_add (GTK_CONTAINER (widget), box);
 
+  g_signal_connect (priv->gsd_settings, "changed",
+                    G_CALLBACK (on_suspend_settings_changed), self);
+
+  gtk_container_add (GTK_CONTAINER (widget), box);
   gtk_widget_show_all (widget);
+
+  dialog = GTK_WIDGET (gtk_builder_get_object (priv->builder, "automatic_suspend_dialog"));
+  sw = GTK_WIDGET (gtk_builder_get_object (priv->builder, "automatic_suspend_close"));
+  g_signal_connect_swapped (sw, "clicked", G_CALLBACK (gtk_widget_hide), dialog);
+
+  sw = GTK_WIDGET (gtk_builder_get_object (priv->builder, "suspend_on_battery_switch"));
+  g_settings_bind_with_mapping (priv->gsd_settings, "sleep-inactive-battery-type",
+                                sw, "active",
+                                G_SETTINGS_BIND_DEFAULT,
+                                get_sleep_type, set_sleep_type, NULL, NULL);
+
+  combo = GTK_WIDGET (gtk_builder_get_object (priv->builder, "suspend_on_battery_delay_combo"));
+  g_object_set_data (G_OBJECT (combo), "_gsettings_key", "sleep-inactive-battery-timeout");
+  value = g_settings_get_int (priv->gsd_settings, "sleep-inactive-battery-timeout");
+  set_value_for_combo (GTK_COMBO_BOX (combo), value);
+  g_signal_connect (combo, "changed",
+                    G_CALLBACK (combo_time_changed_cb), self);
+  g_object_bind_property (sw, "active", combo, "sensitive",
+                          G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+
+  sw = GTK_WIDGET (gtk_builder_get_object (priv->builder, "suspend_on_ac_switch"));
+  g_settings_bind_with_mapping (priv->gsd_settings, "sleep-inactive-ac-type",
+                                sw, "active",
+                                G_SETTINGS_BIND_DEFAULT,
+                                get_sleep_type, set_sleep_type, NULL, NULL);
+
+  combo = GTK_WIDGET (gtk_builder_get_object (priv->builder, "suspend_on_ac_delay_combo"));
+  g_object_set_data (G_OBJECT (combo), "_gsettings_key", "sleep-inactive-ac-timeout");
+  value = g_settings_get_int (priv->gsd_settings, "sleep-inactive-ac-timeout");
+  set_value_for_combo (GTK_COMBO_BOX (combo), value);
+  g_signal_connect (combo, "changed",
+                    G_CALLBACK (combo_time_changed_cb), self);
+  g_object_bind_property (sw, "active", combo, "sensitive",
+                          G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+}
+
+static gint
+device_sort_func (gconstpointer a, gconstpointer b, gpointer data)
+{
+  GObject *row_a = (GObject*)a;
+  GObject *row_b = (GObject*)b;
+  gboolean a_primary;
+  gboolean b_primary;
+  gint a_kind;
+  gint b_kind;
+
+  a_primary = GPOINTER_TO_INT (g_object_get_data (row_a, "primary"));
+  b_primary = GPOINTER_TO_INT (g_object_get_data (row_b, "primary"));
+
+  if (a_primary)
+    return -1;
+  else if (b_primary)
+    return 1;
+
+  a_kind = GPOINTER_TO_INT (g_object_get_data (row_a, "kind"));
+  b_kind = GPOINTER_TO_INT (g_object_get_data (row_b, "kind"));
+
+  return a_kind - b_kind;
+}
+
+static void
+add_battery_section (CcPowerPanel *self)
+{
+  CcPowerPanelPrivate *priv = self->priv;
+  GtkWidget *vbox;
+  GtkWidget *widget, *box;
+
+  priv->battery_sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
+  priv->charge_sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+  vbox = WID (priv->builder, "vbox_power");
+
+  priv->battery_list = widget = GTK_WIDGET (egg_list_box_new ());
+  egg_list_box_set_selection_mode (EGG_LIST_BOX (widget), GTK_SELECTION_NONE);
+  egg_list_box_set_separator_funcs (EGG_LIST_BOX (widget),
+                                    update_separator_func,
+                                    NULL, NULL);
+  egg_list_box_set_sort_func (EGG_LIST_BOX (widget),
+                              device_sort_func, NULL, NULL);
+  gtk_widget_show (widget);
+
+  priv->battery_section = box = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (box),
+                                  GTK_POLICY_NEVER, GTK_POLICY_NEVER);
+  gtk_widget_set_margin_left (box, 50);
+  gtk_widget_set_margin_right (box, 50);
+  egg_list_box_add_to_scrolled (EGG_LIST_BOX (widget), GTK_SCROLLED_WINDOW (box));
+  gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
+  gtk_widget_show (box);
 }
 
 static void
@@ -1341,8 +1465,6 @@ cc_power_panel_init (CcPowerPanel *self)
 {
   GError     *error;
   GtkWidget  *widget;
-  gint        value;
-  char       *text;
 
   self->priv = POWER_PANEL_PRIVATE (self);
 
@@ -1360,9 +1482,6 @@ cc_power_panel_init (CcPowerPanel *self)
       return;
     }
 
-  /* add levelbar */
-  self->priv->levelbar_primary = GTK_WIDGET
-    (gtk_builder_get_object (self->priv->builder, "levelbar_primary"));
   self->priv->cancellable = g_cancellable_new ();
 
   /* get initial icon state */
@@ -1389,56 +1508,15 @@ cc_power_panel_init (CcPowerPanel *self)
   /* find out if there are any battery or UPS devices attached
    * and setup UI accordingly */
   self->priv->up_client = up_client_new ();
-  set_ac_battery_ui_mode (self);
 
   self->priv->gsd_settings = g_settings_new ("org.gnome.settings-daemon.plugins.power");
-  g_signal_connect (self->priv->gsd_settings, "changed",
-                    G_CALLBACK (on_lock_settings_changed), self);
-  self->priv->session_settings = g_settings_new ("org.gnome.desktop.session");
-
-  /* auto-sleep time */
-  value = g_settings_get_int (self->priv->gsd_settings, "sleep-inactive-ac-timeout");
-  widget = GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
-                                               "combobox_sleep_ac"));
-  set_value_for_combo (GTK_COMBO_BOX (widget), value);
-  g_object_set_data (G_OBJECT(widget), "_gsettings_key", "sleep-inactive-ac-timeout");
-  g_signal_connect (widget, "changed",
-                    G_CALLBACK (combo_time_changed_cb),
-                    self);
-  value = g_settings_get_int (self->priv->gsd_settings, "sleep-inactive-battery-timeout");
-  widget = GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
-                                               "combobox_sleep_battery"));
-  set_value_for_combo (GTK_COMBO_BOX (widget), value);
-  g_object_set_data (G_OBJECT(widget), "_gsettings_key", "sleep-inactive-battery-timeout");
-  g_signal_connect (widget, "changed",
-                    G_CALLBACK (combo_time_changed_cb),
-                    self);
-
-  /* actions */
-  value = g_settings_get_enum (self->priv->gsd_settings, "critical-battery-action");
-  widget = GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
-                                               "combobox_critical"));
-  disable_unavailable_combo_items (self, GTK_COMBO_BOX (widget));
-  set_value_for_combo (GTK_COMBO_BOX (widget), value);
-  g_object_set_data (G_OBJECT(widget), "_gsettings_key", "critical-battery-action");
-  g_signal_connect (widget, "changed",
-                    G_CALLBACK (combo_enum_changed_cb),
-                    self);
-
-  /* set screen link */
-  widget = GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
-                                               "label_screen_settings"));
-  /* TRANSLATORS: this is a link to the "Brightness and Lock" control center panel */
-  text = g_strdup_printf ("<span size=\"small\">%s</span>",
-                          _("Tip: <a href=\"screen\">screen brightness</a> affects how much power is used"));
-  gtk_label_set_markup (GTK_LABEL (widget), text);
-  g_free (text);
-
-  g_signal_connect (widget, "activate-link",
-                    G_CALLBACK (activate_link_cb),
-                    self);
 
+  add_battery_section (self);
   add_power_saving_section (self);
+  add_automatic_suspend_section (self);
+
+  set_ac_battery_ui_mode (self);
+  update_automatic_suspend_label (self);
 
   widget = WID (self->priv->builder, "vbox_power");
   gtk_widget_reparent (widget, (GtkWidget *) self);
@@ -1452,4 +1530,3 @@ cc_power_panel_register (GIOModule *module)
                                   CC_TYPE_POWER_PANEL,
                                   "power", 0);
 }
-
diff --git a/panels/power/power.ui b/panels/power/power.ui
index 3e7b269..4ac867b 100644
--- a/panels/power/power.ui
+++ b/panels/power/power.ui
@@ -47,10 +47,6 @@
         <col id="0" translatable="yes">1 hour</col>
         <col id="1">3600</col>
       </row>
-      <row>
-        <col id="0" translatable="yes">Don't suspend</col>
-        <col id="1">0</col>
-      </row>
     </data>
   </object>
   <object class="GtkWindow" id="window_power">
@@ -62,299 +58,188 @@
         <property name="can_focus">False</property>
         <property name="border_width">12</property>
         <property name="spacing">3</property>
-        <child>
-          <object class="GtkGrid" id="grid_combos">
-            <property name="visible">True</property>
+      </object>
+    </child>
+  </object>
+
+  <object class="GtkDialog" id="automatic_suspend_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Automatic Suspend</property>
+    <property name="type_hint">dialog</property>
+    <property name="resizable">False</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="asdf">
+        <property name="can_focus">False</property>
+        <property name="resize_mode">immediate</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
             <property name="can_focus">False</property>
-            <property name="margin_left">53</property>
-            <property name="margin_right">60</property>
-            <property name="margin_bottom">24</property>
-            <property name="orientation">vertical</property>
-            <property name="row_spacing">6</property>
-            <property name="column_spacing">12</property>
+            <property name="layout_style">end</property>
             <child>
-              <object class="GtkLabel" id="label_header_battery">
+              <object class="GtkButton" id="automatic_suspend_close">
+                <property name="label" translatable="yes">_Close</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes">On battery power</property>
-                <property name="halign">center</property>
-                <attributes>
-                  <attribute name="scale" value="0.82999999999999996"/>
-                </attributes>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
               </object>
               <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">0</property>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
               </packing>
             </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkGrid" id="grid1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="margin_left">12</property>
+            <property name="margin_right">6</property>
+            <property name="margin_top">12</property>
+            <property name="margin_bottom">12</property>
+            <property name="row_spacing">12</property>
+            <property name="column_spacing">6</property>
             <child>
-              <object class="GtkLabel" id="label_header_ac">
+              <object class="GtkSwitch" id="suspend_on_battery_switch">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes">When plugged in</property>
-                <property name="halign">center</property>
-                <attributes>
-                  <attribute name="scale" value="0.82999999999999996"/>
-                </attributes>
+                <property name="can_focus">True</property>
               </object>
               <packing>
-                <property name="left_attach">2</property>
+                <property name="left_attach">0</property>
                 <property name="top_attach">0</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label7">
+              <object class="GtkSwitch" id="suspend_on_ac_switch">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="halign">end</property>
-                <property name="label" translatable="yes">Suspend when inactive for</property>
+                <property name="can_focus">True</property>
               </object>
               <packing>
                 <property name="left_attach">0</property>
                 <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkComboBoxText" id="combobox_sleep_battery">
+              <object class="GtkLabel" id="suspend_on_battery_label">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="model">liststore_time</property>
-                <property name="hexpand">True</property>
-                <accessibility>
-                  <relation type="labelled-by" target="label_header_battery"/>
-                  <relation type="labelled-by" target="label7"/>
-                </accessibility>
+                <property name="label" translatable="yes">Suspend on _Battery Power</property>
+                <property name="use_underline">True</property>
+                <property name="mnemonic_widget">suspend_on_battery_switch</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
-                <property name="top_attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkComboBoxText" id="combobox_sleep_ac">
-                <property name="width_request">150</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="model">liststore_time</property>
-                <property name="hexpand">True</property>
-                <accessibility>
-                  <relation type="labelled-by" target="label_header_ac"/>
-                  <relation type="labelled-by" target="label7"/>
-                </accessibility>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="top_attach">1</property>
+                <property name="top_attach">0</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label_critical">
+              <object class="GtkLabel" id="suspend_on_ac_label">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="halign">end</property>
-                <property name="label" translatable="yes">When power is _critically low</property>
+                <property name="label" translatable="yes">Suspend when _Plugged In</property>
                 <property name="use_underline">True</property>
-                <property name="mnemonic_widget">combobox_critical</property>
-              </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkComboBox" id="combobox_critical">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="model">liststore_critical</property>
+                <property name="mnemonic_widget">suspend_on_ac_switch</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
-                <property name="top_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkBox" id="box_primary">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_left">53</property>
-            <property name="margin_right">60</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">3</property>
             <child>
-              <object class="GtkBox" id="box_primary_header">
+              <object class="GtkLabel" id="suspend_on_battery_delay_label">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="spacing">3</property>
-                <child>
-                  <object class="GtkImage" id="image_primary_warning">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="icon_name">dialog-warning-symbolic</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="label_battery_primary">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
-                    <property name="label">55 minutes until fully charged</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkBox" id="box_battery_addon">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="spacing">3</property>
-                    <child>
-                      <object class="GtkImage" id="image_battery_addon">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="xalign">1</property>
-                        <property name="stock">gtk-info</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkLabel" id="label_battery_addon">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="xalign">1</property>
-                        <property name="label">Your secondary battery is empty</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
+                <property name="label" translatable="yes">Delay</property>
+                <property name="margin-left">20</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
               </object>
               <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
+                <property name="left_attach">2</property>
+                <property name="top_attach">0</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLevelBar" id="levelbar_primary">
-                <property name="can_focus">False</property>
+              <object class="GtkLabel" id="suspend_on_ac_delay_label">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Delay</property>
+                <property name="margin-left">20</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
               </object>
               <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
+                <property name="left_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="label_screen_settings">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_left">53</property>
-            <property name="margin_right">40</property>
-            <property name="xalign">0</property>
-            <property name="yalign">0.49000000953674316</property>
-            <property name="ypad">4</property>
-            <property name="label">Tip: &lt;a href="moo"&gt;Screen Settings&lt;/a&gt; affect how much power is used</property>
-            <property name="use_markup">True</property>
-            <property name="track_visited_links">False</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkBox" id="box_secondary">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_top">15</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">24</property>
             <child>
-              <object class="GtkSeparator" id="separator_secondary">
+              <object class="GtkComboBoxText" id="suspend_on_battery_delay_combo">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <property name="entry_text_column">0</property>
+                <property name="model">liststore_time</property>
               </object>
               <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
+                <property name="left_attach">3</property>
+                <property name="top_attach">0</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
             <child>
-              <object class="GtkGrid" id="grid_secondary">
+              <object class="GtkComboBoxText" id="suspend_on_ac_delay_combo">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="margin_left">9</property>
-                <property name="margin_right">28</property>
-                <property name="margin_bottom">15</property>
-                <property name="row_spacing">18</property>
-                <property name="column_spacing">6</property>
-                <property name="column_homogeneous">True</property>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
+                <property name="entry_text_column">0</property>
+                <property name="model">liststore_time</property>
               </object>
               <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
+                <property name="left_attach">3</property>
+                <property name="top_attach">1</property>
+                <property name="width">1</property>
+                <property name="height">1</property>
               </packing>
             </child>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">3</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
           </packing>
         </child>
       </object>
     </child>
-  </object>
-  <object class="GtkSizeGroup" id="sizegroup_combos">
-    <widgets>
-      <widget name="combobox_critical"/>
-      <widget name="combobox_sleep_battery"/>
-      <widget name="combobox_sleep_ac"/>
-    </widgets>
+    <action-widgets>
+      <action-widget response="0">automatic_suspend_close</action-widget>
+    </action-widgets>
   </object>
 </interface>
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]