[gnome-control-center/wip/power: 4/9] power: complete new design
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/wip/power: 4/9] power: complete new design
- Date: Sun, 2 Dec 2012 21:30:18 +0000 (UTC)
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: <a href="moo">Screen Settings</a> 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]