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