From f798a40389174341a64e7090d5d9f5174453cb34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= <gael@xfce.org>
Date: Fri, 24 May 2024 17:08:17 +0200
Subject: [PATCH] settings: Warn about upower acting before xfpm on critical
 battery

See https://gitlab.xfce.org/xfce/xfce4-power-manager/-/issues/146#note_89211

Closes: #146
---
 data/interfaces/xfpm-settings.ui | 32 ++++++++++++++++++++++++++++++++
 settings/xfpm-settings.c         |  9 +++++++++
 2 files changed, 41 insertions(+)

diff --git a/data/interfaces/xfpm-settings.ui b/data/interfaces/xfpm-settings.ui
index 6a22df2a..216b882a 100644
--- a/data/interfaces/xfpm-settings.ui
+++ b/data/interfaces/xfpm-settings.ui
@@ -83,6 +83,11 @@
     <property name="can_focus">False</property>
     <property name="icon_name">window-close-symbolic</property>
   </object>
+  <object class="GtkImage" id="image4">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="icon_name">dialog-warning</property>
+  </object>
   <object class="GtkListStore" id="liststore1">
     <columns>
       <!-- column-name value -->
@@ -229,6 +234,20 @@
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
+  <object class="GtkPopover" id="critical-warning-popover">
+    <property name="can-focus">False</property>
+    <property name="position">bottom</property>
+    <property name="border-width">6</property>
+    <child>
+      <object class="GtkLabel" id="critical-warning-label">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="xalign">0</property>
+        <property name="wrap">True</property>
+        <property name="max-width-chars">50</property>
+      </object>
+    </child>
+  </object>
   <object class="XfceTitledDialog" id="xfpm-settings-dialog">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">Power Manager</property>
@@ -1156,6 +1175,19 @@
                                     <property name="position">2</property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <object class="GtkMenuButton">
+                                    <property name="visible">True</property>
+                                    <property name="can-focus">True</property>
+                                    <property name="image">image4</property>
+                                    <property name="popover">critical-warning-popover</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">3</property>
+                                  </packing>
+                                </child>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c
index e71e63ee..9e31b12a 100644
--- a/settings/xfpm-settings.c
+++ b/settings/xfpm-settings.c
@@ -811,6 +811,9 @@ xfpm_settings_others (XfconfChannel *channel,
   {
     GtkTreeIter iter;
     GtkTreeModel *model;
+    GtkWidget *label;
+    const gchar *action;
+    gchar *text;
 
     critical_level = GTK_WIDGET (gtk_builder_get_object (xml, "critical-power-level-spin"));
     gtk_widget_set_tooltip_text (critical_level, _("When all the power sources of the computer reach this charge level"));
@@ -831,6 +834,12 @@ xfpm_settings_others (XfconfChannel *channel,
       if (request == XFPM_ASK && !gtk_list_store_remove (GTK_LIST_STORE (model), &iter))
         break;
     } while (gtk_tree_model_iter_next (model, &iter));
+
+    label = GTK_WIDGET (gtk_builder_get_object (xml, "critical-warning-label"));
+    action = upower != NULL ? up_client_get_critical_action (upower) : "Unknown";
+    text = g_strdup_printf (_("Make sure you set a sufficiently high value here, otherwise the system will trigger its own action before xfce4-power-manager, without being able to prevent it or know exactly when it will do so. The action triggered by the system in this case will be: %s."), action);
+    gtk_label_set_text (GTK_LABEL (label), text);
+    g_free (text);
   }
   else
   {
-- 
GitLab