summaryrefslogtreecommitdiff
path: root/power-profiles-backport.patch
diff options
context:
space:
mode:
Diffstat (limited to 'power-profiles-backport.patch')
-rw-r--r--power-profiles-backport.patch5102
1 files changed, 5102 insertions, 0 deletions
diff --git a/power-profiles-backport.patch b/power-profiles-backport.patch
new file mode 100644
index 0000000..641beff
--- /dev/null
+++ b/power-profiles-backport.patch
@@ -0,0 +1,5102 @@
+From 1e3569e2f6c2c418b84ea3aa6ce5f84166ec48a7 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Wed, 31 Mar 2021 11:06:44 +0200
+Subject: [PATCH 01/33] power: Fix possible assertion on startup
+
+When opening the Power panel, and if power-profiles-daemon isn't already
+started, we'll be autostarting it, making it send signals about all the
+changed properties, including "PerformanceInhibited" even if we
+don't have a Performance row.
+
+Ignore the property change if we don't have a row for it rather than
+asserting.
+
+ #0 0x00007f73916bc292 in raise () from /lib64/libc.so.6
+ #1 0x00007f73916a58a4 in abort () from /lib64/libc.so.6
+ #2 0x00007f7393203ccc in g_assertion_message.cold () from /lib64/libglib-2.0.so.0
+ #3 0x00007f739325f22f in g_assertion_message_expr () from /lib64/libglib-2.0.so.0
+ #4 0x000055a4099e28ae in performance_profile_set_inhibited (self=0x55a40b37e320, self=0x55a40b37e320, performance_inhibited=<optimized out>) at ../panels/power/cc-power-panel.c:1366
+ #5 power_profiles_properties_changed_cb (self=0x55a40b37e320, changed_properties=<optimized out>, invalidated_properties=<optimized out>, proxy=<optimized out>) at ../panels/power/cc-power-panel.c:1425
+ #6 0x00007f7393332c2f in g_closure_invoke () from /lib64/libgobject-2.0.so.0
+ #7 0x00007f739334eea6 in signal_emit_unlocked_R () from /lib64/libgobject-2.0.so.0
+
+1362 {
+1363 CcPowerProfileRow *row;
+1364
+1365 row = self->power_profiles_row[CC_POWER_PROFILE_PERFORMANCE];
+1366 g_assert (row != NULL);
+1367 cc_power_profile_row_set_performance_inhibited (row, performance_inhibited);
+1368 }
+---
+ panels/power/cc-power-panel.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index c9c4705da..0b8226a29 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -1363,7 +1363,8 @@ performance_profile_set_inhibited (CcPowerPanel *self,
+ CcPowerProfileRow *row;
+
+ row = self->power_profiles_row[CC_POWER_PROFILE_PERFORMANCE];
+- g_assert (row != NULL);
++ if (!row)
++ return;
+ cc_power_profile_row_set_performance_inhibited (row, performance_inhibited);
+ }
+
+--
+2.32.0
+
+
+From da2248d43f519f13b57e89cdc80bbbfe346ad463 Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Thu, 7 Jan 2021 14:00:15 +0100
+Subject: [PATCH 02/33] power: Simplifies keyboard navigation
+
+This drops the ability to loop through the page but significantly
+simplifies the code. I think this is a good tradeoff as looping is a
+rather unexpected behavior.
+---
+ panels/power/cc-power-panel.c | 70 ++---------------------------------
+ 1 file changed, 4 insertions(+), 66 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 0b8226a29..1d31a8a83 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -122,9 +122,6 @@ struct _CcPowerPanel
+ gboolean has_batteries;
+ char *chassis_type;
+
+- GList *boxes;
+- GList *boxes_reverse;
+-
+ GDBusProxy *bt_rfkill;
+ GDBusProxy *bt_properties;
+
+@@ -169,8 +166,6 @@ cc_power_panel_dispose (GObject *object)
+ #ifdef HAVE_NETWORK_MANAGER
+ g_clear_object (&self->nm_client);
+ #endif
+- g_clear_pointer (&self->boxes, g_list_free);
+- g_clear_pointer (&self->boxes_reverse, g_list_free);
+ if (self->iio_proxy_watch_id != 0)
+ g_bus_unwatch_name (self->iio_proxy_watch_id);
+ self->iio_proxy_watch_id = 0;
+@@ -869,60 +864,12 @@ nm_client_ready_cb (GObject *source_object,
+ static gboolean
+ keynav_failed_cb (CcPowerPanel *self, GtkDirectionType direction, GtkWidget *list)
+ {
+- GtkWidget *next_list = NULL;
+- GList *item, *boxes_list;
+- gdouble value, lower, upper, page;
+-
+- /* Find the list in the list of GtkListBoxes */
+- if (direction == GTK_DIR_DOWN)
+- boxes_list = self->boxes;
+- else
+- boxes_list = self->boxes_reverse;
+-
+- item = g_list_find (boxes_list, list);
+- g_assert (item);
+- item = item->next;
+- while (1)
+- {
+- if (item == NULL)
+- item = boxes_list;
+-
+- /* Avoid looping */
+- if (item->data == list)
+- break;
+-
+- if (gtk_widget_is_visible (item->data))
+- {
+- next_list = item->data;
+- break;
+- }
+-
+- item = item->next;
+- }
+-
+- if (next_list)
+- {
+- gtk_widget_child_focus (next_list, direction);
+- return TRUE;
+- }
+-
+- value = gtk_adjustment_get_value (self->focus_adjustment);
+- lower = gtk_adjustment_get_lower (self->focus_adjustment);
+- upper = gtk_adjustment_get_upper (self->focus_adjustment);
+- page = gtk_adjustment_get_page_size (self->focus_adjustment);
++ if (direction != GTK_DIR_UP && direction != GTK_DIR_DOWN)
++ return FALSE;
+
+- if (direction == GTK_DIR_UP && value > lower)
+- {
+- gtk_adjustment_set_value (self->focus_adjustment, lower);
+- return TRUE;
+- }
+- else if (direction == GTK_DIR_DOWN && value < upper - page)
+- {
+- gtk_adjustment_set_value (self->focus_adjustment, upper - page);
+- return TRUE;
+- }
++ direction == GTK_DIR_UP ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD;
+
+- return FALSE;
++ return gtk_widget_child_focus (GTK_WIDGET (self), direction);
+ }
+
+ static void
+@@ -1559,8 +1506,6 @@ setup_power_profiles (CcPowerPanel *self)
+
+ gtk_widget_show (GTK_WIDGET (self->power_profile_section));
+
+- self->boxes_reverse = g_list_prepend (self->boxes_reverse, self->power_profile_listbox);
+-
+ props = g_variant_get_child_value (variant, 0);
+ performance_inhibited = variant_lookup_string (props, "PerformanceInhibited");
+ active_profile = variant_lookup_string (props, "ActiveProfile");
+@@ -1780,7 +1725,6 @@ cc_power_panel_init (CcPowerPanel *self)
+ battery_label = g_markup_printf_escaped ("<b>%s</b>", _("Battery"));
+ gtk_label_set_markup (self->battery_heading, battery_label);
+
+- self->boxes_reverse = g_list_prepend (self->boxes_reverse, self->battery_listbox);
+ gtk_list_box_set_header_func (self->battery_listbox,
+ cc_list_box_update_header_func,
+ NULL, NULL);
+@@ -1790,7 +1734,6 @@ cc_power_panel_init (CcPowerPanel *self)
+ device_label = g_markup_printf_escaped ("<b>%s</b>", _("Devices"));
+ gtk_label_set_markup (self->device_heading, device_label);
+
+- self->boxes_reverse = g_list_prepend (self->boxes_reverse, self->device_listbox);
+ gtk_list_box_set_header_func (self->device_listbox,
+ cc_list_box_update_header_func,
+ NULL, NULL);
+@@ -1809,7 +1752,6 @@ cc_power_panel_init (CcPowerPanel *self)
+
+ power_saving_label = g_strdup_printf ("<b>%s</b>", _("Power Saving"));
+ gtk_label_set_markup (self->power_saving_heading, power_saving_label);
+- self->boxes_reverse = g_list_prepend (self->boxes_reverse, self->power_saving_listbox);
+ gtk_list_box_set_header_func (self->power_saving_listbox,
+ cc_list_box_update_header_func,
+ NULL, NULL);
+@@ -1817,15 +1759,11 @@ cc_power_panel_init (CcPowerPanel *self)
+
+ general_label = g_markup_printf_escaped ("<b>%s</b>", _("Suspend & Power Button"));
+ gtk_label_set_markup (self->general_heading, general_label);
+- self->boxes_reverse = g_list_prepend (self->boxes_reverse, self->general_listbox);
+ gtk_list_box_set_header_func (self->general_listbox,
+ cc_list_box_update_header_func,
+ NULL, NULL);
+ setup_general_section (self);
+
+- self->boxes = g_list_copy (self->boxes_reverse);
+- self->boxes = g_list_reverse (self->boxes);
+-
+ /* populate batteries */
+ g_signal_connect_object (self->up_client, "device-added", G_CALLBACK (up_client_device_added), self, G_CONNECT_SWAPPED);
+ g_signal_connect_object (self->up_client, "device-removed", G_CALLBACK (up_client_device_removed), self, G_CONNECT_SWAPPED);
+--
+2.32.0
+
+
+From 25027f6c3c6928eeedb440fe2ca84412dae49ab2 Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Fri, 8 Jan 2021 16:00:25 +0100
+Subject: [PATCH 03/33] power: Don't set the vadjustment
+
+This is useless as GtkScrolledwindow already does it on the viewport it
+creates.
+---
+ panels/power/cc-power-panel.c | 9 ---------
+ panels/power/cc-power-panel.ui | 4 ++--
+ 2 files changed, 2 insertions(+), 11 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 1d31a8a83..1a8cfa969 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -91,8 +91,6 @@ struct _CcPowerPanel
+ GtkListBoxRow *kbd_brightness_row;
+ CcBrightnessScale *kbd_brightness_scale;
+ GtkSizeGroup *level_sizegroup;
+- GtkScrolledWindow *main_scroll;
+- HdyClamp *main_box;
+ GtkListBoxRow *mobile_row;
+ GtkSwitch *mobile_switch;
+ GtkComboBox *power_button_combo;
+@@ -136,8 +134,6 @@ struct _CcPowerPanel
+ #ifdef HAVE_NETWORK_MANAGER
+ NMClient *nm_client;
+ #endif
+-
+- GtkAdjustment *focus_adjustment;
+ };
+
+ CC_PANEL_REGISTER (CcPowerPanel, cc_power_panel)
+@@ -1661,8 +1657,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_scale);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, level_sizegroup);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, main_scroll);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, main_box);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_combo);
+@@ -1775,7 +1769,4 @@ cc_power_panel_init (CcPowerPanel *self)
+ G_CALLBACK (up_client_changed), self, G_CONNECT_SWAPPED);
+ }
+ up_client_changed (self);
+-
+- self->focus_adjustment = gtk_scrolled_window_get_vadjustment (self->main_scroll);
+- gtk_container_set_focus_vadjustment (GTK_CONTAINER (self->main_box), self->focus_adjustment);
+ }
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index ea3cf9322..d3e200d93 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -113,12 +113,12 @@
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+- <object class="GtkScrolledWindow" id="main_scroll">
++ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hscrollbar_policy">never</property>
+ <child>
+- <object class="HdyClamp" id="main_box">
++ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="margin_top">32</property>
+ <property name="margin_bottom">32</property>
+--
+2.32.0
+
+
+From caf3d70a7004552e0bb382a1a1220cdac9c0c1f0 Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Fri, 8 Jan 2021 16:12:56 +0100
+Subject: [PATCH 04/33] power: Use HdyComboRow for the Blank Screen row
+
+This simplifies the code a bit and modernizes the UI.
+---
+ panels/power/cc-power-panel.c | 110 ++++++++++++++++++++++++++-------
+ panels/power/cc-power-panel.ui | 88 ++------------------------
+ 2 files changed, 92 insertions(+), 106 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 1a8cfa969..b046b2589 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -73,7 +73,7 @@ struct _CcPowerPanel
+ GtkSizeGroup *battery_row_sizegroup;
+ GtkBox *battery_section;
+ GtkSizeGroup *battery_sizegroup;
+- GtkListBoxRow *blank_screen_row;
++ HdyComboRow *blank_screen_row;
+ GtkListBoxRow *brightness_row;
+ CcBrightnessScale *brightness_scale;
+ GtkListBoxRow *bt_row;
+@@ -87,7 +87,6 @@ struct _CcPowerPanel
+ GtkLabel *general_heading;
+ GtkListBox *general_listbox;
+ GtkBox *general_section;
+- GtkComboBox *idle_delay_combo;
+ GtkListBoxRow *kbd_brightness_row;
+ CcBrightnessScale *kbd_brightness_scale;
+ GtkSizeGroup *level_sizegroup;
+@@ -577,6 +576,49 @@ set_value_for_combo (GtkComboBox *combo_box, gint value)
+ gtk_combo_box_set_active_iter (combo_box, &new);
+ }
+
++static void
++set_value_for_combo_row (HdyComboRow *combo_row, gint value)
++{
++ gboolean insert = FALSE;
++ guint insert_before = 0;
++ guint i;
++ HdyValueObject *new;
++ GListModel *model;
++ gint value_last = 0;
++ g_autofree gchar *text = NULL;
++
++ /* try to make the UI match the setting */
++ model = hdy_combo_row_get_model (combo_row);
++ for (i = 0; i < g_list_model_get_n_items (model); i++)
++ {
++ HdyValueObject *value_object = g_list_model_get_item (model, i);
++ gint value_tmp = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (value_object), "value"));
++ if (value_tmp == value)
++ {
++ hdy_combo_row_set_selected_index (combo_row, i);
++ return;
++ }
++
++ /* Insert before if the next value is larger or the value is lower
++ * again (i.e. "Never" is zero and last). */
++ if (!insert && (value_tmp > value || value_last > value_tmp))
++ {
++ insert = TRUE;
++ insert_before = i;
++ }
++
++ value_last = value_tmp;
++ }
++
++ /* The value is not listed, so add it at the best point (or the end). */
++ text = cc_util_time_to_string_text (value * 1000);
++ new = hdy_value_object_new_string (text);
++ g_object_set_data (G_OBJECT (new), "value",
++ GUINT_TO_POINTER (value));
++ g_list_store_insert (G_LIST_STORE (model), insert_before, new);
++ hdy_combo_row_set_selected_index (combo_row, insert_before);
++}
++
+ static void
+ set_ac_battery_ui_mode (CcPowerPanel *self)
+ {
+@@ -869,25 +911,18 @@ keynav_failed_cb (CcPowerPanel *self, GtkDirectionType direction, GtkWidget *lis
+ }
+
+ static void
+-idle_delay_combo_changed_cb (CcPowerPanel *self)
++blank_screen_row_changed_cb (CcPowerPanel *self)
+ {
+- GtkTreeIter iter;
+- GtkTreeModel *model;
++ GListModel *model;
++ gint selected_index;
++ HdyValueObject *value_object;
+ gint value;
+- gboolean ret;
+
+- /* no selection */
+- ret = gtk_combo_box_get_active_iter (self->idle_delay_combo, &iter);
+- if (!ret)
+- return;
++ model = hdy_combo_row_get_model (self->blank_screen_row);
++ selected_index = hdy_combo_row_get_selected_index (self->blank_screen_row);
++ value_object = g_list_model_get_item (model, selected_index);
++ value = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (value_object), "value"));
+
+- /* get entry */
+- model = gtk_combo_box_get_model (self->idle_delay_combo);
+- gtk_tree_model_get (model, &iter,
+- 1, &value,
+- -1);
+-
+- /* set both keys */
+ g_settings_set_uint (self->session_settings, "idle-delay", value);
+ }
+
+@@ -1171,6 +1206,37 @@ has_kbd_brightness_cb (CcPowerPanel *self,
+ gtk_widget_set_visible (GTK_WIDGET (self->kbd_brightness_row), has_brightness);
+ }
+
++static void
++populate_blank_screen_row (HdyComboRow *combo_row)
++{
++ g_autoptr (GListStore) list_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
++ gint minutes[] = { 1, 2, 3, 4, 5, 8, 10, 12, 15 };
++ guint i;
++ g_autoptr (HdyValueObject) never_value_object = NULL;
++
++ for (i = 0; i < G_N_ELEMENTS (minutes); i++)
++ {
++ gchar *text = NULL;
++ g_autoptr (HdyValueObject) value_object = NULL;
++
++ /* Translators: Option for "Blank Screen" in "Power" panel */
++ text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d minute", "%d minutes", minutes[i]), minutes[i]);
++ value_object = hdy_value_object_new_take_string (text);
++
++ g_object_set_data (G_OBJECT (value_object), "value", GUINT_TO_POINTER (minutes[i] * 60));
++ g_list_store_append (list_store, value_object);
++ }
++
++ never_value_object = hdy_value_object_new_string (C_("Idle time", "Never"));
++ g_object_set_data (G_OBJECT (never_value_object), "value", GUINT_TO_POINTER (0));
++ g_list_store_append (list_store, never_value_object);
++
++ hdy_combo_row_bind_name_model (combo_row,
++ G_LIST_MODEL (list_store),
++ (HdyComboRowGetNameFunc) hdy_value_object_dup_string,
++ NULL, NULL);
++}
++
+ static void
+ setup_power_saving (CcPowerPanel *self)
+ {
+@@ -1191,10 +1257,11 @@ setup_power_saving (CcPowerPanel *self)
+ self->dim_screen_switch, "active",
+ G_SETTINGS_BIND_DEFAULT);
+
++ g_signal_handlers_block_by_func (self->blank_screen_row, blank_screen_row_changed_cb, self);
++ populate_blank_screen_row (self->blank_screen_row);
+ value = g_settings_get_uint (self->session_settings, "idle-delay");
+- g_signal_handlers_block_by_func (self->idle_delay_combo, idle_delay_combo_changed_cb, self);
+- set_value_for_combo (self->idle_delay_combo, value);
+- g_signal_handlers_unblock_by_func (self->idle_delay_combo, idle_delay_combo_changed_cb, self);
++ set_value_for_combo_row (self->blank_screen_row, value);
++ g_signal_handlers_unblock_by_func (self->blank_screen_row, blank_screen_row_changed_cb, self);
+
+ /* The default values for these settings are unfortunate for us;
+ * timeout == 0, action == suspend means 'do nothing' - just
+@@ -1653,7 +1720,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_heading);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_section);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, idle_delay_combo);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_scale);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, level_sizegroup);
+@@ -1683,7 +1749,7 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_callback (widget_class, bt_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, has_brightness_cb);
+ gtk_widget_class_bind_template_callback (widget_class, has_kbd_brightness_cb);
+- gtk_widget_class_bind_template_callback (widget_class, idle_delay_combo_changed_cb);
++ gtk_widget_class_bind_template_callback (widget_class, blank_screen_row_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, keynav_failed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, mobile_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_button_combo_changed_cb);
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index d3e200d93..a9bb39b77 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -51,56 +51,6 @@
+ </row>
+ </data>
+ </object>
+- <object class="GtkListStore" id="idle_time_liststore">
+- <columns>
+- <!-- column-name name -->
+- <column type="gchararray"/>
+- <!-- column-name value -->
+- <column type="gint"/>
+- </columns>
+- <data>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">1 minute</col>
+- <col id="1">60</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">2 minutes</col>
+- <col id="1">120</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">3 minutes</col>
+- <col id="1">180</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">4 minutes</col>
+- <col id="1">240</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">5 minutes</col>
+- <col id="1">300</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">8 minutes</col>
+- <col id="1">480</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">10 minutes</col>
+- <col id="1">600</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">12 minutes</col>
+- <col id="1">720</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">15 minutes</col>
+- <col id="1">900</col>
+- </row>
+- <row>
+- <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank screen&quot; in &quot;Power&quot; panel.">Never</col>
+- <col id="1">0</col>
+- </row>
+- </data>
+- </object>
+ <object class="GtkListStore" id="power_button_liststore">
+ <columns>
+ <!-- column-name name -->
+@@ -447,41 +397,11 @@
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="blank_screen_row">
++ <object class="HdyComboRow" id="blank_screen_row">
+ <property name="visible">True</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
+- <child>
+- <object class="GtkBox">
+- <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">_Blank Screen</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="expand">True</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">idle_delay_combo</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkComboBoxText" id="idle_delay_combo">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="entry-text-column">0</property>
+- <property name="model">idle_time_liststore</property>
+- <signal name="changed" handler="idle_delay_combo_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
++ <property name="title" translatable="yes">_Blank Screen</property>
++ <property name="use_underline">True</property>
++ <signal name="notify::selected-index" handler="blank_screen_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ <child>
+--
+2.32.0
+
+
+From 7dbe681401f3f487f1e752a0569cf3d743a74187 Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Fri, 8 Jan 2021 16:17:42 +0100
+Subject: [PATCH 05/33] power: Use HdyComboRow for the Power Button Behavior
+ row
+
+This simplifies the code a bit and modernizes the UI.
+---
+ panels/power/cc-power-panel.c | 71 ++++++++++++++++++----------------
+ panels/power/cc-power-panel.ui | 46 ++--------------------
+ 2 files changed, 42 insertions(+), 75 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index b046b2589..ea979cfc7 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -92,9 +92,7 @@ struct _CcPowerPanel
+ GtkSizeGroup *level_sizegroup;
+ GtkListBoxRow *mobile_row;
+ GtkSwitch *mobile_switch;
+- GtkComboBox *power_button_combo;
+- GtkListStore *power_button_liststore;
+- GtkListBoxRow *power_button_row;
++ HdyComboRow *power_button_row;
+ GtkLabel *power_profile_heading;
+ GtkListBox *power_profile_listbox;
+ GtkBox *power_profile_section;
+@@ -927,25 +925,18 @@ blank_screen_row_changed_cb (CcPowerPanel *self)
+ }
+
+ static void
+-power_button_combo_changed_cb (CcPowerPanel *self)
++power_button_row_changed_cb (CcPowerPanel *self)
+ {
+- GtkTreeIter iter;
+- GtkTreeModel *model;
++ GListModel *model;
++ gint selected_index;
++ HdyValueObject *value_object;
+ gint value;
+- gboolean ret;
+
+- /* no selection */
+- ret = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->power_button_combo), &iter);
+- if (!ret)
+- return;
+-
+- /* get entry */
+- model = gtk_combo_box_get_model (GTK_COMBO_BOX (self->power_button_combo));
+- gtk_tree_model_get (model, &iter,
+- 1, &value,
+- -1);
++ model = hdy_combo_row_get_model (self->power_button_row);
++ selected_index = hdy_combo_row_get_selected_index (self->power_button_row);
++ value_object = g_list_model_get_item (model, selected_index);
++ value = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (value_object), "value"));
+
+- /* set both keys */
+ g_settings_set_enum (self->gsd_settings, "power-button-action", value);
+ }
+
+@@ -1048,10 +1039,11 @@ set_sleep_type (const GValue *value,
+ }
+
+ static void
+-populate_power_button_model (GtkTreeModel *model,
+- gboolean can_suspend,
+- gboolean can_hibernate)
++populate_power_button_row (HdyComboRow *combo_row,
++ gboolean can_suspend,
++ gboolean can_hibernate)
+ {
++ g_autoptr (GListStore) list_store = NULL;
+ struct {
+ char *name;
+ GsdPowerButtonActionType value;
+@@ -1063,20 +1055,28 @@ populate_power_button_model (GtkTreeModel *model,
+ };
+ guint i;
+
++ list_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
+ for (i = 0; i < G_N_ELEMENTS (actions); i++)
+ {
++ g_autoptr (HdyValueObject) value_object = NULL;
++
+ if (!can_suspend && actions[i].value == GSD_POWER_BUTTON_ACTION_SUSPEND)
+ continue;
+
+ if (!can_hibernate && actions[i].value == GSD_POWER_BUTTON_ACTION_HIBERNATE)
+ continue;
+
+- gtk_list_store_insert_with_values (GTK_LIST_STORE (model),
+- NULL, -1,
+- 0, _(actions[i].name),
+- 1, actions[i].value,
+- -1);
++ value_object = hdy_value_object_new_string (actions[i].name);
++ g_object_set_data (G_OBJECT (value_object),
++ "value",
++ GUINT_TO_POINTER (actions[i].value));
++ g_list_store_append (list_store, value_object);
+ }
++
++ hdy_combo_row_bind_name_model (combo_row,
++ G_LIST_MODEL (list_store),
++ (HdyComboRowGetNameFunc) hdy_value_object_dup_string,
++ NULL, NULL);
+ }
+
+ #define NEVER 0
+@@ -1635,10 +1635,17 @@ setup_general_section (CcPowerPanel *self)
+ {
+ gtk_widget_show (GTK_WIDGET (self->power_button_row));
+
+- populate_power_button_model (GTK_TREE_MODEL (self->power_button_liststore), can_suspend, can_hibernate);
+- g_signal_handlers_block_by_func (self->power_button_combo, power_button_combo_changed_cb, self);
+- set_value_for_combo (self->power_button_combo, g_settings_get_enum (self->gsd_settings, "power-button-action"));
+- g_signal_handlers_unblock_by_func (self->power_button_combo, power_button_combo_changed_cb, self);
++ g_signal_handlers_block_by_func (self->power_button_row,
++ power_button_row_changed_cb,
++ self);
++ populate_power_button_row (self->power_button_row,
++ can_suspend,
++ can_hibernate);
++ set_value_for_combo_row (self->power_button_row,
++ g_settings_get_enum (self->gsd_settings, "power-button-action"));
++ g_signal_handlers_unblock_by_func (self->power_button_row,
++ power_button_row_changed_cb,
++ self);
+
+ show_section = TRUE;
+ }
+@@ -1725,8 +1732,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, level_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_switch);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_combo);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_liststore);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_heading);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_listbox);
+@@ -1752,7 +1757,7 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_callback (widget_class, blank_screen_row_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, keynav_failed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, mobile_switch_changed_cb);
+- gtk_widget_class_bind_template_callback (widget_class, power_button_combo_changed_cb);
++ gtk_widget_class_bind_template_callback (widget_class, power_button_row_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_profiles_row_activated_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_saving_listbox_row_activated_cb);
+ gtk_widget_class_bind_template_callback (widget_class, wifi_switch_changed_cb);
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index a9bb39b77..18fc0a8ac 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -51,14 +51,6 @@
+ </row>
+ </data>
+ </object>
+- <object class="GtkListStore" id="power_button_liststore">
+- <columns>
+- <!-- column-name name -->
+- <column type="gchararray"/>
+- <!-- column-name value -->
+- <column type="gint"/>
+- </columns>
+- </object>
+ <template class="CcPowerPanel" parent="CcPanel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+@@ -660,41 +652,11 @@
+ <relation target="general_heading" type="labelled-by"/>
+ </accessibility>
+ <child>
+- <object class="GtkListBoxRow" id="power_button_row">
++ <object class="HdyComboRow" id="power_button_row">
+ <property name="visible">False</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
+- <child>
+- <object class="GtkBox">
+- <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">Po_wer Button Behavior</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="expand">True</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">power_button_combo</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkComboBoxText" id="power_button_combo">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="entry-text-column">0</property>
+- <property name="model">power_button_liststore</property>
+- <signal name="changed" handler="power_button_combo_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
++ <property name="title" translatable="yes">Po_wer Button Behavior</property>
++ <property name="use_underline">True</property>
++ <signal name="notify::selected-index" handler="power_button_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ <child>
+--
+2.32.0
+
+
+From db131378d3a980dc243d704a91cf995d40df356b Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Thu, 7 Jan 2021 10:59:00 +0100
+Subject: [PATCH 06/33] power: Use HdyActionRow to simplify the code
+
+---
+ panels/power/cc-power-panel.c | 27 +--
+ panels/power/cc-power-panel.ui | 430 +++++----------------------------
+ 2 files changed, 72 insertions(+), 385 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index ea979cfc7..22d91c564 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -68,17 +68,15 @@ struct _CcPowerPanel
+ GtkListBoxRow *automatic_suspend_row;
+ GtkLabel *battery_heading;
+ GtkListBox *battery_listbox;
+- GtkListBoxRow *battery_percentage_row;
++ HdyActionRow *battery_percentage_row;
+ GtkSwitch *battery_percentage_switch;
+ GtkSizeGroup *battery_row_sizegroup;
+ GtkBox *battery_section;
+- GtkSizeGroup *battery_sizegroup;
+ HdyComboRow *blank_screen_row;
+ GtkListBoxRow *brightness_row;
+ CcBrightnessScale *brightness_scale;
+ GtkListBoxRow *bt_row;
+ GtkSwitch *bt_switch;
+- GtkSizeGroup *charge_sizegroup;
+ GtkLabel *device_heading;
+ GtkListBox *device_listbox;
+ GtkBox *device_section;
+@@ -234,8 +232,6 @@ add_battery (CcPowerPanel *panel, UpDevice *device, gboolean primary)
+ CcBatteryRow *row = cc_battery_row_new (device, primary);
+ cc_battery_row_set_level_sizegroup (row, panel->level_sizegroup);
+ cc_battery_row_set_row_sizegroup (row, panel->battery_row_sizegroup);
+- cc_battery_row_set_charge_sizegroup (row, panel->charge_sizegroup);
+- cc_battery_row_set_battery_sizegroup (row, panel->battery_sizegroup);
+
+ gtk_container_add (GTK_CONTAINER (panel->battery_listbox), GTK_WIDGET (row));
+ gtk_widget_set_visible (GTK_WIDGET (panel->battery_section), TRUE);
+@@ -247,8 +243,6 @@ add_device (CcPowerPanel *self, UpDevice *device)
+ CcBatteryRow *row = cc_battery_row_new (device, FALSE);
+ cc_battery_row_set_level_sizegroup (row, self->level_sizegroup);
+ cc_battery_row_set_row_sizegroup (row, self->row_sizegroup);
+- cc_battery_row_set_charge_sizegroup (row, self->charge_sizegroup);
+- cc_battery_row_set_battery_sizegroup (row, self->battery_sizegroup);
+
+ gtk_container_add (GTK_CONTAINER (self->device_listbox), GTK_WIDGET (row));
+ gtk_widget_set_visible (GTK_WIDGET (self->device_section), TRUE);
+@@ -986,23 +980,20 @@ iio_proxy_vanished_cb (GDBusConnection *connection,
+ }
+
+ static void
+-power_saving_listbox_row_activated_cb (CcPowerPanel *self, GtkListBoxRow *row)
++automatic_suspend_row_activated_cb (CcPowerPanel *self)
+ {
+ GtkWidget *toplevel;
+
+- if (row == self->automatic_suspend_row)
+- {
+- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
+- gtk_window_set_transient_for (GTK_WINDOW (self->automatic_suspend_dialog), GTK_WINDOW (toplevel));
+- gtk_window_set_modal (GTK_WINDOW (self->automatic_suspend_dialog), TRUE);
+- gtk_window_present (GTK_WINDOW (self->automatic_suspend_dialog));
+- }
++ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
++ gtk_window_set_transient_for (GTK_WINDOW (self->automatic_suspend_dialog), GTK_WINDOW (toplevel));
++ gtk_window_set_modal (GTK_WINDOW (self->automatic_suspend_dialog), TRUE);
++ gtk_window_present (GTK_WINDOW (self->automatic_suspend_dialog));
+ }
+
+ static gboolean
+ automatic_suspend_label_mnemonic_activate_cb (CcPowerPanel *self)
+ {
+- power_saving_listbox_row_activated_cb (self, self->automatic_suspend_row);
++ automatic_suspend_row_activated_cb (self);
+ return TRUE;
+ }
+
+@@ -1712,13 +1703,11 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_percentage_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_row_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_section);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, blank_screen_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, brightness_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, brightness_scale);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, bt_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, bt_switch);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, charge_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_heading);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_section);
+@@ -1759,7 +1748,7 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_callback (widget_class, mobile_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_button_row_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_profiles_row_activated_cb);
+- gtk_widget_class_bind_template_callback (widget_class, power_saving_listbox_row_activated_cb);
++ gtk_widget_class_bind_template_callback (widget_class, automatic_suspend_row_activated_cb);
+ gtk_widget_class_bind_template_callback (widget_class, wifi_switch_changed_cb);
+ }
+
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index 18fc0a8ac..12df3aa4a 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -220,170 +220,59 @@
+ <relation target="power_saving_heading" type="labelled-by"/>
+ </accessibility>
+ <child>
+- <object class="GtkListBoxRow" id="brightness_row">
++ <object class="HdyActionRow" id="brightness_row">
+ <property name="visible">True</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">_Screen Brightness</property>
++ <property name="use_underline">True</property>
+ <child>
+- <object class="GtkBox">
++ <object class="CcBrightnessScale" id="brightness_scale">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel" id="brightness_label">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">_Screen Brightness</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">brightness_scale</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkBox">
+- <property name="visible">True</property>
+- <property name="spacing">12</property>
+- <property name="expand">True</property>
+- <child>
+- <object class="GtkLabel" id="brightness_spacer">
+- <property name="visible">True</property>
+- </object>
+- </child>
+- <child>
+- <object class="CcBrightnessScale" id="brightness_scale">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <property name="device">screen</property>
+- <signal name="notify::has-brightness" handler="has_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <property name="expand">True</property>
++ <property name="device">screen</property>
++ <signal name="notify::has-brightness" handler="has_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="als_row">
++ <object class="HdyActionRow" id="als_row">
+ <property name="visible">True</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">Automatic Brightness</property>
+ <child>
+- <object class="GtkBox">
++ <object class="GtkSwitch" id="als_switch">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">Automatic Brightness</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="expand">True</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">als_switch</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkSwitch" id="als_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="als_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="als_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="kbd_brightness_row">
++ <object class="HdyActionRow" id="kbd_brightness_row">
+ <property name="visible">True</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">_Keyboard Brightness</property>
++ <property name="use_underline">True</property>
+ <child>
+- <object class="GtkBox">
++ <object class="CcBrightnessScale" id="kbd_brightness_scale">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel" id="kbd_brightness_label">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">_Keyboard Brightness</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">kbd_brightness_scale</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkBox">
+- <property name="visible">True</property>
+- <property name="spacing">12</property>
+- <property name="expand">True</property>
+- <child>
+- <object class="GtkLabel" id="kbd_brightness_spacer">
+- <property name="visible">True</property>
+- </object>
+- </child>
+- <child>
+- <object class="CcBrightnessScale" id="kbd_brightness_scale">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <property name="device">kbd</property>
+- <signal name="notify::has-brightness" handler="has_kbd_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <property name="expand">True</property>
++ <property name="device">kbd</property>
++ <signal name="notify::has-brightness" handler="has_kbd_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="dim_screen_row">
++ <object class="HdyActionRow" id="dim_screen_row">
+ <property name="visible">True</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">Dim Screen When Inactive</property>
++ <property name="activatable_widget">dim_screen_switch</property>
+ <child>
+- <object class="GtkBox">
++ <object class="GtkSwitch" id="dim_screen_switch">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">Dim Screen When Inactive</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="expand">True</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">dim_screen_switch</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkSwitch" id="dim_screen_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- </object>
+- </child>
++ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+@@ -397,221 +286,65 @@
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="automatic_suspend_row">
++ <object class="HdyActionRow" id="automatic_suspend_row">
+ <property name="visible">False</property>
++ <property name="title" translatable="yes">_Automatic Suspend</property>
++ <property name="use_underline">True</property>
++ <property name="activatable">True</property>
++ <signal name="activated" handler="automatic_suspend_row_activated_cb" swapped="yes"/>
+ <child>
+- <object class="GtkBox">
++ <object class="GtkLabel" id="automatic_suspend_label">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">_Automatic Suspend</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="expand">True</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">automatic_suspend_label</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkLabel" id="automatic_suspend_label">
+- <property name="visible">True</property>
+- <property name="halign">end</property>
+- <signal name="mnemonic-activate" handler="automatic_suspend_label_mnemonic_activate_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
++ <property name="halign">end</property>
++ <signal name="mnemonic-activate" handler="automatic_suspend_label_mnemonic_activate_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="wifi_row">
++ <object class="HdyActionRow" id="wifi_row">
+ <property name="visible">False</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">_Wi-Fi</property>
++ <property name="subtitle" translatable="yes">Wi-Fi can be turned off to save power.</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">wifi_switch</property>
+ <child>
+- <object class="GtkBox">
++ <object class="GtkSwitch" id="wifi_switch">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkBox">
+- <property name="visible">True</property>
+- <property name="orientation">vertical</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="spacing">4</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">_Wi-Fi</property>
+- <property name="halign">start</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">wifi_switch</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">Wi-Fi can be turned off to save power.</property>
+- <property name="halign">start</property>
+- <property name="xalign">0</property>
+- <attributes>
+- <attribute name="scale" value="0.9"/>
+- </attributes>
+- <style>
+- <class name="dim-label"/>
+- </style>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="GtkSwitch" id="wifi_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="wifi_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="wifi_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="mobile_row">
++ <object class="HdyActionRow" id="mobile_row">
+ <property name="visible">False</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">_Mobile Broadband</property>
++ <property name="subtitle" translatable="yes">Mobile broadband (LTE, 4G, 3G, etc.) can be turned off to save power.</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">mobile_switch</property>
+ <child>
+- <object class="GtkBox">
++ <object class="GtkSwitch" id="mobile_switch">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkBox">
+- <property name="visible">True</property>
+- <property name="orientation">vertical</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="spacing">4</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">_Mobile Broadband</property>
+- <property name="halign">start</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">mobile_switch</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">Mobile broadband (LTE, 4G, 3G, etc.) can be turned off to save power.</property>
+- <property name="halign">start</property>
+- <property name="xalign">0</property>
+- <attributes>
+- <attribute name="scale" value="0.9"/>
+- </attributes>
+- <style>
+- <class name="dim-label"/>
+- </style>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="GtkSwitch" id="mobile_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="mobile_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="mobile_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="bt_row">
++ <object class="HdyActionRow" id="bt_row">
+ <property name="visible">False</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">_Bluetooth</property>
++ <property name="subtitle" translatable="yes">Bluetooth can be turned off to save power.</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">bt_switch</property>
+ <child>
+- <object class="GtkBox">
++ <object class="GtkSwitch" id="bt_switch">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkBox">
+- <property name="visible">True</property>
+- <property name="orientation">vertical</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="spacing">4</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">_Bluetooth</property>
+- <property name="halign">start</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">bt_switch</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">Bluetooth can be turned off to save power.</property>
+- <property name="halign">start</property>
+- <property name="xalign">0</property>
+- <attributes>
+- <attribute name="scale" value="0.9"/>
+- </attributes>
+- <style>
+- <class name="dim-label"/>
+- </style>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="GtkSwitch" id="bt_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="bt_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="bt_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+@@ -660,36 +393,15 @@
+ </object>
+ </child>
+ <child>
+- <object class="GtkListBoxRow" id="battery_percentage_row">
++ <object class="HdyActionRow" id="battery_percentage_row">
+ <property name="visible">False</property>
+- <property name="selectable">False</property>
+- <property name="activatable">False</property>
++ <property name="title" translatable="yes">Show Battery _Percentage</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">battery_percentage_switch</property>
+ <child>
+- <object class="GtkBox">
++ <object class="GtkSwitch" id="battery_percentage_switch">
+ <property name="visible">True</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
+- <property name="spacing">12</property>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="use-underline">True</property>
+- <property name="ellipsize">end</property>
+- <property name="label" translatable="yes">Show Battery _Percentage</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">6</property>
+- <property name="expand">True</property>
+- <property name="xalign">0</property>
+- <property name="mnemonic_widget">battery_percentage_switch</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkSwitch" id="battery_percentage_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- </object>
+- </child>
++ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+@@ -710,20 +422,6 @@
+ <object class="GtkSizeGroup" id="battery_row_sizegroup">
+ <property name="mode">vertical</property>
+ </object>
+- <object class="GtkSizeGroup" id="battery_sizegroup">
+- <property name="mode">horizontal</property>
+- <widgets>
+- <widget name="brightness_label"/>
+- <widget name="kbd_brightness_label"/>
+- </widgets>
+- </object>
+- <object class="GtkSizeGroup" id="charge_sizegroup">
+- <property name="mode">horizontal</property>
+- <widgets>
+- <widget name="brightness_spacer"/>
+- <widget name="kbd_brightness_spacer"/>
+- </widgets>
+- </object>
+ <object class="GtkSizeGroup" id="level_sizegroup">
+ <property name="mode">horizontal</property>
+ <widgets>
+--
+2.32.0
+
+
+From 93fa8d4dfaa206a763f678df2b2eb31e1599c7c8 Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Thu, 7 Jan 2021 13:49:36 +0100
+Subject: [PATCH 07/33] power: Use HdyPreferencesGroup
+
+---
+ panels/power/cc-power-panel.c | 60 ++---------
+ panels/power/cc-power-panel.ui | 175 +++++----------------------------
+ 2 files changed, 30 insertions(+), 205 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 22d91c564..96558c778 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -66,36 +66,29 @@ struct _CcPowerPanel
+ GtkDialog *automatic_suspend_dialog;
+ GtkLabel *automatic_suspend_label;
+ GtkListBoxRow *automatic_suspend_row;
+- GtkLabel *battery_heading;
+ GtkListBox *battery_listbox;
+ HdyActionRow *battery_percentage_row;
+ GtkSwitch *battery_percentage_switch;
+ GtkSizeGroup *battery_row_sizegroup;
+- GtkBox *battery_section;
++ HdyPreferencesGroup *battery_section;
+ HdyComboRow *blank_screen_row;
+ GtkListBoxRow *brightness_row;
+ CcBrightnessScale *brightness_scale;
+ GtkListBoxRow *bt_row;
+ GtkSwitch *bt_switch;
+- GtkLabel *device_heading;
+ GtkListBox *device_listbox;
+- GtkBox *device_section;
++ HdyPreferencesGroup *device_section;
+ GtkListBoxRow *dim_screen_row;
+ GtkSwitch *dim_screen_switch;
+- GtkLabel *general_heading;
+- GtkListBox *general_listbox;
+- GtkBox *general_section;
++ HdyPreferencesGroup *general_section;
+ GtkListBoxRow *kbd_brightness_row;
+ CcBrightnessScale *kbd_brightness_scale;
+ GtkSizeGroup *level_sizegroup;
+ GtkListBoxRow *mobile_row;
+ GtkSwitch *mobile_switch;
+ HdyComboRow *power_button_row;
+- GtkLabel *power_profile_heading;
+ GtkListBox *power_profile_listbox;
+- GtkBox *power_profile_section;
+- GtkLabel *power_saving_heading;
+- GtkListBox *power_saving_listbox;
++ HdyPreferencesGroup *power_profile_section;
+ GtkSizeGroup *row_sizegroup;
+ GtkComboBox *suspend_on_battery_delay_combo;
+ GtkLabel *suspend_on_battery_delay_label;
+@@ -259,7 +252,6 @@ up_client_changed (CcPowerPanel *self)
+ guint n_batteries;
+ gboolean on_ups;
+ g_autoptr(UpDevice) composite = NULL;
+- g_autofree gchar *s = NULL;
+
+ battery_children = gtk_container_get_children (GTK_CONTAINER (self->battery_listbox));
+ for (l = battery_children; l != NULL; l = l->next)
+@@ -390,10 +382,9 @@ up_client_changed (CcPowerPanel *self)
+ }
+
+ if (n_batteries > 1)
+- s = g_strdup_printf ("<b>%s</b>", _("Batteries"));
++ hdy_preferences_group_set_title (self->battery_section, _("Batteries"));
+ else
+- s = g_strdup_printf ("<b>%s</b>", _("Battery"));
+- gtk_label_set_label (GTK_LABEL (self->battery_heading), s);
++ hdy_preferences_group_set_title (self->battery_section, _("Battery"));
+
+ if (!on_ups && n_batteries > 1)
+ add_battery (self, composite, TRUE);
+@@ -1697,7 +1688,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, automatic_suspend_dialog);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, automatic_suspend_label);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, automatic_suspend_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_heading);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_percentage_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_percentage_switch);
+@@ -1708,13 +1698,10 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, brightness_scale);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, bt_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, bt_switch);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_heading);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_section);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, dim_screen_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, dim_screen_switch);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_heading);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_section);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_scale);
+@@ -1722,11 +1709,8 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_heading);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_section);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_saving_heading);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_saving_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, row_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_battery_delay_combo);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_battery_delay_label);
+@@ -1755,11 +1739,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ static void
+ cc_power_panel_init (CcPowerPanel *self)
+ {
+- g_autofree gchar *battery_label = NULL;
+- g_autofree gchar *device_label = NULL;
+- g_autofree gchar *power_profile_label = NULL;
+- g_autofree gchar *power_saving_label = NULL;
+- g_autofree gchar *general_label = NULL;
+ guint i;
+
+ g_resources_register (cc_power_get_resource ());
+@@ -1776,46 +1755,19 @@ cc_power_panel_init (CcPowerPanel *self)
+ self->session_settings = g_settings_new ("org.gnome.desktop.session");
+ self->interface_settings = g_settings_new ("org.gnome.desktop.interface");
+
+- battery_label = g_markup_printf_escaped ("<b>%s</b>", _("Battery"));
+- gtk_label_set_markup (self->battery_heading, battery_label);
+-
+- gtk_list_box_set_header_func (self->battery_listbox,
+- cc_list_box_update_header_func,
+- NULL, NULL);
+ gtk_list_box_set_sort_func (self->battery_listbox,
+ (GtkListBoxSortFunc)battery_sort_func, NULL, NULL);
+
+- device_label = g_markup_printf_escaped ("<b>%s</b>", _("Devices"));
+- gtk_label_set_markup (self->device_heading, device_label);
+-
+- gtk_list_box_set_header_func (self->device_listbox,
+- cc_list_box_update_header_func,
+- NULL, NULL);
+ gtk_list_box_set_sort_func (self->device_listbox,
+ (GtkListBoxSortFunc)battery_sort_func, NULL, NULL);
+
+- power_profile_label = g_strdup_printf ("<b>%s</b>", _("Power Mode"));
+- gtk_label_set_markup (self->power_profile_heading, power_profile_label);
+ gtk_list_box_set_sort_func (self->power_profile_listbox,
+ perf_profile_list_box_sort,
+ NULL, NULL);
+- gtk_list_box_set_header_func (self->power_profile_listbox,
+- cc_list_box_update_header_func,
+- NULL, NULL);
+ setup_power_profiles (self);
+
+- power_saving_label = g_strdup_printf ("<b>%s</b>", _("Power Saving"));
+- gtk_label_set_markup (self->power_saving_heading, power_saving_label);
+- gtk_list_box_set_header_func (self->power_saving_listbox,
+- cc_list_box_update_header_func,
+- NULL, NULL);
+ setup_power_saving (self);
+
+- general_label = g_markup_printf_escaped ("<b>%s</b>", _("Suspend & Power Button"));
+- gtk_label_set_markup (self->general_heading, general_label);
+- gtk_list_box_set_header_func (self->general_listbox,
+- cc_list_box_update_header_func,
+- NULL, NULL);
+ setup_general_section (self);
+
+ /* populate batteries */
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index 12df3aa4a..26d6ffddc 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -55,124 +55,60 @@
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+- <object class="GtkScrolledWindow">
++ <object class="HdyPreferencesPage">
+ <property name="visible">True</property>
+- <property name="can_focus">False</property>
+- <property name="hscrollbar_policy">never</property>
+- <child>
+- <object class="HdyClamp">
+- <property name="visible">True</property>
+- <property name="margin_top">32</property>
+- <property name="margin_bottom">32</property>
+- <property name="margin_start">12</property>
+- <property name="margin_end">12</property>
+- <child>
+- <object class="GtkBox" id="power_vbox">
+- <property name="visible">True</property>
+- <property name="can_focus">False</property>
+- <property name="orientation">vertical</property>
+- <property name="spacing">3</property>
+- <property name="hexpand">True</property>
+ <child>
+- <object class="GtkBox" id="battery_section">
++ <object class="HdyPreferencesGroup" id="battery_section">
+ <property name="visible">True</property>
+- <property name="orientation">vertical</property>
+- <property name="margin_bottom">32</property>
+- <child>
+- <object class="GtkLabel" id="battery_heading">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="halign">start</property>
+- <property name="margin_bottom">12</property>
++ <property name="title" translatable="yes">Battery</property>
+ <accessibility>
+ <relation target="battery_listbox" type="label-for"/>
+ </accessibility>
+- </object>
+- </child>
+- <child>
+- <object class="GtkFrame">
+- <property name="visible">True</property>
+- <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkListBox" id="battery_listbox">
+ <property name="visible">True</property>
+ <property name="selection-mode">none</property>
+ <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+ <accessibility>
+- <relation target="battery_heading" type="labelled-by"/>
++ <relation target="battery_section" type="labelled-by"/>
+ </accessibility>
++ <style>
++ <class name="content"/>
++ </style>
+ </object>
+ </child>
+- </object>
+- </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkBox" id="device_section">
++ <object class="HdyPreferencesGroup" id="device_section">
+ <property name="visible">True</property>
+- <property name="orientation">vertical</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">32</property>
+- <child>
+- <object class="GtkLabel" id="device_heading">
+- <property name="visible">True</property>
+- <property name="ellipsize">end</property>
+- <property name="xalign">0</property>
+- <property name="use-markup">True</property>
+- <property name="halign">start</property>
+- <property name="margin_bottom">12</property>
++ <property name="title" translatable="yes">Devices</property>
+ <accessibility>
+ <relation target="device_listbox" type="label-for"/>
+ </accessibility>
+- </object>
+- </child>
+- <child>
+- <object class="GtkFrame">
+- <property name="visible">True</property>
+- <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkListBox" id="device_listbox">
+ <property name="visible">True</property>
+ <property name="selection-mode">none</property>
+ <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+ <accessibility>
+- <relation target="device_heading" type="labelled-by"/>
++ <relation target="device_section" type="labelled-by"/>
+ </accessibility>
++ <style>
++ <class name="content"/>
++ </style>
+ </object>
+ </child>
+- </object>
+- </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkBox" id="power_profile_section">
++ <object class="HdyPreferencesGroup" id="power_profile_section">
+ <property name="visible">False</property>
+- <property name="orientation">vertical</property>
+- <property name="margin_bottom">32</property>
+- <child>
+- <object class="GtkLabel" id="power_profile_heading">
+- <property name="visible">True</property>
+- <property name="ellipsize">end</property>
+- <property name="xalign">0</property>
+- <property name="use-markup">True</property>
+- <property name="halign">start</property>
++ <property name="title" translatable="yes">Power Mode</property>
++ <property name="description" translatable="yes">Affects system performance and power usage.</property>
+ <accessibility>
+ <relation target="power_profile_listbox" type="label-for"/>
+ </accessibility>
+- </object>
+- </child>
+- <child>
+- <object class="GtkLabel">
+- <property name="visible">True</property>
+- <property name="xalign">0</property>
+- <property name="margin-bottom">6</property>
+- <property name="label" translatable="yes">Affects system performance and power usage.</property>
+- </object>
+- </child>
+- <child>
+- <object class="GtkFrame">
+- <property name="visible">True</property>
+- <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkListBox" id="power_profile_listbox">
+ <property name="visible">True</property>
+@@ -180,45 +116,19 @@
+ <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+ <signal name="row-activated" handler="power_profiles_row_activated_cb" object="CcPowerPanel" swapped="yes"/>
+ <accessibility>
+- <relation target="device_heading" type="labelled-by"/>
++ <relation target="power_profile_section" type="labelled-by"/>
+ </accessibility>
++ <style>
++ <class name="content"/>
++ </style>
+ </object>
+ </child>
+- </object>
+- </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkBox">
++ <object class="HdyPreferencesGroup" id="power_saving_section">
+ <property name="visible">True</property>
+- <property name="orientation">vertical</property>
+- <property name="margin_bottom">32</property>
+- <child>
+- <object class="GtkLabel" id="power_saving_heading">
+- <property name="visible">True</property>
+- <property name="ellipsize">end</property>
+- <property name="xalign">0</property>
+- <property name="use-markup">True</property>
+- <property name="halign">start</property>
+- <property name="margin_bottom">12</property>
+- <accessibility>
+- <relation target="power_saving_listbox" type="label-for"/>
+- </accessibility>
+- </object>
+- </child>
+- <child>
+- <object class="GtkFrame">
+- <property name="visible">True</property>
+- <property name="shadow-type">in</property>
+- <child>
+- <object class="GtkListBox" id="power_saving_listbox">
+- <property name="visible">True</property>
+- <property name="selection-mode">none</property>
+- <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+- <signal name="row-activated" handler="power_saving_listbox_row_activated_cb" object="CcPowerPanel" swapped="yes"/>
+- <accessibility>
+- <relation target="power_saving_heading" type="labelled-by"/>
+- </accessibility>
++ <property name="title" translatable="yes">Power Saving</property>
+ <child>
+ <object class="HdyActionRow" id="brightness_row">
+ <property name="visible">True</property>
+@@ -349,41 +259,12 @@
+ </child>
+ </object>
+ </child>
+- </object>
+- </child>
+- </object>
+- </child>
+ </object>
+ </child>
+ <child>
+- <object class="GtkBox" id="general_section">
++ <object class="HdyPreferencesGroup" id="general_section">
+ <property name="visible">True</property>
+- <property name="orientation">vertical</property>
+- <property name="margin-top">6</property>
+- <property name="margin-bottom">32</property>
+- <child>
+- <object class="GtkLabel" id="general_heading">
+- <property name="visible">True</property>
+- <property name="use-markup">True</property>
+- <property name="halign">start</property>
+- <property name="margin_bottom">12</property>
+- <accessibility>
+- <relation target="general_listbox" type="label-for"/>
+- </accessibility>
+- </object>
+- </child>
+- <child>
+- <object class="GtkFrame">
+- <property name="visible">True</property>
+- <property name="shadow-type">in</property>
+- <child>
+- <object class="GtkListBox" id="general_listbox">
+- <property name="visible">True</property>
+- <property name="selection-mode">none</property>
+- <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+- <accessibility>
+- <relation target="general_heading" type="labelled-by"/>
+- </accessibility>
++ <property name="title" translatable="yes">Suspend &amp; Power Button</property>
+ <child>
+ <object class="HdyComboRow" id="power_button_row">
+ <property name="visible">False</property>
+@@ -406,16 +287,8 @@
+ </child>
+ </object>
+ </child>
+- </object>
+- </child>
+- </object>
+- </child>
+ </object>
+ </child>
+- </object>
+- </child>
+- </object>
+- </child>
+ </object>
+ </child>
+ </template>
+--
+2.32.0
+
+
+From 58480754efd5fdc66db0940ce5c19abfbd2158b6 Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Thu, 7 Jan 2021 14:37:56 +0100
+Subject: [PATCH 08/33] power: Fix the indentation
+
+The indentation was purposefully left incorrect in the previous commits
+to ease the review of the actual changes, this fixes it.
+---
+ panels/power/cc-power-panel.ui | 426 ++++++++++++++++-----------------
+ 1 file changed, 213 insertions(+), 213 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index 26d6ffddc..8e999c6d5 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -57,238 +57,238 @@
+ <child>
+ <object class="HdyPreferencesPage">
+ <property name="visible">True</property>
++ <child>
++ <object class="HdyPreferencesGroup" id="battery_section">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">Battery</property>
++ <accessibility>
++ <relation target="battery_listbox" type="label-for"/>
++ </accessibility>
++ <child>
++ <object class="GtkListBox" id="battery_listbox">
++ <property name="visible">True</property>
++ <property name="selection-mode">none</property>
++ <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
++ <accessibility>
++ <relation target="battery_section" type="labelled-by"/>
++ </accessibility>
++ <style>
++ <class name="content"/>
++ </style>
++ </object>
++ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyPreferencesGroup" id="device_section">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">Devices</property>
++ <accessibility>
++ <relation target="device_listbox" type="label-for"/>
++ </accessibility>
++ <child>
++ <object class="GtkListBox" id="device_listbox">
++ <property name="visible">True</property>
++ <property name="selection-mode">none</property>
++ <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
++ <accessibility>
++ <relation target="device_section" type="labelled-by"/>
++ </accessibility>
++ <style>
++ <class name="content"/>
++ </style>
++ </object>
++ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyPreferencesGroup" id="power_profile_section">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">Power Mode</property>
++ <property name="description" translatable="yes">Affects system performance and power usage.</property>
++ <accessibility>
++ <relation target="power_profile_listbox" type="label-for"/>
++ </accessibility>
++ <child>
++ <object class="GtkListBox" id="power_profile_listbox">
++ <property name="visible">True</property>
++ <property name="selection-mode">none</property>
++ <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
++ <signal name="row-activated" handler="power_profiles_row_activated_cb" object="CcPowerPanel" swapped="yes"/>
++ <accessibility>
++ <relation target="power_profile_section" type="labelled-by"/>
++ </accessibility>
++ <style>
++ <class name="content"/>
++ </style>
++ </object>
++ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyPreferencesGroup" id="power_saving_section">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">Power Saving</property>
++ <child>
++ <object class="HdyActionRow" id="brightness_row">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">_Screen Brightness</property>
++ <property name="use_underline">True</property>
+ <child>
+- <object class="HdyPreferencesGroup" id="battery_section">
++ <object class="CcBrightnessScale" id="brightness_scale">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">Battery</property>
+- <accessibility>
+- <relation target="battery_listbox" type="label-for"/>
+- </accessibility>
+- <child>
+- <object class="GtkListBox" id="battery_listbox">
+- <property name="visible">True</property>
+- <property name="selection-mode">none</property>
+- <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+- <accessibility>
+- <relation target="battery_section" type="labelled-by"/>
+- </accessibility>
+- <style>
+- <class name="content"/>
+- </style>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <property name="expand">True</property>
++ <property name="device">screen</property>
++ <signal name="notify::has-brightness" handler="has_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="als_row">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">Automatic Brightness</property>
+ <child>
+- <object class="HdyPreferencesGroup" id="device_section">
++ <object class="GtkSwitch" id="als_switch">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">Devices</property>
+- <accessibility>
+- <relation target="device_listbox" type="label-for"/>
+- </accessibility>
+- <child>
+- <object class="GtkListBox" id="device_listbox">
+- <property name="visible">True</property>
+- <property name="selection-mode">none</property>
+- <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+- <accessibility>
+- <relation target="device_section" type="labelled-by"/>
+- </accessibility>
+- <style>
+- <class name="content"/>
+- </style>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="als_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="kbd_brightness_row">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">_Keyboard Brightness</property>
++ <property name="use_underline">True</property>
+ <child>
+- <object class="HdyPreferencesGroup" id="power_profile_section">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">Power Mode</property>
+- <property name="description" translatable="yes">Affects system performance and power usage.</property>
+- <accessibility>
+- <relation target="power_profile_listbox" type="label-for"/>
+- </accessibility>
+- <child>
+- <object class="GtkListBox" id="power_profile_listbox">
+- <property name="visible">True</property>
+- <property name="selection-mode">none</property>
+- <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
+- <signal name="row-activated" handler="power_profiles_row_activated_cb" object="CcPowerPanel" swapped="yes"/>
+- <accessibility>
+- <relation target="power_profile_section" type="labelled-by"/>
+- </accessibility>
+- <style>
+- <class name="content"/>
+- </style>
+- </object>
+- </child>
++ <object class="CcBrightnessScale" id="kbd_brightness_scale">
++ <property name="visible">True</property>
++ <property name="valign">center</property>
++ <property name="expand">True</property>
++ <property name="device">kbd</property>
++ <signal name="notify::has-brightness" handler="has_kbd_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="dim_screen_row">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">Dim Screen When Inactive</property>
++ <property name="activatable_widget">dim_screen_switch</property>
+ <child>
+- <object class="HdyPreferencesGroup" id="power_saving_section">
++ <object class="GtkSwitch" id="dim_screen_switch">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">Power Saving</property>
+- <child>
+- <object class="HdyActionRow" id="brightness_row">
+- <property name="visible">True</property>
+- <property name="title" translatable="yes">_Screen Brightness</property>
+- <property name="use_underline">True</property>
+- <child>
+- <object class="CcBrightnessScale" id="brightness_scale">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <property name="device">screen</property>
+- <signal name="notify::has-brightness" handler="has_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="als_row">
+- <property name="visible">True</property>
+- <property name="title" translatable="yes">Automatic Brightness</property>
+- <child>
+- <object class="GtkSwitch" id="als_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="als_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="kbd_brightness_row">
+- <property name="visible">True</property>
+- <property name="title" translatable="yes">_Keyboard Brightness</property>
+- <property name="use_underline">True</property>
+- <child>
+- <object class="CcBrightnessScale" id="kbd_brightness_scale">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <property name="device">kbd</property>
+- <signal name="notify::has-brightness" handler="has_kbd_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="dim_screen_row">
+- <property name="visible">True</property>
+- <property name="title" translatable="yes">Dim Screen When Inactive</property>
+- <property name="activatable_widget">dim_screen_switch</property>
+- <child>
+- <object class="GtkSwitch" id="dim_screen_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyComboRow" id="blank_screen_row">
+- <property name="visible">True</property>
+- <property name="title" translatable="yes">_Blank Screen</property>
+- <property name="use_underline">True</property>
+- <signal name="notify::selected-index" handler="blank_screen_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="automatic_suspend_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">_Automatic Suspend</property>
+- <property name="use_underline">True</property>
+- <property name="activatable">True</property>
+- <signal name="activated" handler="automatic_suspend_row_activated_cb" swapped="yes"/>
+- <child>
+- <object class="GtkLabel" id="automatic_suspend_label">
+- <property name="visible">True</property>
+- <property name="halign">end</property>
+- <signal name="mnemonic-activate" handler="automatic_suspend_label_mnemonic_activate_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="wifi_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">_Wi-Fi</property>
+- <property name="subtitle" translatable="yes">Wi-Fi can be turned off to save power.</property>
+- <property name="use_underline">True</property>
+- <property name="activatable_widget">wifi_switch</property>
+- <child>
+- <object class="GtkSwitch" id="wifi_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="wifi_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="mobile_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">_Mobile Broadband</property>
+- <property name="subtitle" translatable="yes">Mobile broadband (LTE, 4G, 3G, etc.) can be turned off to save power.</property>
+- <property name="use_underline">True</property>
+- <property name="activatable_widget">mobile_switch</property>
+- <child>
+- <object class="GtkSwitch" id="mobile_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="mobile_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="bt_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">_Bluetooth</property>
+- <property name="subtitle" translatable="yes">Bluetooth can be turned off to save power.</property>
+- <property name="use_underline">True</property>
+- <property name="activatable_widget">bt_switch</property>
+- <child>
+- <object class="GtkSwitch" id="bt_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="bt_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
++ <property name="valign">center</property>
+ </object>
+ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyComboRow" id="blank_screen_row">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">_Blank Screen</property>
++ <property name="use_underline">True</property>
++ <signal name="notify::selected-index" handler="blank_screen_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="automatic_suspend_row">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">_Automatic Suspend</property>
++ <property name="use_underline">True</property>
++ <property name="activatable">True</property>
++ <signal name="activated" handler="automatic_suspend_row_activated_cb" swapped="yes"/>
++ <child>
++ <object class="GtkLabel" id="automatic_suspend_label">
++ <property name="visible">True</property>
++ <property name="halign">end</property>
++ <signal name="mnemonic-activate" handler="automatic_suspend_label_mnemonic_activate_cb" object="CcPowerPanel" swapped="yes"/>
++ </object>
++ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="wifi_row">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">_Wi-Fi</property>
++ <property name="subtitle" translatable="yes">Wi-Fi can be turned off to save power.</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">wifi_switch</property>
++ <child>
++ <object class="GtkSwitch" id="wifi_switch">
++ <property name="visible">True</property>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="wifi_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
++ </object>
++ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="mobile_row">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">_Mobile Broadband</property>
++ <property name="subtitle" translatable="yes">Mobile broadband (LTE, 4G, 3G, etc.) can be turned off to save power.</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">mobile_switch</property>
++ <child>
++ <object class="GtkSwitch" id="mobile_switch">
++ <property name="visible">True</property>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="mobile_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
++ </object>
++ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="bt_row">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">_Bluetooth</property>
++ <property name="subtitle" translatable="yes">Bluetooth can be turned off to save power.</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">bt_switch</property>
+ <child>
+- <object class="HdyPreferencesGroup" id="general_section">
++ <object class="GtkSwitch" id="bt_switch">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">Suspend &amp; Power Button</property>
+- <child>
+- <object class="HdyComboRow" id="power_button_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">Po_wer Button Behavior</property>
+- <property name="use_underline">True</property>
+- <signal name="notify::selected-index" handler="power_button_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="battery_percentage_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">Show Battery _Percentage</property>
+- <property name="use_underline">True</property>
+- <property name="activatable_widget">battery_percentage_switch</property>
+- <child>
+- <object class="GtkSwitch" id="battery_percentage_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- </object>
+- </child>
+- </object>
+- </child>
++ <property name="valign">center</property>
++ <signal name="notify::active" handler="bt_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
++ </object>
++ </child>
++ </object>
++ </child>
++ <child>
++ <object class="HdyPreferencesGroup" id="general_section">
++ <property name="visible">True</property>
++ <property name="title" translatable="yes">Suspend &amp; Power Button</property>
++ <child>
++ <object class="HdyComboRow" id="power_button_row">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">Po_wer Button Behavior</property>
++ <property name="use_underline">True</property>
++ <signal name="notify::selected-index" handler="power_button_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
++ </object>
++ </child>
++ <child>
++ <object class="HdyActionRow" id="battery_percentage_row">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">Show Battery _Percentage</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">battery_percentage_switch</property>
++ <child>
++ <object class="GtkSwitch" id="battery_percentage_switch">
++ <property name="visible">True</property>
++ <property name="valign">center</property>
++ </object>
++ </child>
++ </object>
++ </child>
++ </object>
++ </child>
+ </object>
+ </child>
+ </template>
+--
+2.32.0
+
+
+From 036545ebc5b3deba1d4bb4ac82dc102413804e83 Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Fri, 8 Jan 2021 16:29:18 +0100
+Subject: [PATCH 09/33] power: Hide the icon of the battery row when unused
+
+This gives more room to the label.
+---
+ panels/power/cc-battery-row.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/panels/power/cc-battery-row.c b/panels/power/cc-battery-row.c
+index 55d7584d7..f6faca0c1 100644
+--- a/panels/power/cc-battery-row.c
++++ b/panels/power/cc-battery-row.c
+@@ -275,7 +275,12 @@ cc_battery_row_new (UpDevice *device,
+
+ /* Icon */
+ if (is_kind_battery && icon_name != NULL && icon_name[0] != '\0')
+- gtk_image_set_from_icon_name (self->icon, icon_name, GTK_ICON_SIZE_BUTTON);
++ {
++ gtk_image_set_from_icon_name (self->icon, icon_name, GTK_ICON_SIZE_BUTTON);
++ gtk_widget_show (GTK_WIDGET (self->icon));
++ }
++ else
++ gtk_widget_hide (GTK_WIDGET (self->icon));
+
+ /* Percentage label */
+ if (battery_level == UP_DEVICE_LEVEL_NONE)
+@@ -347,4 +352,4 @@ UpDeviceKind
+ cc_battery_row_get_kind (CcBatteryRow *self)
+ {
+ return self->kind;
+-}
+\ No newline at end of file
++}
+--
+2.32.0
+
+
+From c4849778de730f37618120dbdd37f30515ecc77a Mon Sep 17 00:00:00 2001
+From: Adrien Plazas <kekun.plazas@laposte.net>
+Date: Fri, 8 Jan 2021 16:30:12 +0100
+Subject: [PATCH 10/33] power: Ellipsize the labels of the battery row
+
+This helps the window fit any size, including the narrow one of phones.
+---
+ panels/power/cc-battery-row.ui | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/panels/power/cc-battery-row.ui b/panels/power/cc-battery-row.ui
+index 932e5d39f..dec97a9fe 100644
+--- a/panels/power/cc-battery-row.ui
++++ b/panels/power/cc-battery-row.ui
+@@ -28,6 +28,8 @@
+ <child>
+ <object class="GtkLabel" id="name_label">
+ <property name="visible">True</property>
++ <property name="ellipsize">end</property>
++ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+@@ -79,6 +81,8 @@
+ <child>
+ <object class="GtkLabel" id="details_label">
+ <property name="visible">True</property>
++ <property name="ellipsize">end</property>
++ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+--
+2.32.0
+
+
+From 33d672d634a9e1d8a2cfa74dc4d503fb6f170ea1 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 15 Jul 2021 13:08:05 +0200
+Subject: [PATCH 11/33] power: Fix keynav not working
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+gnome-control-center/panels/power/cc-power-panel.c: In function ‘keynav_failed_cb’:
+gnome-control-center/panels/power/cc-power-panel.c:892:50: warning: statement with no effect [-Wunused-value]
+ 892 | direction == GTK_DIR_UP ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD;
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
+---
+ panels/power/cc-power-panel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 96558c778..d31d16d22 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -888,7 +888,7 @@ keynav_failed_cb (CcPowerPanel *self, GtkDirectionType direction, GtkWidget *lis
+ if (direction != GTK_DIR_UP && direction != GTK_DIR_DOWN)
+ return FALSE;
+
+- direction == GTK_DIR_UP ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD;
++ direction = GTK_DIR_UP ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD;
+
+ return gtk_widget_child_focus (GTK_WIDGET (self), direction);
+ }
+--
+2.32.0
+
+
+From 35b621ce5191461b16eefcb5e677496c0c48638c Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 15 Jul 2021 13:46:19 +0200
+Subject: [PATCH 12/33] power: Simplify emptying listbox
+
+We do that in a few places.
+---
+ panels/power/cc-power-panel.c | 22 +++++++++++++---------
+ 1 file changed, 13 insertions(+), 9 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index d31d16d22..5d57afe59 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -242,25 +242,29 @@ add_device (CcPowerPanel *self, UpDevice *device)
+ }
+
+ static void
+-up_client_changed (CcPowerPanel *self)
++empty_listbox (GtkListBox *listbox)
+ {
+- g_autoptr(GList) battery_children = NULL;
+- g_autoptr(GList) device_children = NULL;
++ g_autoptr(GList) children = NULL;
+ GList *l;
++
++ children = gtk_container_get_children (GTK_CONTAINER (listbox));
++ for (l = children; l != NULL; l = l->next)
++ gtk_container_remove (GTK_CONTAINER (listbox), l->data);
++}
++
++static void
++up_client_changed (CcPowerPanel *self)
++{
+ gint i;
+ UpDeviceKind kind;
+ guint n_batteries;
+ gboolean on_ups;
+ g_autoptr(UpDevice) composite = NULL;
+
+- battery_children = gtk_container_get_children (GTK_CONTAINER (self->battery_listbox));
+- for (l = battery_children; l != NULL; l = l->next)
+- gtk_container_remove (GTK_CONTAINER (self->battery_listbox), l->data);
++ empty_listbox (self->battery_listbox);
+ gtk_widget_hide (GTK_WIDGET (self->battery_section));
+
+- device_children = gtk_container_get_children (GTK_CONTAINER (self->device_listbox));
+- for (l = device_children; l != NULL; l = l->next)
+- gtk_container_remove (GTK_CONTAINER (self->device_listbox), l->data);
++ empty_listbox (self->device_listbox);
+ gtk_widget_hide (GTK_WIDGET (self->device_section));
+
+ #ifdef TEST_FAKE_DEVICES
+--
+2.32.0
+
+
+From 7915830b4d8b691f4def35c83c06a658f5b14ac1 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 15 Jul 2021 14:39:58 +0200
+Subject: [PATCH 13/33] power: Add new power profile info row widget
+
+---
+ panels/power/cc-power-panel.c | 1 +
+ panels/power/cc-power-profile-info-row.c | 67 ++++++++++
+ panels/power/cc-power-profile-info-row.h | 36 ++++++
+ panels/power/cc-power-profile-info-row.ui | 44 +++++++
+ panels/power/icons/info-symbolic.svg | 150 ++++++++++++++++++++++
+ panels/power/icons/meson.build | 5 +
+ panels/power/meson.build | 1 +
+ panels/power/power.gresource.xml | 1 +
+ 8 files changed, 305 insertions(+)
+ create mode 100644 panels/power/cc-power-profile-info-row.c
+ create mode 100644 panels/power/cc-power-profile-info-row.h
+ create mode 100644 panels/power/cc-power-profile-info-row.ui
+ create mode 100644 panels/power/icons/info-symbolic.svg
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 5d57afe59..8acf62dee 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -35,6 +35,7 @@
+ #include "cc-battery-row.h"
+ #include "cc-brightness-scale.h"
+ #include "cc-power-profile-row.h"
++#include "cc-power-profile-info-row.h"
+ #include "cc-power-panel.h"
+ #include "cc-power-resources.h"
+ #include "cc-util.h"
+diff --git a/panels/power/cc-power-profile-info-row.c b/panels/power/cc-power-profile-info-row.c
+new file mode 100644
+index 000000000..92bb78834
+--- /dev/null
++++ b/panels/power/cc-power-profile-info-row.c
+@@ -0,0 +1,67 @@
++/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* cc-list-row.c
++ *
++ * Copyright 2020 Red Hat Inc.
++ *
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see <http://www.gnu.org/licenses/>.
++ *
++ * Author(s):
++ * Bastien Nocera <hadess@hadess.net>
++ *
++ * SPDX-License-Identifier: GPL-3.0-or-later
++ */
++
++#undef G_LOG_DOMAIN
++#define G_LOG_DOMAIN "cc-power-profile-info-row"
++
++#include <config.h>
++
++#include <glib/gi18n.h>
++#include "cc-power-profile-info-row.h"
++
++struct _CcPowerProfileInfoRow
++{
++ GtkListBoxRow parent_instance;
++
++ GtkLabel *title_label;
++};
++
++G_DEFINE_TYPE (CcPowerProfileInfoRow, cc_power_profile_info_row, GTK_TYPE_LIST_BOX_ROW)
++
++static void
++cc_power_profile_info_row_class_init (CcPowerProfileInfoRowClass *klass)
++{
++ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
++
++ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/power/cc-power-profile-info-row.ui");
++
++ gtk_widget_class_bind_template_child (widget_class, CcPowerProfileInfoRow, title_label);
++}
++
++static void
++cc_power_profile_info_row_init (CcPowerProfileInfoRow *self)
++{
++ gtk_widget_init_template (GTK_WIDGET (self));
++}
++
++CcPowerProfileInfoRow *
++cc_power_profile_info_row_new (const char *text)
++{
++ CcPowerProfileInfoRow *self;
++
++ self = g_object_new (CC_TYPE_POWER_PROFILE_INFO_ROW, NULL);
++ gtk_label_set_markup (self->title_label, text);
++
++ return self;
++}
+diff --git a/panels/power/cc-power-profile-info-row.h b/panels/power/cc-power-profile-info-row.h
+new file mode 100644
+index 000000000..52d055ab2
+--- /dev/null
++++ b/panels/power/cc-power-profile-info-row.h
+@@ -0,0 +1,36 @@
++/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* cc-list-row.h
++ *
++ * Copyright 2020 Red Hat Inc
++ *
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see <http://www.gnu.org/licenses/>.
++ *
++ * Author(s):
++ * Bastien Nocera <hadess@hadess.net>
++ *
++ * SPDX-License-Identifier: GPL-3.0-or-later
++ */
++
++#pragma once
++
++#include <gtk/gtk.h>
++
++G_BEGIN_DECLS
++
++#define CC_TYPE_POWER_PROFILE_INFO_ROW (cc_power_profile_info_row_get_type())
++G_DECLARE_FINAL_TYPE (CcPowerProfileInfoRow, cc_power_profile_info_row, CC, POWER_PROFILE_INFO_ROW, GtkListBoxRow)
++
++CcPowerProfileInfoRow *cc_power_profile_info_row_new (const char *text);
++
++G_END_DECLS
+diff --git a/panels/power/cc-power-profile-info-row.ui b/panels/power/cc-power-profile-info-row.ui
+new file mode 100644
+index 000000000..d9291ff16
+--- /dev/null
++++ b/panels/power/cc-power-profile-info-row.ui
+@@ -0,0 +1,44 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<interface>
++ <!-- interface-requires gtk+ 3.0 -->
++ <template class="CcPowerProfileInfoRow" parent="GtkListBoxRow">
++ <property name="activatable">False</property>
++ <property name="selectable">False</property>
++ <child>
++ <object class="GtkBox">
++ <property name="visible">True</property>
++ <property name="orientation">horizontal</property>
++ <property name="margin-start">12</property>
++ <property name="margin-end">12</property>
++ <property name="margin-top">8</property>
++ <property name="margin-bottom">8</property>
++ <property name="spacing">12</property>
++ <child>
++ <object class="GtkImage" id="icon_image">
++ <property name="visible">True</property>
++ <property name="margin-start">6</property>
++ <property name="margin-end">18</property>
++ <property name="icon-name">info-symbolic</property>
++ <property name="icon-size">5</property>
++ <style>
++ <class name="power-profile"/>
++ </style>
++ </object>
++ </child>
++ <child>
++ <object class="GtkLabel" id="title_label">
++ <property name="visible">True</property>
++ <property name="halign">start</property>
++ <property name="expand">True</property>
++ <property name="use-markup">True</property>
++ <property name="use-underline">True</property>
++ <property name="xalign">0</property>
++ <property name="yalign">0.5</property>
++ <property name="margin-end">6</property>
++ <property name="wrap">True</property>
++ </object>
++ </child>
++ </object>
++ </child>
++ </template>
++</interface>
+diff --git a/panels/power/icons/info-symbolic.svg b/panels/power/icons/info-symbolic.svg
+new file mode 100644
+index 000000000..502a98a50
+--- /dev/null
++++ b/panels/power/icons/info-symbolic.svg
+@@ -0,0 +1,150 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
++ <filter id="a" height="100%" width="100%" x="0%" y="0%">
++ <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
++ </filter>
++ <mask id="b">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.3"/>
++ </g>
++ </mask>
++ <clipPath id="c">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="d">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.05"/>
++ </g>
++ </mask>
++ <clipPath id="e">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="f">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.05"/>
++ </g>
++ </mask>
++ <clipPath id="g">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="h">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.05"/>
++ </g>
++ </mask>
++ <clipPath id="i">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="j">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.05"/>
++ </g>
++ </mask>
++ <clipPath id="k">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="l">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.05"/>
++ </g>
++ </mask>
++ <clipPath id="m">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="n">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.05"/>
++ </g>
++ </mask>
++ <clipPath id="o">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="p">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.3"/>
++ </g>
++ </mask>
++ <clipPath id="q">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="r">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.5"/>
++ </g>
++ </mask>
++ <clipPath id="s">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="t">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.4"/>
++ </g>
++ </mask>
++ <clipPath id="u">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="v">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.4"/>
++ </g>
++ </mask>
++ <clipPath id="w">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="x">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.5"/>
++ </g>
++ </mask>
++ <clipPath id="y">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <mask id="z">
++ <g filter="url(#a)">
++ <path d="m 0 0 h 16 v 16 h -16 z" fill-opacity="0.5"/>
++ </g>
++ </mask>
++ <clipPath id="A">
++ <path d="m 0 0 h 1024 v 800 h -1024 z"/>
++ </clipPath>
++ <g clip-path="url(#c)" mask="url(#b)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 562.460938 212.058594 h 10.449218 c -1.183594 0.492187 -1.296875 2.460937 0 3 h -10.449218 z m 0 0" fill="#2e3436"/>
++ </g>
++ <path d="m 7.90625 1 c -3.828125 0.050781 -6.90625 3.171875 -6.90625 7 c 0 3.867188 3.132812 7 7 7 s 7 -3.132812 7 -7 s -3.132812 -7 -7 -7 c -0.03125 0 -0.0625 0 -0.09375 0 z m -0.40625 3 h 1 c 0.277344 0 0.5 0.222656 0.5 0.5 v 1 c 0 0.277344 -0.222656 0.5 -0.5 0.5 h -1 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 v -1 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m -0.5 3 h 2 v 5 h -2 z m 0 0" fill="#2e3436"/>
++ <g clip-path="url(#e)" mask="url(#d)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 16 632 h 1 v 1 h -1 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
++ </g>
++ <g clip-path="url(#g)" mask="url(#f)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 17 631 h 1 v 1 h -1 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
++ </g>
++ <g clip-path="url(#i)" mask="url(#h)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 18 634 h 1 v 1 h -1 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
++ </g>
++ <g clip-path="url(#k)" mask="url(#j)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 16 634 h 1 v 1 h -1 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
++ </g>
++ <g clip-path="url(#m)" mask="url(#l)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 17 635 h 1 v 1 h -1 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
++ </g>
++ <g clip-path="url(#o)" mask="url(#n)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 19 635 h 1 v 1 h -1 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
++ </g>
++ <g clip-path="url(#q)" mask="url(#p)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 136 660 v 7 h 7 v -7 z m 0 0" fill="#2e3436"/>
++ </g>
++ <g clip-path="url(#s)" mask="url(#r)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 199 642 h 3 v 12 h -3 z m 0 0" fill="#2e3436"/>
++ </g>
++ <g clip-path="url(#u)" mask="url(#t)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 209.5 144.160156 c 0.277344 0 0.5 0.222656 0.5 0.5 v 1 c 0 0.277344 -0.222656 0.5 -0.5 0.5 s -0.5 -0.222656 -0.5 -0.5 v -1 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0" fill="#2e3436"/>
++ </g>
++ <g clip-path="url(#w)" mask="url(#v)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 206.5 144.160156 c 0.277344 0 0.5 0.222656 0.5 0.5 v 1 c 0 0.277344 -0.222656 0.5 -0.5 0.5 s -0.5 -0.222656 -0.5 -0.5 v -1 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0" fill="#2e3436"/>
++ </g>
++ <g clip-path="url(#y)" mask="url(#x)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 229.5 143.160156 c -0.546875 0 -1 0.457032 -1 1 c 0 0.546875 0.453125 1 1 1 s 1 -0.453125 1 -1 c 0 -0.542968 -0.453125 -1 -1 -1 z m 0 0" fill="#2e3436"/>
++ </g>
++ <g clip-path="url(#A)" mask="url(#z)" transform="matrix(1 0 0 1 -660 -222)">
++ <path d="m 226.453125 143.160156 c -0.519531 0 -0.953125 0.433594 -0.953125 0.953125 v 0.09375 c 0 0.519531 0.433594 0.953125 0.953125 0.953125 h 0.09375 c 0.519531 0 0.953125 -0.433594 0.953125 -0.953125 v -0.09375 c 0 -0.519531 -0.433594 -0.953125 -0.953125 -0.953125 z m 0 0" fill="#2e3436"/>
++ </g>
++</svg>
+diff --git a/panels/power/icons/meson.build b/panels/power/icons/meson.build
+index 8165371ea..c56bc65b7 100644
+--- a/panels/power/icons/meson.build
++++ b/panels/power/icons/meson.build
+@@ -13,3 +13,8 @@ foreach icon_size: icon_sizes
+ install_dir: join_paths(control_center_icondir, 'hicolor', icon_size, 'apps')
+ )
+ endforeach
++
++install_data(
++ 'info-symbolic.svg',
++ install_dir: join_paths(control_center_icondir, 'hicolor', 'scalable', 'status')
++)
+diff --git a/panels/power/meson.build b/panels/power/meson.build
+index 625059dd2..af04b98ed 100644
+--- a/panels/power/meson.build
++++ b/panels/power/meson.build
+@@ -22,6 +22,7 @@ sources = files(
+ 'cc-brightness-scale.c',
+ 'cc-power-panel.c',
+ 'cc-power-profile-row.c',
++ 'cc-power-profile-info-row.c'
+ )
+
+ sources += gnome.mkenums_simple(
+diff --git a/panels/power/power.gresource.xml b/panels/power/power.gresource.xml
+index 31e92b415..5a33c8e60 100644
+--- a/panels/power/power.gresource.xml
++++ b/panels/power/power.gresource.xml
+@@ -4,6 +4,7 @@
+ <file preprocess="xml-stripblanks">cc-battery-row.ui</file>
+ <file preprocess="xml-stripblanks">cc-power-panel.ui</file>
+ <file preprocess="xml-stripblanks">cc-power-profile-row.ui</file>
++ <file preprocess="xml-stripblanks">cc-power-profile-info-row.ui</file>
+ <file>battery-levels.css</file>
+ <file>power-profiles.css</file>
+ </gresource>
+--
+2.32.0
+
+
+From 1a80fda8cdbd2226a5663f0fa572dd72210722a6 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Fri, 2 Apr 2021 13:10:19 +0200
+Subject: [PATCH 14/33] power: Handle new power-profiles-daemon API
+
+Handle the new PerformanceDegraded property to replace
+PerformanceInhibited.
+---
+ panels/power/cc-power-panel.c | 53 +++++++++++++++++++++++++++++++---
+ panels/power/cc-power-panel.ui | 11 +++++++
+ 2 files changed, 60 insertions(+), 4 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 8acf62dee..51196a8c4 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -89,6 +89,7 @@ struct _CcPowerPanel
+ GtkSwitch *mobile_switch;
+ HdyComboRow *power_button_row;
+ GtkListBox *power_profile_listbox;
++ GtkListBox *power_profile_info_listbox;
+ HdyPreferencesGroup *power_profile_section;
+ GtkSizeGroup *row_sizegroup;
+ GtkComboBox *suspend_on_battery_delay_combo;
+@@ -119,6 +120,7 @@ struct _CcPowerPanel
+ guint power_profiles_prop_id;
+ CcPowerProfileRow *power_profiles_row[NUM_CC_POWER_PROFILES];
+ gboolean power_profiles_in_update;
++ gboolean has_performance_degraded;
+
+ #ifdef HAVE_NETWORK_MANAGER
+ NMClient *nm_client;
+@@ -1365,6 +1367,37 @@ performance_profile_set_inhibited (CcPowerPanel *self,
+ cc_power_profile_row_set_performance_inhibited (row, performance_inhibited);
+ }
+
++static void
++performance_profile_set_degraded (CcPowerPanel *self)
++{
++ g_autoptr(GVariant) variant = NULL;
++ const char *degraded, *text;
++ CcPowerProfileInfoRow *row;
++
++ empty_listbox (self->power_profile_info_listbox);
++ gtk_widget_hide (GTK_WIDGET (self->power_profile_info_listbox));
++
++ variant = g_dbus_proxy_get_cached_property (self->power_profiles_proxy, "PerformanceDegraded");
++ if (!variant)
++ return;
++ degraded = g_variant_get_string (variant, NULL);
++ if (*degraded == '\0')
++ return;
++
++ gtk_widget_show (GTK_WIDGET (self->power_profile_info_listbox));
++
++ if (g_str_equal (degraded, "high-operating-temperature"))
++ text = _("Performance mode temporarily disabled due to high operating temperature.");
++ else if (g_str_equal (degraded, "lap-detected"))
++ text = _("Lap detected: performance mode temporarily disabled. Move the device to a stable surface to restore.");
++ else
++ text = _("Performance mode temporarily disabled.");
++
++ row = cc_power_profile_info_row_new (text);
++ gtk_widget_show (GTK_WIDGET (row));
++ gtk_container_add (GTK_CONTAINER (self->power_profile_info_listbox), GTK_WIDGET (row));
++}
++
+ static void
+ power_profiles_row_activated_cb (GtkListBox *box,
+ GtkListBoxRow *box_row,
+@@ -1420,8 +1453,13 @@ power_profiles_properties_changed_cb (CcPowerPanel *self,
+ {
+ if (g_strcmp0 (key, "PerformanceInhibited") == 0)
+ {
+- performance_profile_set_inhibited (self,
+- g_variant_get_string (value, NULL));
++ if (!self->has_performance_degraded)
++ performance_profile_set_inhibited (self,
++ g_variant_get_string (value, NULL));
++ }
++ else if (g_strcmp0 (key, "PerformanceDegraded") == 0)
++ {
++ performance_profile_set_degraded (self);
+ }
+ else if (g_strcmp0 (key, "ActiveProfile") == 0)
+ {
+@@ -1504,7 +1542,8 @@ setup_power_profiles (CcPowerPanel *self)
+ g_autoptr(GVariant) props = NULL;
+ guint i, num_children;
+ g_autoptr(GError) error = NULL;
+- const char *performance_inhibited;
++ const char *performance_inhibited = NULL;
++ const char *performance_degraded;
+ const char *active_profile;
+ g_autoptr(GVariant) profiles = NULL;
+ GtkRadioButton *last_button;
+@@ -1557,7 +1596,12 @@ setup_power_profiles (CcPowerPanel *self)
+ gtk_widget_show (GTK_WIDGET (self->power_profile_section));
+
+ props = g_variant_get_child_value (variant, 0);
+- performance_inhibited = variant_lookup_string (props, "PerformanceInhibited");
++ performance_degraded = variant_lookup_string (props, "PerformanceDegraded");
++ self->has_performance_degraded = performance_degraded != NULL;
++ if (performance_degraded == NULL)
++ performance_inhibited = variant_lookup_string (props, "PerformanceInhibited");
++ else
++ performance_profile_set_degraded (self);
+ active_profile = variant_lookup_string (props, "ActiveProfile");
+
+ last_button = NULL;
+@@ -1715,6 +1759,7 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_listbox);
++ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_info_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_section);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, row_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_battery_delay_combo);
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index 8e999c6d5..d8283c556 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -123,6 +123,17 @@
+ </style>
+ </object>
+ </child>
++ <child>
++ <object class="GtkListBox" id="power_profile_info_listbox">
++ <property name="visible">False</property>
++ <property name="selection-mode">none</property>
++ <property name="margin_top">12</property>
++ <signal name="keynav-failed" handler="keynav_failed_cb" object="CcPowerPanel" swapped="yes"/>
++ <style>
++ <class name="content"/>
++ </style>
++ </object>
++ </child>
+ </object>
+ </child>
+ <child>
+--
+2.32.0
+
+
+From 7254da88faa5cebd43db735746eb20b2b548a462 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Fri, 16 Jul 2021 10:00:12 +0200
+Subject: [PATCH 15/33] power: Prepare for adding more power profile info boxes
+
+Rename and re-indent the code that adds the power profile info boxes to
+prepare for adding more info boxes when needed.
+---
+ panels/power/cc-power-panel.c | 46 ++++++++++++++++++-----------------
+ 1 file changed, 24 insertions(+), 22 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 51196a8c4..1869be065 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -1368,34 +1368,35 @@ performance_profile_set_inhibited (CcPowerPanel *self,
+ }
+
+ static void
+-performance_profile_set_degraded (CcPowerPanel *self)
++power_profile_update_info_boxes (CcPowerPanel *self)
+ {
+- g_autoptr(GVariant) variant = NULL;
+- const char *degraded, *text;
++ g_autoptr(GVariant) degraded_variant = NULL;
++ const char *degraded = NULL;
+ CcPowerProfileInfoRow *row;
+
+ empty_listbox (self->power_profile_info_listbox);
+ gtk_widget_hide (GTK_WIDGET (self->power_profile_info_listbox));
+
+- variant = g_dbus_proxy_get_cached_property (self->power_profiles_proxy, "PerformanceDegraded");
+- if (!variant)
+- return;
+- degraded = g_variant_get_string (variant, NULL);
+- if (*degraded == '\0')
+- return;
++ degraded_variant = g_dbus_proxy_get_cached_property (self->power_profiles_proxy, "PerformanceDegraded");
++ if (degraded_variant)
++ degraded = g_variant_get_string (degraded_variant, NULL);
++ if (degraded && *degraded != '\0')
++ {
++ const char *text;
+
+- gtk_widget_show (GTK_WIDGET (self->power_profile_info_listbox));
++ gtk_widget_show (GTK_WIDGET (self->power_profile_info_listbox));
+
+- if (g_str_equal (degraded, "high-operating-temperature"))
+- text = _("Performance mode temporarily disabled due to high operating temperature.");
+- else if (g_str_equal (degraded, "lap-detected"))
+- text = _("Lap detected: performance mode temporarily disabled. Move the device to a stable surface to restore.");
+- else
+- text = _("Performance mode temporarily disabled.");
++ if (g_str_equal (degraded, "high-operating-temperature"))
++ text = _("Performance mode temporarily disabled due to high operating temperature.");
++ else if (g_str_equal (degraded, "lap-detected"))
++ text = _("Lap detected: performance mode temporarily disabled. Move the device to a stable surface to restore.");
++ else
++ text = _("Performance mode temporarily disabled.");
+
+- row = cc_power_profile_info_row_new (text);
+- gtk_widget_show (GTK_WIDGET (row));
+- gtk_container_add (GTK_CONTAINER (self->power_profile_info_listbox), GTK_WIDGET (row));
++ row = cc_power_profile_info_row_new (text);
++ gtk_widget_show (GTK_WIDGET (row));
++ gtk_container_add (GTK_CONTAINER (self->power_profile_info_listbox), GTK_WIDGET (row));
++ }
+ }
+
+ static void
+@@ -1459,7 +1460,7 @@ power_profiles_properties_changed_cb (CcPowerPanel *self,
+ }
+ else if (g_strcmp0 (key, "PerformanceDegraded") == 0)
+ {
+- performance_profile_set_degraded (self);
++ power_profile_update_info_boxes (self);
+ }
+ else if (g_strcmp0 (key, "ActiveProfile") == 0)
+ {
+@@ -1600,8 +1601,6 @@ setup_power_profiles (CcPowerPanel *self)
+ self->has_performance_degraded = performance_degraded != NULL;
+ if (performance_degraded == NULL)
+ performance_inhibited = variant_lookup_string (props, "PerformanceInhibited");
+- else
+- performance_profile_set_degraded (self);
+ active_profile = variant_lookup_string (props, "ActiveProfile");
+
+ last_button = NULL;
+@@ -1649,6 +1648,9 @@ setup_power_profiles (CcPowerPanel *self)
+
+ self->power_profiles_prop_id = g_signal_connect_object (G_OBJECT (self->power_profiles_proxy), "g-properties-changed",
+ G_CALLBACK (power_profiles_properties_changed_cb), self, G_CONNECT_SWAPPED);
++
++ if (self->has_performance_degraded)
++ power_profile_update_info_boxes (self);
+ }
+
+ static void
+--
+2.32.0
+
+
+From 173904b7eeea145c38065939a1dd8a408745f3c9 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Fri, 16 Jul 2021 10:07:28 +0200
+Subject: [PATCH 16/33] power: Move variant_lookup_string() helper function
+
+---
+ panels/power/cc-power-panel.c | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 1869be065..4633627c2 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -1343,6 +1343,18 @@ setup_power_saving (CcPowerPanel *self)
+ #endif
+ }
+
++static const char *
++variant_lookup_string (GVariant *dict,
++ const char *key)
++{
++ GVariant *variant;
++
++ variant = g_variant_lookup_value (dict, key, G_VARIANT_TYPE_STRING);
++ if (!variant)
++ return NULL;
++ return g_variant_get_string (variant, NULL);
++}
++
+ static void
+ performance_profile_set_active (CcPowerPanel *self,
+ const char *profile_str)
+@@ -1427,18 +1439,6 @@ perf_profile_list_box_sort (GtkListBoxRow *row1,
+ return 0;
+ }
+
+-static const char *
+-variant_lookup_string (GVariant *dict,
+- const char *key)
+-{
+- GVariant *variant;
+-
+- variant = g_variant_lookup_value (dict, key, G_VARIANT_TYPE_STRING);
+- if (!variant)
+- return NULL;
+- return g_variant_get_string (variant, NULL);
+-}
+-
+ static void
+ power_profiles_properties_changed_cb (CcPowerPanel *self,
+ GVariant *changed_properties,
+--
+2.32.0
+
+
+From f49c47787de81fa39f100f3903d2d886905cd4c7 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Fri, 16 Jul 2021 11:01:52 +0200
+Subject: [PATCH 17/33] power: Show power profile info boxes for profile holds
+
+Applications can request that power-profiles-daemon "hold" a particular
+power profile for the duration of a task or event, such as launching a
+taxing application, or saving power because of low battery.
+
+Show those holds in the same type of info boxes we already use to show
+"degraded" performance.
+
+See https://gitlab.freedesktop.org/hadess/power-profiles-daemon/-/merge_requests/46
+---
+ panels/power/cc-power-panel.c | 77 ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 76 insertions(+), 1 deletion(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 4633627c2..4f1989cdf 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -24,6 +24,7 @@
+ #include <libupower-glib/upower.h>
+ #include <glib/gi18n.h>
+ #include <gnome-settings-daemon/gsd-enums.h>
++#include <gio/gdesktopappinfo.h>
+ #include <handy.h>
+
+ #ifdef HAVE_NETWORK_MANAGER
+@@ -1383,12 +1384,25 @@ static void
+ power_profile_update_info_boxes (CcPowerPanel *self)
+ {
+ g_autoptr(GVariant) degraded_variant = NULL;
++ g_autoptr(GVariant) holds_variant = NULL;
++ g_autoptr(GVariant) profile_variant = NULL;
++ guint i, num_children;
+ const char *degraded = NULL;
++ const char *profile;
+ CcPowerProfileInfoRow *row;
++ int next_insert = 0;
+
+ empty_listbox (self->power_profile_info_listbox);
+ gtk_widget_hide (GTK_WIDGET (self->power_profile_info_listbox));
+
++ profile_variant = g_dbus_proxy_get_cached_property (self->power_profiles_proxy, "ActiveProfile");
++ if (!profile_variant)
++ {
++ g_warning ("No 'ActiveProfile' property on power-profiles-daemon service");
++ return;
++ }
++ profile = g_variant_get_string (profile_variant, NULL);
++
+ degraded_variant = g_dbus_proxy_get_cached_property (self->power_profiles_proxy, "PerformanceDegraded");
+ if (degraded_variant)
+ degraded = g_variant_get_string (degraded_variant, NULL);
+@@ -1408,6 +1422,66 @@ power_profile_update_info_boxes (CcPowerPanel *self)
+ row = cc_power_profile_info_row_new (text);
+ gtk_widget_show (GTK_WIDGET (row));
+ gtk_container_add (GTK_CONTAINER (self->power_profile_info_listbox), GTK_WIDGET (row));
++ if (g_str_equal (profile, "performance"))
++ next_insert = 1;
++ }
++
++ holds_variant = g_dbus_proxy_get_cached_property (self->power_profiles_proxy, "ActiveProfileHolds");
++ if (!holds_variant)
++ {
++ g_warning ("No 'ActiveProfileHolds' property on power-profiles-daemon service");
++ return;
++ }
++
++ num_children = g_variant_n_children (holds_variant);
++ for (i = 0; i < num_children; i++)
++ {
++ g_autoptr(GDesktopAppInfo) app_info = NULL;
++ g_autoptr(GVariant) hold_variant = NULL;
++ g_autofree char *text = NULL;
++ const char *app_id, *held_profile, *reason, *name;
++
++ hold_variant = g_variant_get_child_value (holds_variant, i);
++ if (!hold_variant || !g_variant_is_of_type (hold_variant, G_VARIANT_TYPE ("a{sv}")))
++ continue;
++
++ app_id = variant_lookup_string (hold_variant, "ApplicationId");
++ if (!app_id)
++ continue;
++ app_info = g_desktop_app_info_new (app_id);
++ name = app_info ? g_app_info_get_name (G_APP_INFO (app_info)) : app_id;
++ held_profile = variant_lookup_string (hold_variant, "Profile");
++ reason = variant_lookup_string (hold_variant, "Reason");
++ g_debug ("Adding info row for %s hold by %s: %s", held_profile, app_id, reason);
++
++ if (g_strcmp0 (held_profile, "power-saver") == 0 &&
++ g_strcmp0 (app_id, "org.gnome.SettingsDaemon.Power") == 0)
++ {
++ text = g_strdup (_("Low battery: power saver enabled. Previous mode will be restored when battery is sufficiently charged."));
++ }
++ else
++ {
++ switch (cc_power_profile_from_str (held_profile))
++ {
++ case CC_POWER_PROFILE_POWER_SAVER:
++ /* translators: "%s" is an application name */
++ text = g_strdup_printf (_("Power Saver mode activated by “%s”."), name);
++ break;
++ case CC_POWER_PROFILE_PERFORMANCE:
++ /* translators: "%s" is an application name */
++ text = g_strdup_printf (_("Performance mode activated by “%s”."), name);
++ break;
++ default:
++ g_assert_not_reached ();
++ }
++ }
++
++ row = cc_power_profile_info_row_new (text);
++ gtk_widget_show (GTK_WIDGET (row));
++ if (g_strcmp0 (held_profile, profile) != 0)
++ gtk_list_box_insert (GTK_LIST_BOX (self->power_profile_info_listbox), GTK_WIDGET (row), -1);
++ else
++ gtk_list_box_insert (GTK_LIST_BOX (self->power_profile_info_listbox), GTK_WIDGET (row), next_insert);
+ }
+ }
+
+@@ -1458,7 +1532,8 @@ power_profiles_properties_changed_cb (CcPowerPanel *self,
+ performance_profile_set_inhibited (self,
+ g_variant_get_string (value, NULL));
+ }
+- else if (g_strcmp0 (key, "PerformanceDegraded") == 0)
++ else if (g_strcmp0 (key, "PerformanceDegraded") == 0 ||
++ g_strcmp0 (key, "ActiveProfileHolds") == 0)
+ {
+ power_profile_update_info_boxes (self);
+ }
+--
+2.32.0
+
+
+From d7cabb849c425fd84e85a981bcd56a6df1d87868 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Fri, 16 Jul 2021 11:32:37 +0200
+Subject: [PATCH 18/33] power: Tweak power profile info boxes horizontal
+ spacing
+
+A bit too much whitespace around the info icon.
+---
+ panels/power/cc-power-profile-info-row.ui | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/panels/power/cc-power-profile-info-row.ui b/panels/power/cc-power-profile-info-row.ui
+index d9291ff16..bc49a24ac 100644
+--- a/panels/power/cc-power-profile-info-row.ui
++++ b/panels/power/cc-power-profile-info-row.ui
+@@ -8,16 +8,16 @@
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">horizontal</property>
+- <property name="margin-start">12</property>
+- <property name="margin-end">12</property>
++ <property name="margin-start">8</property>
++ <property name="margin-end">8</property>
+ <property name="margin-top">8</property>
+ <property name="margin-bottom">8</property>
+- <property name="spacing">12</property>
++ <property name="spacing">8</property>
+ <child>
+ <object class="GtkImage" id="icon_image">
+ <property name="visible">True</property>
+ <property name="margin-start">6</property>
+- <property name="margin-end">18</property>
++ <property name="margin-end">6</property>
+ <property name="icon-name">info-symbolic</property>
+ <property name="icon-size">5</property>
+ <style>
+--
+2.32.0
+
+
+From 941dfe6403ae0eb68aef76754691f56b07999635 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Fri, 16 Jul 2021 11:33:38 +0200
+Subject: [PATCH 19/33] power: Reword lap mode info message
+
+Reword the lap mode info message slightly as the performance mode might
+not have been what the user requested, but the warning should stay until
+cleared nonetheless.
+---
+ panels/power/cc-power-panel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 4f1989cdf..740d52c64 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -1415,7 +1415,7 @@ power_profile_update_info_boxes (CcPowerPanel *self)
+ if (g_str_equal (degraded, "high-operating-temperature"))
+ text = _("Performance mode temporarily disabled due to high operating temperature.");
+ else if (g_str_equal (degraded, "lap-detected"))
+- text = _("Lap detected: performance mode temporarily disabled. Move the device to a stable surface to restore.");
++ text = _("Lap detected: performance mode temporarily unavailable. Move the device to a stable surface to restore.");
+ else
+ text = _("Performance mode temporarily disabled.");
+
+--
+2.32.0
+
+
+From 4dff29aab988021aab3f623899271b33240c0c86 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Wed, 21 Jul 2021 12:26:39 +0200
+Subject: [PATCH 20/33] power: Fix D-Bus proxy leak
+
+---
+ panels/power/cc-power-panel.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 740d52c64..21183f39c 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -151,6 +151,7 @@ cc_power_panel_dispose (GObject *object)
+ g_clear_object (&self->bt_rfkill);
+ g_clear_object (&self->bt_properties);
+ g_clear_object (&self->iio_proxy);
++ g_clear_object (&self->power_profiles_proxy);
+ #ifdef HAVE_NETWORK_MANAGER
+ g_clear_object (&self->nm_client);
+ #endif
+--
+2.32.0
+
+
+From 99140ea853c6c6ce0e4c29b3edb28a07e7aa5fb6 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Wed, 21 Jul 2021 12:29:55 +0200
+Subject: [PATCH 21/33] power: Add UI for "power-saver profile when battery is
+ low"
+
+See https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/merge_requests/247
+---
+ panels/power/cc-power-panel.c | 23 +++++++++++++++++++++++
+ panels/power/cc-power-panel.ui | 15 +++++++++++++++
+ 2 files changed, 38 insertions(+)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 21183f39c..3e1b323f4 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -92,6 +92,8 @@ struct _CcPowerPanel
+ GtkListBox *power_profile_listbox;
+ GtkListBox *power_profile_info_listbox;
+ HdyPreferencesGroup *power_profile_section;
++ HdyActionRow *power_saver_low_battery_row;
++ GtkSwitch *power_saver_low_battery_switch;
+ GtkSizeGroup *row_sizegroup;
+ GtkComboBox *suspend_on_battery_delay_combo;
+ GtkLabel *suspend_on_battery_delay_label;
+@@ -257,6 +259,18 @@ empty_listbox (GtkListBox *listbox)
+ gtk_container_remove (GTK_CONTAINER (listbox), l->data);
+ }
+
++static void
++update_power_saver_low_battery_row_visibility (CcPowerPanel *self)
++{
++ g_autoptr(UpDevice) composite = NULL;
++ UpDeviceKind kind;
++
++ composite = up_client_get_display_device (self->up_client);
++ g_object_get (composite, "kind", &kind, NULL);
++ gtk_widget_set_visible (GTK_WIDGET (self->power_saver_low_battery_row),
++ self->power_profiles_proxy && kind == UP_DEVICE_KIND_BATTERY);
++}
++
+ static void
+ up_client_changed (CcPowerPanel *self)
+ {
+@@ -427,6 +441,8 @@ up_client_changed (CcPowerPanel *self)
+ add_device (self, device);
+ }
+ }
++
++ update_power_saver_low_battery_row_visibility (self);
+ }
+
+ static void
+@@ -1727,6 +1743,8 @@ setup_power_profiles (CcPowerPanel *self)
+
+ if (self->has_performance_degraded)
+ power_profile_update_info_boxes (self);
++
++ update_power_saver_low_battery_row_visibility (self);
+ }
+
+ static void
+@@ -1839,6 +1857,8 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_info_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_section);
++ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_saver_low_battery_row);
++ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_saver_low_battery_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, row_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_battery_delay_combo);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_battery_delay_label);
+@@ -1895,6 +1915,9 @@ cc_power_panel_init (CcPowerPanel *self)
+ setup_power_profiles (self);
+
+ setup_power_saving (self);
++ g_settings_bind (self->gsd_settings, "power-saver-profile-on-low-battery",
++ self->power_saver_low_battery_switch, "active",
++ G_SETTINGS_BIND_DEFAULT);
+
+ setup_general_section (self);
+
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index d8283c556..bc58e7462 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -206,6 +206,21 @@
+ <signal name="notify::selected-index" handler="blank_screen_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+ </child>
++ <child>
++ <object class="HdyActionRow" id="power_saver_low_battery_row">
++ <property name="visible">False</property>
++ <property name="title" translatable="yes">Automatic Power Saver</property>
++ <property name="subtitle" translatable="yes">Enables power saver mode when battery is low.</property>
++ <property name="use_underline">True</property>
++ <property name="activatable_widget">power_saver_low_battery_switch</property>
++ <child>
++ <object class="GtkSwitch" id="power_saver_low_battery_switch">
++ <property name="visible">True</property>
++ <property name="valign">center</property>
++ </object>
++ </child>
++ </object>
++ </child>
+ <child>
+ <object class="HdyActionRow" id="automatic_suspend_row">
+ <property name="visible">False</property>
+--
+2.32.0
+
+
+From 301045260461f4ab5f6e41ebadbd94935411edb2 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Tue, 27 Jul 2021 15:49:26 +0200
+Subject: [PATCH 22/33] power: Fix logic when showing profile holds
+
+A logic error meant that the power profiles info boxes container
+would not be shown if there wasn't a "degraded" performance as well.
+
+Spotted by Allan Day
+---
+ panels/power/cc-power-panel.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 3e1b323f4..a5c66aa9d 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -1465,6 +1465,9 @@ power_profile_update_info_boxes (CcPowerPanel *self)
+ app_id = variant_lookup_string (hold_variant, "ApplicationId");
+ if (!app_id)
+ continue;
++
++ gtk_widget_show (GTK_WIDGET (self->power_profile_info_listbox));
++
+ app_info = g_desktop_app_info_new (app_id);
+ name = app_info ? g_app_info_get_name (G_APP_INFO (app_info)) : app_id;
+ held_profile = variant_lookup_string (hold_variant, "Profile");
+--
+2.32.0
+
+
+From ac0afc4486403ee61bd5bcc51b22cefb5bba9e8c Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 22 Jul 2021 18:29:43 +0200
+Subject: [PATCH 23/33] power: Remove Wi-Fi and WWAN "power saving" toggles
+
+It's pretty clear from their experiences on smartphones that our users
+know that Wi-Fi and other wireless technologies use enough battery that
+turning them off is a power saving move.
+
+The switches and text were also pretty confusing as we would be turning
+"off" the devices to turn "on" the power saving.
+---
+ panels/power/cc-power-panel.c | 207 ---------------------------------
+ panels/power/cc-power-panel.ui | 34 ------
+ panels/power/meson.build | 4 -
+ 3 files changed, 245 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index a5c66aa9d..97d787b95 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -27,10 +27,6 @@
+ #include <gio/gdesktopappinfo.h>
+ #include <handy.h>
+
+-#ifdef HAVE_NETWORK_MANAGER
+-#include <NetworkManager.h>
+-#endif
+-
+ #include "shell/cc-object-storage.h"
+ #include "list-box-helper.h"
+ #include "cc-battery-row.h"
+@@ -86,8 +82,6 @@ struct _CcPowerPanel
+ GtkListBoxRow *kbd_brightness_row;
+ CcBrightnessScale *kbd_brightness_scale;
+ GtkSizeGroup *level_sizegroup;
+- GtkListBoxRow *mobile_row;
+- GtkSwitch *mobile_switch;
+ HdyComboRow *power_button_row;
+ GtkListBox *power_profile_listbox;
+ GtkListBox *power_profile_info_listbox;
+@@ -102,8 +96,6 @@ struct _CcPowerPanel
+ GtkComboBox *suspend_on_ac_delay_combo;
+ GtkLabel *suspend_on_ac_label;
+ GtkSwitch *suspend_on_ac_switch;
+- GtkListBoxRow *wifi_row;
+- GtkSwitch *wifi_switch;
+
+ GSettings *gsd_settings;
+ GSettings *session_settings;
+@@ -124,10 +116,6 @@ struct _CcPowerPanel
+ CcPowerProfileRow *power_profiles_row[NUM_CC_POWER_PROFILES];
+ gboolean power_profiles_in_update;
+ gboolean has_performance_degraded;
+-
+-#ifdef HAVE_NETWORK_MANAGER
+- NMClient *nm_client;
+-#endif
+ };
+
+ CC_PANEL_REGISTER (CcPowerPanel, cc_power_panel)
+@@ -154,9 +142,6 @@ cc_power_panel_dispose (GObject *object)
+ g_clear_object (&self->bt_properties);
+ g_clear_object (&self->iio_proxy);
+ g_clear_object (&self->power_profiles_proxy);
+-#ifdef HAVE_NETWORK_MANAGER
+- g_clear_object (&self->nm_client);
+-#endif
+ if (self->iio_proxy_watch_id != 0)
+ g_bus_unwatch_name (self->iio_proxy_watch_id);
+ self->iio_proxy_watch_id = 0;
+@@ -729,184 +714,6 @@ bt_powered_state_changed (CcPowerPanel *self)
+ g_signal_handlers_unblock_by_func (self->bt_switch, bt_switch_changed_cb, self);
+ }
+
+-#ifdef HAVE_NETWORK_MANAGER
+-static gboolean
+-has_wifi_devices (NMClient *client)
+-{
+- const GPtrArray *devices;
+- NMDevice *device;
+- gint i;
+-
+- if (!nm_client_get_nm_running (client))
+- return FALSE;
+-
+- devices = nm_client_get_devices (client);
+- if (devices == NULL)
+- return FALSE;
+-
+- for (i = 0; i < devices->len; i++)
+- {
+- device = g_ptr_array_index (devices, i);
+- switch (nm_device_get_device_type (device))
+- {
+- case NM_DEVICE_TYPE_WIFI:
+- return TRUE;
+- default:
+- break;
+- }
+- }
+-
+- return FALSE;
+-}
+-
+-static void
+-wifi_switch_changed_cb (CcPowerPanel *self)
+-{
+- gboolean enabled;
+-
+- enabled = gtk_switch_get_active (self->wifi_switch);
+- g_debug ("Setting wifi %s", enabled ? "enabled" : "disabled");
+- nm_client_wireless_set_enabled (self->nm_client, enabled);
+-}
+-
+-static gboolean
+-has_mobile_devices (NMClient *client)
+-{
+- const GPtrArray *devices;
+- NMDevice *device;
+- gint i;
+-
+- if (!nm_client_get_nm_running (client))
+- return FALSE;
+-
+- devices = nm_client_get_devices (client);
+- if (devices == NULL)
+- return FALSE;
+-
+- for (i = 0; i < devices->len; i++)
+- {
+- device = g_ptr_array_index (devices, i);
+- switch (nm_device_get_device_type (device))
+- {
+- case NM_DEVICE_TYPE_MODEM:
+- return TRUE;
+- default:
+- break;
+- }
+- }
+-
+- return FALSE;
+-}
+-
+-static void
+-mobile_switch_changed_cb (CcPowerPanel *self)
+-{
+- gboolean enabled;
+-
+- enabled = gtk_switch_get_active (self->mobile_switch);
+- g_debug ("Setting wwan %s", enabled ? "enabled" : "disabled");
+- nm_client_wwan_set_enabled (self->nm_client, enabled);
+-}
+-
+-static void
+-nm_client_state_changed (CcPowerPanel *self)
+-{
+- gboolean visible;
+- gboolean active;
+- gboolean sensitive;
+-
+- visible = has_wifi_devices (self->nm_client);
+- active = nm_client_networking_get_enabled (self->nm_client) &&
+- nm_client_wireless_get_enabled (self->nm_client) &&
+- nm_client_wireless_hardware_get_enabled (self->nm_client);
+- sensitive = nm_client_networking_get_enabled (self->nm_client) &&
+- nm_client_wireless_hardware_get_enabled (self->nm_client);
+-
+- g_debug ("wifi state changed to %s", active ? "enabled" : "disabled");
+-
+- g_signal_handlers_block_by_func (self->wifi_switch, wifi_switch_changed_cb, self);
+- gtk_switch_set_active (self->wifi_switch, active);
+- gtk_widget_set_sensitive (GTK_WIDGET (self->wifi_switch), sensitive);
+- gtk_widget_set_visible (GTK_WIDGET (self->wifi_row), visible);
+- g_signal_handlers_unblock_by_func (self->wifi_switch, wifi_switch_changed_cb, self);
+-
+- visible = has_mobile_devices (self->nm_client);
+-
+- /* Set the switch active, if wwan is enabled. */
+- active = nm_client_networking_get_enabled (self->nm_client) &&
+- (nm_client_wwan_get_enabled (self->nm_client) &&
+- nm_client_wwan_hardware_get_enabled (self->nm_client));
+- sensitive = nm_client_networking_get_enabled (self->nm_client) &&
+- nm_client_wwan_hardware_get_enabled (self->nm_client);
+-
+- g_debug ("mobile state changed to %s", active ? "enabled" : "disabled");
+-
+- g_signal_handlers_block_by_func (self->mobile_switch, mobile_switch_changed_cb, self);
+- gtk_switch_set_active (self->mobile_switch, active);
+- gtk_widget_set_sensitive (GTK_WIDGET (self->mobile_switch), sensitive);
+- gtk_widget_set_visible (GTK_WIDGET (self->mobile_row), visible);
+- g_signal_handlers_unblock_by_func (self->mobile_switch, mobile_switch_changed_cb, self);
+-}
+-
+-static void
+-nm_device_changed (CcPowerPanel *self)
+-{
+- gtk_widget_set_visible (GTK_WIDGET (self->wifi_row), has_wifi_devices (self->nm_client));
+- gtk_widget_set_visible (GTK_WIDGET (self->mobile_row), has_mobile_devices (self->nm_client));
+-}
+-
+-static void
+-setup_nm_client (CcPowerPanel *self,
+- NMClient *client)
+-{
+- self->nm_client = client;
+-
+- g_signal_connect_object (self->nm_client, "notify",
+- G_CALLBACK (nm_client_state_changed), self, G_CONNECT_SWAPPED);
+- g_signal_connect_object (self->nm_client, "device-added",
+- G_CALLBACK (nm_device_changed), self, G_CONNECT_SWAPPED);
+- g_signal_connect_object (self->nm_client, "device-removed",
+- G_CALLBACK (nm_device_changed), self, G_CONNECT_SWAPPED);
+-
+- nm_client_state_changed (self);
+- nm_device_changed (self);
+-}
+-
+-static void
+-nm_client_ready_cb (GObject *source_object,
+- GAsyncResult *res,
+- gpointer user_data)
+-{
+- CcPowerPanel *self;
+- NMClient *client;
+- g_autoptr(GError) error = NULL;
+-
+- client = nm_client_new_finish (res, &error);
+- if (!client)
+- {
+- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+- {
+- g_warning ("Failed to create NetworkManager client: %s",
+- error->message);
+-
+- self = user_data;
+- gtk_widget_set_sensitive (GTK_WIDGET (self->wifi_row), FALSE);
+- gtk_widget_set_sensitive (GTK_WIDGET (self->mobile_row), FALSE);
+- }
+- return;
+- }
+-
+- self = user_data;
+-
+- /* Setup the client */
+- setup_nm_client (self, client);
+-
+- /* Store the object in the cache too */
+- cc_object_storage_add_object (CC_OBJECT_NMCLIENT, client);
+-}
+-
+-#endif
+-
+ static gboolean
+ keynav_failed_cb (CcPowerPanel *self, GtkDirectionType direction, GtkWidget *list)
+ {
+@@ -1326,14 +1133,6 @@ setup_power_saving (CcPowerPanel *self)
+ update_automatic_suspend_label (self);
+ }
+
+-#ifdef HAVE_NETWORK_MANAGER
+- /* Create and store a NMClient instance if it doesn't exist yet */
+- if (cc_object_storage_has_object (CC_OBJECT_NMCLIENT))
+- setup_nm_client (self, cc_object_storage_get_object (CC_OBJECT_NMCLIENT));
+- else
+- nm_client_new_async (cc_panel_get_cancellable (CC_PANEL (self)), nm_client_ready_cb, self);
+-#endif
+-
+ #ifdef HAVE_BLUETOOTH
+ self->bt_rfkill = cc_object_storage_create_dbus_proxy_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+@@ -1854,8 +1653,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_scale);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, level_sizegroup);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, mobile_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_info_listbox);
+@@ -1870,8 +1667,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_ac_delay_combo);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_ac_label);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, suspend_on_ac_switch);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, wifi_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, wifi_switch);
+
+ gtk_widget_class_bind_template_callback (widget_class, als_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, automatic_suspend_label_mnemonic_activate_cb);
+@@ -1880,11 +1675,9 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_callback (widget_class, has_kbd_brightness_cb);
+ gtk_widget_class_bind_template_callback (widget_class, blank_screen_row_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, keynav_failed_cb);
+- gtk_widget_class_bind_template_callback (widget_class, mobile_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_button_row_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_profiles_row_activated_cb);
+ gtk_widget_class_bind_template_callback (widget_class, automatic_suspend_row_activated_cb);
+- gtk_widget_class_bind_template_callback (widget_class, wifi_switch_changed_cb);
+ }
+
+ static void
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index bc58e7462..0795f1b70 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -237,38 +237,6 @@
+ </child>
+ </object>
+ </child>
+- <child>
+- <object class="HdyActionRow" id="wifi_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">_Wi-Fi</property>
+- <property name="subtitle" translatable="yes">Wi-Fi can be turned off to save power.</property>
+- <property name="use_underline">True</property>
+- <property name="activatable_widget">wifi_switch</property>
+- <child>
+- <object class="GtkSwitch" id="wifi_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="wifi_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+- <child>
+- <object class="HdyActionRow" id="mobile_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">_Mobile Broadband</property>
+- <property name="subtitle" translatable="yes">Mobile broadband (LTE, 4G, 3G, etc.) can be turned off to save power.</property>
+- <property name="use_underline">True</property>
+- <property name="activatable_widget">mobile_switch</property>
+- <child>
+- <object class="GtkSwitch" id="mobile_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="mobile_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+ <child>
+ <object class="HdyActionRow" id="bt_row">
+ <property name="visible">False</property>
+@@ -337,8 +305,6 @@
+ <widget name="dim_screen_row"/>
+ <widget name="blank_screen_row"/>
+ <widget name="automatic_suspend_row"/>
+- <widget name="wifi_row"/>
+- <widget name="mobile_row"/>
+ <widget name="bt_row"/>
+ <widget name="power_button_row"/>
+ <widget name="battery_percentage_row"/>
+diff --git a/panels/power/meson.build b/panels/power/meson.build
+index af04b98ed..b1380f4e6 100644
+--- a/panels/power/meson.build
++++ b/panels/power/meson.build
+@@ -47,10 +47,6 @@ deps = common_deps + [
+ upower_glib_dep
+ ]
+
+-if host_is_linux
+- deps += network_manager_deps
+-endif
+-
+ if host_is_linux_not_s390
+ deps += gnome_bluetooth_dep
+ endif
+--
+2.32.0
+
+
+From 55ab3debcc8d39a9f301dcd41a441adc568ed520 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 22 Jul 2021 18:33:41 +0200
+Subject: [PATCH 24/33] power: Remove Bluetooth power switch button
+
+See previous commit.
+---
+ panels/power/cc-power-panel.c | 91 ----------------------------------
+ panels/power/cc-power-panel.ui | 17 -------
+ panels/power/meson.build | 4 --
+ 3 files changed, 112 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 97d787b95..1e0a572b3 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -72,8 +72,6 @@ struct _CcPowerPanel
+ HdyComboRow *blank_screen_row;
+ GtkListBoxRow *brightness_row;
+ CcBrightnessScale *brightness_scale;
+- GtkListBoxRow *bt_row;
+- GtkSwitch *bt_switch;
+ GtkListBox *device_listbox;
+ HdyPreferencesGroup *device_section;
+ GtkListBoxRow *dim_screen_row;
+@@ -105,9 +103,6 @@ struct _CcPowerPanel
+ gboolean has_batteries;
+ char *chassis_type;
+
+- GDBusProxy *bt_rfkill;
+- GDBusProxy *bt_properties;
+-
+ GDBusProxy *iio_proxy;
+ guint iio_proxy_watch_id;
+
+@@ -138,8 +133,6 @@ cc_power_panel_dispose (GObject *object)
+ g_clear_pointer ((GtkWidget **) &self->automatic_suspend_dialog, gtk_widget_destroy);
+ g_clear_pointer (&self->devices, g_ptr_array_unref);
+ g_clear_object (&self->up_client);
+- g_clear_object (&self->bt_rfkill);
+- g_clear_object (&self->bt_properties);
+ g_clear_object (&self->iio_proxy);
+ g_clear_object (&self->power_profiles_proxy);
+ if (self->iio_proxy_watch_id != 0)
+@@ -659,61 +652,6 @@ set_ac_battery_ui_mode (CcPowerPanel *self)
+ }
+ }
+
+-static void
+-bt_set_powered (CcPowerPanel *self,
+- gboolean powered)
+-{
+- g_dbus_proxy_call (self->bt_properties,
+- "Set",
+- g_variant_new_parsed ("('org.gnome.SettingsDaemon.Rfkill', 'BluetoothAirplaneMode', %v)",
+- g_variant_new_boolean (!powered)),
+- G_DBUS_CALL_FLAGS_NONE,
+- -1,
+- cc_panel_get_cancellable (CC_PANEL (self)),
+- NULL, NULL);
+-}
+-
+-static void
+-bt_switch_changed_cb (CcPowerPanel *self)
+-{
+- gboolean powered;
+-
+- powered = gtk_switch_get_active (self->bt_switch);
+-
+- g_debug ("Setting bt power %s", powered ? "on" : "off");
+-
+- bt_set_powered (self, powered);
+-}
+-
+-static void
+-bt_powered_state_changed (CcPowerPanel *self)
+-{
+- gboolean powered, has_airplane_mode;
+- g_autoptr(GVariant) v1 = NULL;
+- g_autoptr(GVariant) v2 = NULL;
+-
+- v1 = g_dbus_proxy_get_cached_property (self->bt_rfkill, "BluetoothHasAirplaneMode");
+- has_airplane_mode = g_variant_get_boolean (v1);
+-
+- if (!has_airplane_mode)
+- {
+- g_debug ("BluetoothHasAirplaneMode is false, hiding Bluetooth power row");
+- gtk_widget_hide (GTK_WIDGET (self->bt_row));
+- return;
+- }
+-
+- v2 = g_dbus_proxy_get_cached_property (self->bt_rfkill, "BluetoothAirplaneMode");
+- powered = !g_variant_get_boolean (v2);
+-
+- g_debug ("bt powered state changed to %s", powered ? "on" : "off");
+-
+- gtk_widget_show (GTK_WIDGET (self->bt_row));
+-
+- g_signal_handlers_block_by_func (self->bt_switch, bt_switch_changed_cb, self);
+- gtk_switch_set_active (self->bt_switch, powered);
+- g_signal_handlers_unblock_by_func (self->bt_switch, bt_switch_changed_cb, self);
+-}
+-
+ static gboolean
+ keynav_failed_cb (CcPowerPanel *self, GtkDirectionType direction, GtkWidget *list)
+ {
+@@ -1132,32 +1070,6 @@ setup_power_saving (CcPowerPanel *self)
+ set_ac_battery_ui_mode (self);
+ update_automatic_suspend_label (self);
+ }
+-
+-#ifdef HAVE_BLUETOOTH
+- self->bt_rfkill = cc_object_storage_create_dbus_proxy_sync (G_BUS_TYPE_SESSION,
+- G_DBUS_PROXY_FLAGS_NONE,
+- "org.gnome.SettingsDaemon.Rfkill",
+- "/org/gnome/SettingsDaemon/Rfkill",
+- "org.gnome.SettingsDaemon.Rfkill",
+- NULL,
+- NULL);
+-
+- if (self->bt_rfkill)
+- {
+- self->bt_properties = cc_object_storage_create_dbus_proxy_sync (G_BUS_TYPE_SESSION,
+- G_DBUS_PROXY_FLAGS_NONE,
+- "org.gnome.SettingsDaemon.Rfkill",
+- "/org/gnome/SettingsDaemon/Rfkill",
+- "org.freedesktop.DBus.Properties",
+- NULL,
+- NULL);
+- }
+-
+- g_signal_connect_object (self->bt_rfkill, "g-properties-changed",
+- G_CALLBACK (bt_powered_state_changed), self, G_CONNECT_SWAPPED);
+-
+- bt_powered_state_changed (self);
+-#endif
+ }
+
+ static const char *
+@@ -1643,8 +1555,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, blank_screen_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, brightness_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, brightness_scale);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, bt_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, bt_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_section);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, dim_screen_row);
+@@ -1670,7 +1580,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+
+ gtk_widget_class_bind_template_callback (widget_class, als_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, automatic_suspend_label_mnemonic_activate_cb);
+- gtk_widget_class_bind_template_callback (widget_class, bt_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, has_brightness_cb);
+ gtk_widget_class_bind_template_callback (widget_class, has_kbd_brightness_cb);
+ gtk_widget_class_bind_template_callback (widget_class, blank_screen_row_changed_cb);
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index 0795f1b70..b5e12d2f5 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -237,22 +237,6 @@
+ </child>
+ </object>
+ </child>
+- <child>
+- <object class="HdyActionRow" id="bt_row">
+- <property name="visible">False</property>
+- <property name="title" translatable="yes">_Bluetooth</property>
+- <property name="subtitle" translatable="yes">Bluetooth can be turned off to save power.</property>
+- <property name="use_underline">True</property>
+- <property name="activatable_widget">bt_switch</property>
+- <child>
+- <object class="GtkSwitch" id="bt_switch">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <signal name="notify::active" handler="bt_switch_changed_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+ </object>
+ </child>
+ <child>
+@@ -305,7 +289,6 @@
+ <widget name="dim_screen_row"/>
+ <widget name="blank_screen_row"/>
+ <widget name="automatic_suspend_row"/>
+- <widget name="bt_row"/>
+ <widget name="power_button_row"/>
+ <widget name="battery_percentage_row"/>
+ </widgets>
+diff --git a/panels/power/meson.build b/panels/power/meson.build
+index b1380f4e6..9066d24bd 100644
+--- a/panels/power/meson.build
++++ b/panels/power/meson.build
+@@ -47,10 +47,6 @@ deps = common_deps + [
+ upower_glib_dep
+ ]
+
+-if host_is_linux_not_s390
+- deps += gnome_bluetooth_dep
+-endif
+-
+ panels_libs += static_library(
+ cappletname,
+ sources: sources,
+--
+2.32.0
+
+
+From d6e3755dbfd15f2aaf2a1850e63e7d46f6ae37c7 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Fri, 23 Jul 2021 16:09:54 +0200
+Subject: [PATCH 25/33] power: Tweak labels in "Power Saving Options" section
+
+To match the latest mockups.
+
+The lack of subtitles for most of the items in that section made the
+section look pretty bizarre.
+---
+ panels/power/cc-power-panel.ui | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index b5e12d2f5..29503b7e4 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -139,7 +139,7 @@
+ <child>
+ <object class="HdyPreferencesGroup" id="power_saving_section">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">Power Saving</property>
++ <property name="title" translatable="yes">Power Saving Options</property>
+ <child>
+ <object class="HdyActionRow" id="brightness_row">
+ <property name="visible">True</property>
+@@ -188,7 +188,8 @@
+ <child>
+ <object class="HdyActionRow" id="dim_screen_row">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">Dim Screen When Inactive</property>
++ <property name="title" translatable="yes">Dim Screen</property>
++ <property name="subtitle" translatable="yes">Reduces the screen brightness when the computer is inactive.</property>
+ <property name="activatable_widget">dim_screen_switch</property>
+ <child>
+ <object class="GtkSwitch" id="dim_screen_switch">
+@@ -201,7 +202,8 @@
+ <child>
+ <object class="HdyComboRow" id="blank_screen_row">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">_Blank Screen</property>
++ <property name="title" translatable="yes">Screen _Blank</property>
++ <property name="subtitle" translatable="yes">Turns the screen off after a period of inactivity.</property>
+ <property name="use_underline">True</property>
+ <signal name="notify::selected-index" handler="blank_screen_row_changed_cb" object="CcPowerPanel" swapped="yes"/>
+ </object>
+@@ -225,6 +227,7 @@
+ <object class="HdyActionRow" id="automatic_suspend_row">
+ <property name="visible">False</property>
+ <property name="title" translatable="yes">_Automatic Suspend</property>
++ <property name="subtitle" translatable="yes">Pauses the computer after a period of inactivity.</property>
+ <property name="use_underline">True</property>
+ <property name="activatable">True</property>
+ <signal name="activated" handler="automatic_suspend_row_activated_cb" swapped="yes"/>
+--
+2.32.0
+
+
+From e9e1fdaacc9941129beca7c15adc8b89789fcb50 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Mon, 26 Jul 2021 11:32:23 +0200
+Subject: [PATCH 26/33] power: Remove Brightness scales
+
+From https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/1020#note_1211728
+"
+They are out of place - fine-grained control over brightness isn't what the
+power settings are for. As a result, they confuse the settings overall.
+
+In both cases we have alternative controls, through keyboard hot keys or
+through the shell's screen brightness slider.
+"
+---
+ panels/power/cc-power-panel.c | 87 +++++++++++++++++++++-------------
+ panels/power/cc-power-panel.ui | 36 --------------
+ 2 files changed, 54 insertions(+), 69 deletions(-)
+
+diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
+index 1e0a572b3..04987ff98 100644
+--- a/panels/power/cc-power-panel.c
++++ b/panels/power/cc-power-panel.c
+@@ -30,7 +30,6 @@
+ #include "shell/cc-object-storage.h"
+ #include "list-box-helper.h"
+ #include "cc-battery-row.h"
+-#include "cc-brightness-scale.h"
+ #include "cc-power-profile-row.h"
+ #include "cc-power-profile-info-row.h"
+ #include "cc-power-panel.h"
+@@ -70,15 +69,11 @@ struct _CcPowerPanel
+ GtkSizeGroup *battery_row_sizegroup;
+ HdyPreferencesGroup *battery_section;
+ HdyComboRow *blank_screen_row;
+- GtkListBoxRow *brightness_row;
+- CcBrightnessScale *brightness_scale;
+ GtkListBox *device_listbox;
+ HdyPreferencesGroup *device_section;
+ GtkListBoxRow *dim_screen_row;
+ GtkSwitch *dim_screen_switch;
+ HdyPreferencesGroup *general_section;
+- GtkListBoxRow *kbd_brightness_row;
+- CcBrightnessScale *kbd_brightness_scale;
+ GtkSizeGroup *level_sizegroup;
+ HdyComboRow *power_button_row;
+ GtkListBox *power_profile_listbox;
+@@ -105,6 +100,7 @@ struct _CcPowerPanel
+
+ GDBusProxy *iio_proxy;
+ guint iio_proxy_watch_id;
++ gboolean has_brightness;
+
+ GDBusProxy *power_profiles_proxy;
+ guint power_profiles_prop_id;
+@@ -469,11 +465,8 @@ static void
+ als_enabled_state_changed (CcPowerPanel *self)
+ {
+ gboolean enabled;
+- gboolean has_brightness = FALSE;
+ gboolean visible = FALSE;
+
+- has_brightness = cc_brightness_scale_get_has_brightness (self->brightness_scale);
+-
+ if (self->iio_proxy != NULL)
+ {
+ g_autoptr(GVariant) v = g_dbus_proxy_get_cached_property (self->iio_proxy, "HasAmbientLight");
+@@ -485,7 +478,7 @@ als_enabled_state_changed (CcPowerPanel *self)
+ g_debug ("ALS enabled: %s", enabled ? "on" : "off");
+ g_signal_handlers_block_by_func (self->als_switch, als_switch_changed_cb, self);
+ gtk_switch_set_active (self->als_switch, enabled);
+- gtk_widget_set_visible (GTK_WIDGET (self->als_row), visible && has_brightness);
++ gtk_widget_set_visible (GTK_WIDGET (self->als_row), visible && self->has_brightness);
+ g_signal_handlers_unblock_by_func (self->als_switch, als_switch_changed_cb, self);
+ }
+
+@@ -933,29 +926,34 @@ can_suspend_or_hibernate (CcPowerPanel *self,
+ }
+
+ static void
+-has_brightness_cb (CcPowerPanel *self)
++got_brightness_cb (GObject *source_object,
++ GAsyncResult *res,
++ gpointer user_data)
+ {
+- gboolean has_brightness;
++ g_autoptr(GVariant) result = NULL;
++ g_autoptr(GError) error = NULL;
++ gint32 brightness = -1.0;
++ CcPowerPanel *self;
+
+- has_brightness = cc_brightness_scale_get_has_brightness (self->brightness_scale);
++ result = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), res, &error);
++ if (!result)
++ {
++ g_debug ("Failed to get Brightness property: %s", error->message);
++ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++ return;
++ }
++ else
++ {
++ g_autoptr(GVariant) v = NULL;
++ g_variant_get (result, "(v)", &v);
++ brightness = v ? g_variant_get_int32 (v) : -1.0;
++ }
+
+- gtk_widget_set_visible (GTK_WIDGET (self->brightness_row), has_brightness);
+- gtk_widget_set_visible (GTK_WIDGET (self->dim_screen_row), has_brightness);
++ self = user_data;
++ self->has_brightness = brightness >= 0.0;
+
++ gtk_widget_set_visible (GTK_WIDGET (self->dim_screen_row), self->has_brightness);
+ als_enabled_state_changed (self);
+-
+-}
+-
+-static void
+-has_kbd_brightness_cb (CcPowerPanel *self,
+- GParamSpec *pspec,
+- GObject *object)
+-{
+- gboolean has_brightness;
+-
+- has_brightness = cc_brightness_scale_get_has_brightness (self->kbd_brightness_scale);
+-
+- gtk_widget_set_visible (GTK_WIDGET (self->kbd_brightness_row), has_brightness);
+ }
+
+ static void
+@@ -992,6 +990,8 @@ populate_blank_screen_row (HdyComboRow *combo_row)
+ static void
+ setup_power_saving (CcPowerPanel *self)
+ {
++ g_autoptr(GDBusConnection) connection = NULL;
++ g_autoptr(GError) error = NULL;
+ int value;
+
+ /* ambient light sensor */
+@@ -1005,6 +1005,33 @@ setup_power_saving (CcPowerPanel *self)
+ g_signal_connect_object (self->gsd_settings, "changed",
+ G_CALLBACK (als_enabled_setting_changed), self, G_CONNECT_SWAPPED);
+
++ connection = g_bus_get_sync (G_BUS_TYPE_SESSION,
++ cc_panel_get_cancellable (CC_PANEL (self)),
++ &error);
++ if (connection)
++ {
++ g_dbus_connection_call (connection,
++ "org.gnome.SettingsDaemon.Power",
++ "/org/gnome/SettingsDaemon/Power",
++ "org.freedesktop.DBus.Properties",
++ "Get",
++ g_variant_new ("(ss)",
++ "org.gnome.SettingsDaemon.Power.Screen",
++ "Brightness"),
++ NULL,
++ G_DBUS_CALL_FLAGS_NONE,
++ -1,
++ cc_panel_get_cancellable (CC_PANEL (self)),
++ got_brightness_cb,
++ self);
++ }
++ else
++ {
++ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++ g_warning ("session bus not available: %s", error->message);
++ }
++
++
+ g_settings_bind (self->gsd_settings, "idle-dim",
+ self->dim_screen_switch, "active",
+ G_SETTINGS_BIND_DEFAULT);
+@@ -1553,15 +1580,11 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_row_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, battery_section);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, blank_screen_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, brightness_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, brightness_scale);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_listbox);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, device_section);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, dim_screen_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, dim_screen_switch);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_section);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_row);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_scale);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, level_sizegroup);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_button_row);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, power_profile_listbox);
+@@ -1580,8 +1603,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
+
+ gtk_widget_class_bind_template_callback (widget_class, als_switch_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, automatic_suspend_label_mnemonic_activate_cb);
+- gtk_widget_class_bind_template_callback (widget_class, has_brightness_cb);
+- gtk_widget_class_bind_template_callback (widget_class, has_kbd_brightness_cb);
+ gtk_widget_class_bind_template_callback (widget_class, blank_screen_row_changed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, keynav_failed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, power_button_row_changed_cb);
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index 29503b7e4..a8fafba21 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -140,22 +140,6 @@
+ <object class="HdyPreferencesGroup" id="power_saving_section">
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Power Saving Options</property>
+- <child>
+- <object class="HdyActionRow" id="brightness_row">
+- <property name="visible">True</property>
+- <property name="title" translatable="yes">_Screen Brightness</property>
+- <property name="use_underline">True</property>
+- <child>
+- <object class="CcBrightnessScale" id="brightness_scale">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <property name="device">screen</property>
+- <signal name="notify::has-brightness" handler="has_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+ <child>
+ <object class="HdyActionRow" id="als_row">
+ <property name="visible">True</property>
+@@ -169,22 +153,6 @@
+ </child>
+ </object>
+ </child>
+- <child>
+- <object class="HdyActionRow" id="kbd_brightness_row">
+- <property name="visible">True</property>
+- <property name="title" translatable="yes">_Keyboard Brightness</property>
+- <property name="use_underline">True</property>
+- <child>
+- <object class="CcBrightnessScale" id="kbd_brightness_scale">
+- <property name="visible">True</property>
+- <property name="valign">center</property>
+- <property name="expand">True</property>
+- <property name="device">kbd</property>
+- <signal name="notify::has-brightness" handler="has_kbd_brightness_cb" object="CcPowerPanel" swapped="yes"/>
+- </object>
+- </child>
+- </object>
+- </child>
+ <child>
+ <object class="HdyActionRow" id="dim_screen_row">
+ <property name="visible">True</property>
+@@ -279,16 +247,12 @@
+ <object class="GtkSizeGroup" id="level_sizegroup">
+ <property name="mode">horizontal</property>
+ <widgets>
+- <widget name="brightness_scale"/>
+- <widget name="kbd_brightness_scale"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="row_sizegroup">
+ <property name="mode">vertical</property>
+ <widgets>
+- <widget name="brightness_row"/>
+ <widget name="als_row"/>
+- <widget name="kbd_brightness_row"/>
+ <widget name="dim_screen_row"/>
+ <widget name="blank_screen_row"/>
+ <widget name="automatic_suspend_row"/>
+--
+2.32.0
+
+
+From 3167196af8133997ead275a1b0c9c3ddffe0f4ea Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Mon, 26 Jul 2021 11:34:41 +0200
+Subject: [PATCH 27/33] power: Remove unused CcBrightnessScale
+
+---
+ panels/power/cc-brightness-scale.c | 281 -----------------------------
+ panels/power/cc-brightness-scale.h | 38 ----
+ panels/power/meson.build | 5 -
+ 3 files changed, 324 deletions(-)
+ delete mode 100644 panels/power/cc-brightness-scale.c
+ delete mode 100644 panels/power/cc-brightness-scale.h
+
+diff --git a/panels/power/cc-brightness-scale.c b/panels/power/cc-brightness-scale.c
+deleted file mode 100644
+index 2df1ab5ed..000000000
+--- a/panels/power/cc-brightness-scale.c
++++ /dev/null
+@@ -1,281 +0,0 @@
+-/* cc-brightness-scale.c
+- *
+- * Copyright (C) 2010 Red Hat, Inc
+- * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
+- * Copyright (C) 2010,2015 Richard Hughes <richard@hughsie.com>
+- * Copyright (C) 2020 System76, Inc.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+- *
+- * SPDX-License-Identifier: GPL-2.0-or-later
+- */
+-
+-#include "cc-brightness-scale.h"
+-#include "shell/cc-object-storage.h"
+-
+-struct _CcBrightnessScale {
+- GtkScale parent_instance;
+-
+- GCancellable *cancellable;
+- BrightnessDevice device;
+- gboolean has_brightness;
+- GDBusProxy *proxy;
+- gboolean setting_brightness;
+-};
+-
+-enum
+-{
+- PROP_0,
+- PROP_HAS_BRIGHTNESS,
+- PROP_DEVICE,
+-};
+-
+-G_DEFINE_TYPE (CcBrightnessScale, cc_brightness_scale, GTK_TYPE_SCALE)
+-
+-static void
+-set_brightness_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+-{
+- g_autoptr(GError) error = NULL;
+- g_autoptr(GVariant) result = NULL;
+- GDBusProxy *proxy = G_DBUS_PROXY (source_object);
+-
+- result = g_dbus_proxy_call_finish (proxy, res, &error);
+- if (result == NULL)
+- {
+- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+- g_printerr ("Error setting brightness: %s\n", error->message);
+- return;
+- }
+-
+- CcBrightnessScale *self = CC_BRIGHTNESS_SCALE (user_data);
+-
+- /* not setting, so pay attention to changed signals */
+- self->setting_brightness = FALSE;
+-}
+-
+-static void
+-brightness_slider_value_changed_cb (CcBrightnessScale *self, GtkRange *range)
+-{
+- guint percentage;
+- g_autoptr(GVariant) variant = NULL;
+-
+- percentage = (guint) gtk_range_get_value (range);
+-
+- /* do not loop */
+- if (self->setting_brightness)
+- return;
+-
+- self->setting_brightness = TRUE;
+-
+- if (self->device == BRIGHTNESS_DEVICE_KBD)
+- variant = g_variant_new_parsed ("('org.gnome.SettingsDaemon.Power.Keyboard',"
+- "'Brightness', %v)",
+- g_variant_new_int32 (percentage));
+- else
+- variant = g_variant_new_parsed ("('org.gnome.SettingsDaemon.Power.Screen',"
+- "'Brightness', %v)",
+- g_variant_new_int32 (percentage));
+-
+- /* push this to g-s-d */
+- g_dbus_proxy_call (self->proxy,
+- "org.freedesktop.DBus.Properties.Set",
+- g_variant_ref_sink (variant),
+- G_DBUS_CALL_FLAGS_NONE,
+- -1,
+- self->cancellable,
+- set_brightness_cb,
+- self);
+-}
+-
+-static void
+-sync_brightness (CcBrightnessScale *self)
+-{
+- g_autoptr(GVariant) result = NULL;
+- gint brightness;
+- GtkRange *range;
+-
+- result = g_dbus_proxy_get_cached_property (self->proxy, "Brightness");
+-
+- if (result)
+- {
+- /* set the slider */
+- brightness = g_variant_get_int32 (result);
+- self->has_brightness = brightness >= 0.0;
+- }
+- else
+- {
+- self->has_brightness = FALSE;
+- }
+-
+- g_object_notify (G_OBJECT (self), "has-brightness");
+-
+- if (self->has_brightness)
+- {
+- range = GTK_RANGE (self);
+- self->setting_brightness = TRUE;
+- gtk_range_set_value (range, brightness);
+- self->setting_brightness = FALSE;
+- }
+-}
+-
+-static void
+-got_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+-{
+- g_autoptr(GError) error = NULL;
+- CcBrightnessScale *self;
+- GDBusProxy *proxy;
+-
+- proxy = cc_object_storage_create_dbus_proxy_finish (res, &error);
+- if (proxy == NULL)
+- {
+- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+- g_printerr ("Error creating proxy: %s\n", error->message);
+- return;
+- }
+-
+- self = CC_BRIGHTNESS_SCALE (user_data);
+- self->proxy = proxy;
+-
+- g_signal_connect_object (proxy, "g-properties-changed",
+- G_CALLBACK (sync_brightness), self, G_CONNECT_SWAPPED);
+-
+- sync_brightness (self);
+-}
+-
+-static void
+-cc_brightness_scale_get_property (GObject *object,
+- guint prop_id,
+- GValue *value,
+- GParamSpec *pspec)
+-{
+- CcBrightnessScale *self;
+-
+- self = CC_BRIGHTNESS_SCALE (object);
+-
+- switch (prop_id) {
+- case PROP_HAS_BRIGHTNESS:
+- g_value_set_boolean (value, self->has_brightness);
+- break;
+- default:
+- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+- break;
+- }
+-}
+-
+-static void
+-cc_brightness_scale_set_property (GObject *object,
+- guint prop_id,
+- const GValue *value,
+- GParamSpec *pspec)
+-{
+- CcBrightnessScale *self;
+-
+- self = CC_BRIGHTNESS_SCALE (object);
+-
+- switch (prop_id) {
+- case PROP_DEVICE:
+- self->device = g_value_get_enum (value);
+- break;
+- default:
+- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+- break;
+- }
+-}
+-
+-static void
+-cc_brightness_scale_constructed (GObject *object)
+-{
+- CcBrightnessScale *self;
+- const gchar *interface;
+-
+- G_OBJECT_CLASS (cc_brightness_scale_parent_class)->constructed (object);
+-
+- self = CC_BRIGHTNESS_SCALE (object);
+-
+- self->cancellable = g_cancellable_new();
+-
+- g_signal_connect_object (GTK_SCALE (self), "value-changed",
+- G_CALLBACK (brightness_slider_value_changed_cb), self, G_CONNECT_SWAPPED);
+-
+- if (self->device == BRIGHTNESS_DEVICE_KBD)
+- interface = "org.gnome.SettingsDaemon.Power.Keyboard";
+- else
+- interface = "org.gnome.SettingsDaemon.Power.Screen";
+-
+- cc_object_storage_create_dbus_proxy (G_BUS_TYPE_SESSION,
+- G_DBUS_PROXY_FLAGS_NONE,
+- "org.gnome.SettingsDaemon.Power",
+- "/org/gnome/SettingsDaemon/Power",
+- interface,
+- self->cancellable,
+- got_proxy_cb,
+- self);
+-
+- gtk_range_set_range (GTK_RANGE (self), 0, 100);
+- gtk_range_set_increments (GTK_RANGE (self), 1, 10);
+- gtk_range_set_round_digits (GTK_RANGE (self), 0);
+- gtk_scale_set_draw_value (GTK_SCALE (self), FALSE);
+-}
+-
+-static void
+-cc_brightness_scale_finalize (GObject *object)
+-{
+- CcBrightnessScale *self = CC_BRIGHTNESS_SCALE (object);
+-
+- g_cancellable_cancel (self->cancellable);
+-
+- G_OBJECT_CLASS (cc_brightness_scale_parent_class)->finalize (object);
+-}
+-
+-void
+-cc_brightness_scale_class_init (CcBrightnessScaleClass *klass)
+-{
+- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+-
+- object_class->get_property = cc_brightness_scale_get_property;
+- object_class->set_property = cc_brightness_scale_set_property;
+- object_class->constructed = cc_brightness_scale_constructed;
+- object_class->finalize = cc_brightness_scale_finalize;
+-
+- g_object_class_install_property (object_class,
+- PROP_DEVICE,
+- g_param_spec_enum ("device",
+- "device",
+- "device",
+- brightness_device_get_type(),
+- BRIGHTNESS_DEVICE_SCREEN,
+- G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
+-
+- g_object_class_install_property (object_class,
+- PROP_HAS_BRIGHTNESS,
+- g_param_spec_boolean ("has-brightness",
+- "has brightness",
+- "has brightness",
+- FALSE,
+- G_PARAM_READABLE));
+-}
+-
+-static void
+-cc_brightness_scale_init (CcBrightnessScale *self)
+-{
+-}
+-
+-
+-gboolean
+-cc_brightness_scale_get_has_brightness (CcBrightnessScale *self)
+-{
+- g_return_val_if_fail (CC_IS_BRIGHTNESS_SCALE (self), FALSE);
+-
+- return self->has_brightness;
+-}
+diff --git a/panels/power/cc-brightness-scale.h b/panels/power/cc-brightness-scale.h
+deleted file mode 100644
+index d566dff77..000000000
+--- a/panels/power/cc-brightness-scale.h
++++ /dev/null
+@@ -1,38 +0,0 @@
+-/* cc-brightness-scale.h
+- *
+- * Copyright (C) 2020 System76, Inc.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+- *
+- * SPDX-License-Identifier: GPL-2.0-or-later
+- */
+-
+-#pragma once
+-
+-#include <gtk/gtk.h>
+-#include "cc-brightness-scale-types.h"
+-
+-G_BEGIN_DECLS
+-
+-typedef enum {
+- BRIGHTNESS_DEVICE_SCREEN,
+- BRIGHTNESS_DEVICE_KBD,
+-} BrightnessDevice;
+-
+-#define CC_TYPE_BRIGHTNESS_SCALE (cc_brightness_scale_get_type())
+-G_DECLARE_FINAL_TYPE (CcBrightnessScale, cc_brightness_scale, CC, BRIGHTNESS_SCALE, GtkBox)
+-
+-gboolean cc_brightness_scale_get_has_brightness (CcBrightnessScale *scale);
+-
+-G_END_DECLS
+diff --git a/panels/power/meson.build b/panels/power/meson.build
+index 9066d24bd..0e3ea1d56 100644
+--- a/panels/power/meson.build
++++ b/panels/power/meson.build
+@@ -19,16 +19,11 @@ i18n.merge_file(
+
+ sources = files(
+ 'cc-battery-row.c',
+- 'cc-brightness-scale.c',
+ 'cc-power-panel.c',
+ 'cc-power-profile-row.c',
+ 'cc-power-profile-info-row.c'
+ )
+
+-sources += gnome.mkenums_simple(
+- 'cc-brightness-scale-types',
+- sources: ['cc-brightness-scale.h'])
+-
+ resource_data = files(
+ 'cc-battery-row.ui',
+ 'cc-power-panel.ui'
+--
+2.32.0
+
+
+From 04a299a3582eeae777052b2315bf9b2801f4865c Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Mon, 26 Jul 2021 11:38:38 +0200
+Subject: [PATCH 28/33] power: Update and add subtitle to automatic brightness
+ row
+
+As per:
+https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/1020#note_1210702
+---
+ panels/power/cc-power-panel.ui | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
+index a8fafba21..9880f6b7e 100644
+--- a/panels/power/cc-power-panel.ui
++++ b/panels/power/cc-power-panel.ui
+@@ -143,7 +143,8 @@
+ <child>
+ <object class="HdyActionRow" id="als_row">
+ <property name="visible">True</property>
+- <property name="title" translatable="yes">Automatic Brightness</property>
++ <property name="title" translatable="yes">Automatic Screen Brightness</property>
++ <property name="subtitle" translatable="yes">Screen brightness adjusts to the surrounding light.</property>
+ <child>
+ <object class="GtkSwitch" id="als_switch">
+ <property name="visible">True</property>
+--
+2.32.0
+
+
+From 52dc3f91abb83deac0b66611fd9ed6f96a78cb5f Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Tue, 3 Aug 2021 11:19:56 +0200
+Subject: [PATCH 29/33] power: Dim the info box icon
+
+This brings less focus to the icon and more to the text.
+
+See https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1421
+---
+ panels/power/cc-power-profile-info-row.ui | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/panels/power/cc-power-profile-info-row.ui b/panels/power/cc-power-profile-info-row.ui
+index bc49a24ac..6f411c688 100644
+--- a/panels/power/cc-power-profile-info-row.ui
++++ b/panels/power/cc-power-profile-info-row.ui
+@@ -21,7 +21,7 @@
+ <property name="icon-name">info-symbolic</property>
+ <property name="icon-size">5</property>
+ <style>
+- <class name="power-profile"/>
++ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+--
+2.32.0
+
+
+From 254a9bfa8ac8be8403d0258742f0c3f8c8db9633 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Wed, 4 Aug 2021 11:26:33 +0200
+Subject: [PATCH 30/33] power: Remove icons from power profiles
+
+They were originally included was to educate users about what the icons
+mean, for when they appeared in the top bar. However, since we no
+longer plan on showing the status icon in the top bar, it's not so
+important that people learn the meaning of the icons.
+
+See https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1421
+---
+ panels/power/cc-power-profile-row.c | 13 +------------
+ panels/power/cc-power-profile-row.ui | 15 +--------------
+ 2 files changed, 2 insertions(+), 26 deletions(-)
+
+diff --git a/panels/power/cc-power-profile-row.c b/panels/power/cc-power-profile-row.c
+index ee66bdfd0..a8458c366 100644
+--- a/panels/power/cc-power-profile-row.c
++++ b/panels/power/cc-power-profile-row.c
+@@ -35,7 +35,6 @@ struct _CcPowerProfileRow
+ GtkListBoxRow parent_instance;
+
+ GtkRadioButton *button;
+- GtkImage *icon_image;
+ GtkLabel *subtitle_label;
+ GtkLabel *title_label;
+
+@@ -106,7 +105,6 @@ cc_power_profile_row_class_init (CcPowerProfileRowClass *klass)
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/power/cc-power-profile-row.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, CcPowerProfileRow, button);
+- gtk_widget_class_bind_template_child (widget_class, CcPowerProfileRow, icon_image);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerProfileRow, subtitle_label);
+ gtk_widget_class_bind_template_child (widget_class, CcPowerProfileRow, title_label);
+
+@@ -175,7 +173,7 @@ CcPowerProfileRow *
+ cc_power_profile_row_new (CcPowerProfile power_profile)
+ {
+ CcPowerProfileRow *self;
+- const char *text, *subtext, *icon_name, *class_name;
++ const char *text, *subtext;
+
+ self = g_object_new (CC_TYPE_POWER_PROFILE_ROW, NULL);
+
+@@ -185,20 +183,14 @@ cc_power_profile_row_new (CcPowerProfile power_profile)
+ case CC_POWER_PROFILE_PERFORMANCE:
+ text = _("Performance");
+ subtext = _("High performance and power usage.");
+- icon_name = "power-profile-performance-symbolic";
+- class_name = "performance";
+ break;
+ case CC_POWER_PROFILE_BALANCED:
+ text = _("Balanced Power");
+ subtext = _("Standard performance and power usage.");
+- icon_name = "power-profile-balanced-symbolic";
+- class_name = NULL;
+ break;
+ case CC_POWER_PROFILE_POWER_SAVER:
+ text = _("Power Saver");
+ subtext = _("Reduced performance and power usage.");
+- icon_name = "power-profile-power-saver-symbolic";
+- class_name = "low-power";
+ break;
+ default:
+ g_assert_not_reached ();
+@@ -206,9 +198,6 @@ cc_power_profile_row_new (CcPowerProfile power_profile)
+
+ gtk_label_set_markup (self->title_label, text);
+ gtk_label_set_markup (self->subtitle_label, subtext);
+- gtk_image_set_from_icon_name (self->icon_image, icon_name, GTK_ICON_SIZE_MENU);
+- if (class_name != NULL)
+- gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self->icon_image)), class_name);
+
+ return self;
+ }
+diff --git a/panels/power/cc-power-profile-row.ui b/panels/power/cc-power-profile-row.ui
+index 64516edf3..1391093ba 100644
+--- a/panels/power/cc-power-profile-row.ui
++++ b/panels/power/cc-power-profile-row.ui
+@@ -28,19 +28,6 @@
+ <property name="height">2</property>
+ </packing>
+ </child>
+- <child>
+- <object class="GtkImage" id="icon_image">
+- <property name="visible">True</property>
+- <property name="margin-end">6</property>
+- <style>
+- <class name="power-profile"/>
+- </style>
+- </object>
+- <packing>
+- <property name="left_attach">1</property>
+- <property name="top_attach">0</property>
+- </packing>
+- </child>
+ <child>
+ <object class="GtkLabel" id="title_label">
+ <property name="visible">True</property>
+@@ -53,7 +40,7 @@
+ <property name="margin-end">6</property>
+ </object>
+ <packing>
+- <property name="left_attach">2</property>
++ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+--
+2.32.0
+
+
+From 96efcd2835a46b8009b5f6524a2d37089f40dd44 Mon Sep 17 00:00:00 2001
+From: Allan Day <allanpday@gmail.com>
+Date: Wed, 4 Aug 2021 11:28:14 +0200
+Subject: [PATCH 31/33] power: Align power profile info boxes with profiles
+ text
+
+See https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1421
+---
+ panels/power/cc-power-profile-info-row.ui | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/panels/power/cc-power-profile-info-row.ui b/panels/power/cc-power-profile-info-row.ui
+index 6f411c688..34807c38c 100644
+--- a/panels/power/cc-power-profile-info-row.ui
++++ b/panels/power/cc-power-profile-info-row.ui
+@@ -8,11 +8,11 @@
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">horizontal</property>
+- <property name="margin-start">8</property>
++ <property name="margin-start">4</property>
+ <property name="margin-end">8</property>
+ <property name="margin-top">8</property>
+ <property name="margin-bottom">8</property>
+- <property name="spacing">8</property>
++ <property name="spacing">4</property>
+ <child>
+ <object class="GtkImage" id="icon_image">
+ <property name="visible">True</property>
+--
+2.32.0
+
+
+From 618e269230a71ae3ac84a35daaf15ad3db38f459 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 5 Aug 2021 15:24:58 +0200
+Subject: [PATCH 32/33] power: Change "Balanced" power profile label
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4530#note_1241985
+---
+ panels/power/cc-power-profile-row.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/panels/power/cc-power-profile-row.c b/panels/power/cc-power-profile-row.c
+index a8458c366..9d7f1fe6b 100644
+--- a/panels/power/cc-power-profile-row.c
++++ b/panels/power/cc-power-profile-row.c
+@@ -185,7 +185,7 @@ cc_power_profile_row_new (CcPowerProfile power_profile)
+ subtext = _("High performance and power usage.");
+ break;
+ case CC_POWER_PROFILE_BALANCED:
+- text = _("Balanced Power");
++ text = _("Balanced");
+ subtext = _("Standard performance and power usage.");
+ break;
+ case CC_POWER_PROFILE_POWER_SAVER:
+--
+2.32.0
+
+
+From 98ed744dcefd8c4d8398b1489d0c583a4d5787d9 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 5 Aug 2021 15:24:58 +0200
+Subject: [PATCH 33/33] power: Update power profile labels
+
+Use "Balanced" instead of "Balanced Power", and make sure to add a
+context for all the profiles for translators.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4530#note_1243075
+---
+ panels/power/cc-power-profile-row.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/panels/power/cc-power-profile-row.c b/panels/power/cc-power-profile-row.c
+index 9d7f1fe6b..f290caa10 100644
+--- a/panels/power/cc-power-profile-row.c
++++ b/panels/power/cc-power-profile-row.c
+@@ -181,15 +181,15 @@ cc_power_profile_row_new (CcPowerProfile power_profile)
+ switch (self->power_profile)
+ {
+ case CC_POWER_PROFILE_PERFORMANCE:
+- text = _("Performance");
++ text = C_("Power profile", "Performance");
+ subtext = _("High performance and power usage.");
+ break;
+ case CC_POWER_PROFILE_BALANCED:
+- text = _("Balanced");
++ text = C_("Power profile", "Balanced");
+ subtext = _("Standard performance and power usage.");
+ break;
+ case CC_POWER_PROFILE_POWER_SAVER:
+- text = _("Power Saver");
++ text = C_("Power profile", "Power Saver");
+ subtext = _("Reduced performance and power usage.");
+ break;
+ default:
+--
+2.32.0
+