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; + } +});