[gnome-shell] endSessionDialog: Warn when trying to install updates on battery power



commit 46163a6607c55aa8c0ff5333c7ade123041705aa
Author: Kalev Lember <kalevlember gmail com>
Date:   Wed Feb 19 19:59:47 2014 +0100

    endSessionDialog: Warn when trying to install updates on battery power
    
    Interrupting update installation can mess up the package database quite
    a bit and could lead to totally destroying the distro installtion. To
    avoid running out of juice during an upgrade, warn when someone tries to
    install updates on battery power.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=722898

 data/theme/gnome-shell.css |   13 ++++++++++++
 js/ui/endSessionDialog.js  |   45 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+), 0 deletions(-)
---
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index 35079d4..bb9ff54 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -1966,6 +1966,19 @@ StScrollBar StButton#vhandle:active {
     text-align: right;
 }
 
+.end-session-dialog-warning {
+    width: 28em;
+    color: #f57900;
+    padding-top: 6px;
+}
+
+.end-session-dialog-warning:rtl {
+    width: 28em;
+    color: #f57900;
+    padding-top: 6px;
+    text-align: right;
+}
+
 .end-session-dialog-logout-icon {
     border: 2px solid #8b8b8b;
     border-radius: 5px;
diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
index 5f06fc1..2ac185e 100644
--- a/js/ui/endSessionDialog.js
+++ b/js/ui/endSessionDialog.js
@@ -75,6 +75,7 @@ const logoutDialogContent = {
                         "You will be logged out automatically in %d seconds.",
                         seconds).format(seconds);
     },
+    showBatteryWarning: false,
     confirmButtons: [{ signal: 'ConfirmedLogout',
                        label:  C_("button", "Log Out") }],
     iconStyleClass: 'end-session-dialog-logout-icon',
@@ -90,6 +91,7 @@ const shutdownDialogContent = {
                         seconds).format(seconds);
     },
     checkBoxText: C_("checkbox", "Install pending software updates"),
+    showBatteryWarning: true,
     confirmButtons: [{ signal: 'ConfirmedReboot',
                        label:  C_("button", "Restart") },
                      { signal: 'ConfirmedShutdown',
@@ -106,6 +108,7 @@ const restartDialogContent = {
                         "The system will restart automatically in %d seconds.",
                         seconds).format(seconds);
     },
+    showBatteryWarning: false,
     confirmButtons: [{ signal: 'ConfirmedReboot',
                        label:  C_("button", "Restart") }],
     iconName: 'view-refresh-symbolic',
@@ -121,6 +124,7 @@ const restartInstallDialogContent = {
                         "The system will automatically restart and install updates in %d seconds.",
                         seconds).format(seconds);
     },
+    showBatteryWarning: true,
     confirmButtons: [{ signal: 'ConfirmedReboot',
                        label:  C_("button", "Restart &amp; Install") }],
     iconName: 'view-refresh-symbolic',
@@ -149,6 +153,14 @@ const LogindSessionIface = '<node> \
 
 const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
 
+const UPowerIface = '<node> \
+<interface name="org.freedesktop.UPower"> \
+    <property name="OnBattery" type="b" access="read"/> \
+</interface> \
+</node>';
+
+const UPowerProxy = Gio.DBusProxy.makeProxyWrapper(UPowerIface);
+
 function findAppFromInhibitor(inhibitor) {
     let desktopFile;
     try {
@@ -234,6 +246,19 @@ const EndSessionDialog = new Lang.Class({
         this._updatesFile = Gio.File.new_for_path('/system-update');
         this._preparedUpdateFile = Gio.File.new_for_path('/var/lib/PackageKit/prepared-update');
 
+        this._powerProxy = new UPowerProxy(Gio.DBus.system,
+                                           'org.freedesktop.UPower',
+                                           '/org/freedesktop/UPower',
+                                           Lang.bind(this, function(proxy, error) {
+                                               if (error) {
+                                                   log(error.message);
+                                                   return;
+                                               }
+                                               this._powerProxy.connect('g-properties-changed',
+                                                                        Lang.bind(this, this._sync));
+                                               this._sync();
+                                           }));
+
         this._secondsLeft = 0;
         this._totalSecondsToStayOpen = 0;
         this._applications = [];
@@ -284,6 +309,12 @@ const EndSessionDialog = new Lang.Class({
         this._checkBox.actor.connect('clicked', Lang.bind(this, this._sync));
         messageLayout.add(this._checkBox.actor);
 
+        this._batteryWarning = new St.Label({ style_class: 'end-session-dialog-warning',
+                                              text: _("Running on battery power: please plug in before 
installing updates.") });
+        this._batteryWarning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
+        this._batteryWarning.clutter_text.line_wrap = true;
+        messageLayout.add(this._batteryWarning);
+
         this._scrollView = new St.ScrollView({ style_class: 'end-session-dialog-list' });
         this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
         this.contentLayout.add(this._scrollView,
@@ -337,6 +368,14 @@ const EndSessionDialog = new Lang.Class({
         if (dialogContent.subjectWithUpdates && this._checkBox.actor.checked)
             subject = dialogContent.subjectWithUpdates;
 
+        if (dialogContent.showBatteryWarning) {
+            // Warn when running on battery power
+            if (this._powerProxy.OnBattery && this._checkBox.actor.checked)
+                this._batteryWarning.opacity = 255;
+            else
+                this._batteryWarning.opacity = 0;
+        }
+
         let description;
         let displayTime = _roundSecondsToInterval(this._totalSecondsToStayOpen,
                                                   this._secondsLeft,
@@ -671,6 +710,12 @@ const EndSessionDialog = new Lang.Class({
         this._checkBox.actor.visible = (dialogContent.checkBoxText && preparedUpdate && updatesAllowed);
         this._checkBox.actor.checked = (preparedUpdate && updateAlreadyTriggered);
 
+        // We show the warning either together with the checkbox, or when
+        // updates have already been triggered, but the user doesn't have
+        // enough permissions to cancel them.
+        this._batteryWarning.visible = (dialogContent.showBatteryWarning &&
+                                        (this._checkBox.actor.visible || preparedUpdate && 
updateAlreadyTriggered && !updatesAllowed));
+
         this._updateButtons();
 
         if (!this.open(timestamp)) {


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