[gnome-shell] status: Add nightLight indicator



commit 785c8137710b4b99c806eb485ebf9fc8f3e1b34c
Author: Florian Müllner <fmuellner gnome org>
Date:   Fri Feb 10 14:14:14 2017 +0100

    status: Add nightLight indicator
    
    The display configuration now exposes a setting to automatically
    shift the display color at nighttime. As there are cases where
    disabling the filtering temporarily is useful, it makes sense to
    expose the feature in the system menu for quick access.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=741224

 js/js-resources.gresource.xml |    1 +
 js/ui/panel.js                |    3 ++
 js/ui/status/nightLight.js    |   74 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+), 0 deletions(-)
---
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
index 58f433c..72cc4f8 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -117,6 +117,7 @@
     <file>ui/status/brightness.js</file>
     <file>ui/status/location.js</file>
     <file>ui/status/keyboard.js</file>
+    <file>ui/status/nightLight.js</file>
     <file>ui/status/network.js</file>
     <file>ui/status/power.js</file>
     <file>ui/status/rfkill.js</file>
diff --git a/js/ui/panel.js b/js/ui/panel.js
index aad466d..fe3fc39 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -719,9 +719,11 @@ const AggregateMenu = new Lang.Class({
         this._system = new imports.ui.status.system.Indicator();
         this._screencast = new imports.ui.status.screencast.Indicator();
         this._location = new imports.ui.status.location.Indicator();
+        this._nightLight = new imports.ui.status.nightLight.Indicator();
 
         this._indicators.add_child(this._screencast.indicators);
         this._indicators.add_child(this._location.indicators);
+        this._indicators.add_child(this._nightLight.indicators);
         if (this._network) {
             this._indicators.add_child(this._network.indicators);
         }
@@ -745,6 +747,7 @@ const AggregateMenu = new Lang.Class({
         this.menu.addMenuItem(this._location.menu);
         this.menu.addMenuItem(this._rfkill.menu);
         this.menu.addMenuItem(this._power.menu);
+        this.menu.addMenuItem(this._nightLight.menu);
         this.menu.addMenuItem(this._system.menu);
 
         menuLayout.addSizeChild(this._location.menu.actor);
diff --git a/js/ui/status/nightLight.js b/js/ui/status/nightLight.js
new file mode 100644
index 0000000..b97710c
--- /dev/null
+++ b/js/ui/status/nightLight.js
@@ -0,0 +1,74 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const Gio = imports.gi.Gio;
+const Lang = imports.lang;
+
+const Main = imports.ui.main;
+const PanelMenu = imports.ui.panelMenu;
+const PopupMenu = imports.ui.popupMenu;
+
+const BUS_NAME = 'org.gnome.SettingsDaemon.Color';
+const OBJECT_PATH = '/org/gnome/SettingsDaemon/Color';
+
+const ColorInterface = '<node> \
+<interface name="org.gnome.SettingsDaemon.Color"> \
+  <property name="DisabledUntilTomorrow" type="b" access="readwrite"/> \
+  <property name="NightLightActive" type="b" access="read"/> \
+</interface> \
+</node>';
+
+const ColorProxy = Gio.DBusProxy.makeProxyWrapper(ColorInterface);
+
+const Indicator = new Lang.Class({
+    Name: 'NightLightIndicator',
+    Extends: PanelMenu.SystemIndicator,
+
+    _init: function() {
+        this.parent();
+
+        this._indicator = this._addIndicator();
+        this._indicator.icon_name = 'night-light-symbolic';
+        this._proxy = new ColorProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
+                                     (proxy, error) => {
+                                         if (error) {
+                                             log(error.message);
+                                             return;
+                                         }
+                                         this._proxy.connect('g-properties-changed',
+                                                             Lang.bind(this, this._sync));
+                                         this._sync();
+                                     });
+
+        this._item = new PopupMenu.PopupSubMenuMenuItem("", true);
+        this._item.icon.icon_name = 'night-light-symbolic';
+        this._disableItem = this._item.menu.addAction('', () => {
+            this._proxy.DisabledUntilTomorrow = !this._proxy.DisabledUntilTomorrow;
+        });
+        this._item.menu.addAction(_("Turn Off"), () => {
+            let settings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.plugins.color' });
+            settings.set_boolean('night-light-enabled', false);
+        });
+        this._item.menu.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop');
+        this.menu.addMenuItem(this._item);
+
+        Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
+        this._sessionUpdated();
+        this._sync();
+    },
+
+    _sessionUpdated: function() {
+        let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
+        this.menu.setSensitive(sensitive);
+    },
+
+    _sync: function() {
+        let visible = this._proxy.NightLightActive;
+        let disabled = this._proxy.DisabledUntilTomorrow;
+
+        this._item.label.text = disabled ? _("Night Light Disabled")
+                                         : _("Night Light On");
+        this._disableItem.label.text = disabled ? _("Resume")
+                                                : _("Disable Until Tomorrow");
+        this._item.actor.visible = this._indicator.visible = visible;
+    }
+});


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