From 785c8137710b4b99c806eb485ebf9fc8f3e1b34c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 10 Feb 2017 14:14:14 +0100 Subject: [PATCH] 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(+) create mode 100644 js/ui/status/nightLight.js diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml index 58f433c3c..72cc4f875 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -117,6 +117,7 @@ ui/status/brightness.js ui/status/location.js ui/status/keyboard.js + ui/status/nightLight.js ui/status/network.js ui/status/power.js ui/status/rfkill.js diff --git a/js/ui/panel.js b/js/ui/panel.js index aad466df7..fe3fc392f 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 000000000..b97710ccf --- /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 = ' \ + \ + \ + \ + \ +'; + +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; + } +});