From c4ca771e99984aa50e030e552cd58177f1e4dae6 Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Sun, 19 Apr 2015 13:44:10 -0400 Subject: [PATCH] power applet: remove auto-dimming controls, add idle inhibitor. --- .../applets/power@cinnamon.org/applet.js | 137 +++++++++++++----- js/misc/gnomeSession.js | 15 ++ 2 files changed, 119 insertions(+), 33 deletions(-) diff --git a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js index b9a0e7de00..4c388f678f 100644 --- a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js +++ b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js @@ -9,6 +9,7 @@ const PopupMenu = imports.ui.popupMenu; const Pango = imports.gi.Pango; const Main = imports.ui.main; const Settings = imports.ui.settings; +const GnomeSession = imports.misc.gnomeSession; const DimSettingsSchema = "org.cinnamon.settings-daemon.plugins.power"; const DimSettingsAc = "idle-dim-ac"; @@ -183,6 +184,106 @@ BrightnessSlider.prototype = { } }; +const INHIBIT_IDLE_FLAG = 8; /* idle inhibit only */ + +function InhibitSwitch() { + this._init.apply(this); +} + +InhibitSwitch.prototype = { + __proto__: PopupMenu.PopupBaseMenuItem.prototype, + + _init: function(params) { + PopupMenu.PopupBaseMenuItem.prototype._init.call(this, params); + + this.label = new St.Label({ text: _("Prevent system idling") }); + + this._statusIcon = new St.Icon({ style_class: 'popup-menu-icon', + icon_type: St.IconType.SYMBOLIC, + icon_name: "dialog-warning-symbolic", + reactive: true}); + + this._switch = new PopupMenu.Switch(false); + + this.addActor(this.label); + this.addActor(this._statusIcon); + + this._statusBin = new St.Bin({ x_align: St.Align.END }); + this.addActor(this._statusBin, { expand: true, span: -1, align: St.Align.END }); + this._statusBin.child = this._switch.actor; + + this.actor.hide(); + this.tooltip = new Tooltips.Tooltip(this._statusIcon, ""); + + this.sessionProxy = null; + this.sessionCookie = null; + this.sigAddedId = 0 + this.sigRemovedId = 0 + + GnomeSession.SessionManager(Lang.bind(this, function(proxy, error) { + if (error) + return; + + this.sessionProxy = proxy; + this.actor.show(); + this.updateStatus(); + this.propId = this.sessionProxy.connect("g-properties-changed", + Lang.bind(this, this.updateStatus)); + })); + }, + + activate: function(event) { + if (this._switch.actor.mapped) { + this._switch.toggle(); + } + + this.toggled(this._switch.state); + + PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event, true); + }, + + updateStatus: function(o) { + this.sessionProxy.IsInhibitedRemote(INHIBIT_IDLE_FLAG, Lang.bind(this, function(is_inhibited) { + if (is_inhibited[0] && !this.sessionCookie) { + this.tooltip.set_text(_("Another program is already inhibiting idle")); + this._statusIcon.show(); + } else { + this.tooltip.set_text(""); + this._statusIcon.hide(); + } + })); + }, + + toggled: function(active) { + if (active && !this.sessionCookie) { + this.sessionProxy.InhibitRemote("power@cinnamon.org", + 0, + "prevent idle functions like screen blanking and dimming", + INHIBIT_IDLE_FLAG, + Lang.bind(this, function(cookie) { + this.sessionCookie = cookie; + this.updateStatus(); + })); + } else if (!active && this.sessionCookie) { + this.sessionProxy.UninhibitRemote(this.sessionCookie); + this.sessionCookie = null; + this.updateStatus(); + } + }, + + kill: function() { + if (!this.sessionProxy) + return; + + if (this.sessionCookie) { + this.sessionProxy.UninhibitRemote(this.sessionCookie); + this.sessionCookie = null; + } + + this.sessionProxy.disconnect(this.propId); + } +}; + function MyApplet(metadata, orientation, panel_height, instanceId) { this._init(metadata, orientation, panel_height, instanceId); } @@ -225,14 +326,9 @@ MyApplet.prototype = { this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - let settingsMenu = new PopupMenu.PopupSubMenuMenuItem(_("Dimming settings")); + this.inhibitSwitch = new InhibitSwitch(); + this.menu.addMenuItem(this.inhibitSwitch); - let dimSwitchAc = this._buildItem(_("Dim screen on AC power"), DimSettingsSchema, DimSettingsAc); - settingsMenu.menu.addMenuItem(dimSwitchAc); - let dimSwitchBattery = this._buildItem(_("Dim screen on battery"), DimSettingsSchema, DimSettingsBattery); - settingsMenu.menu.addMenuItem(dimSwitchBattery); - - this.menu.addMenuItem(settingsMenu); this.menu.addSettingsAction(_("Power Settings"), 'power'); this.actor.connect("scroll-event", Lang.bind(this, this._onScrollEvent)); @@ -431,32 +527,7 @@ MyApplet.prototype = { on_applet_removed_from_panel: function() { Main.systrayManager.unregisterId(this.metadata.uuid); - }, - - /* both methods are taken from a11y@cinnamon.org */ - _buildItem: function(string, schema, key) { - let settings = new Gio.Settings({ schema: schema }); - let widget = this._buildItemExtended(string, - settings.get_boolean(key), - settings.is_writable(key), - function(enabled) { - return settings.set_boolean(key, enabled); - }); - settings.connect('changed::'+key, function() { - widget.setToggleState(settings.get_boolean(key)); - }); - return widget; - }, - - _buildItemExtended: function(string, initial_value, writable, on_set) { - let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value); - if (!writable) - widget.actor.reactive = false; - else - widget.connect('toggled', function(item) { - on_set(item.state); - }); - return widget; + this.inhibitSwitch.kill(); } }; diff --git a/js/misc/gnomeSession.js b/js/misc/gnomeSession.js index ec5b844322..ec050c9852 100644 --- a/js/misc/gnomeSession.js +++ b/js/misc/gnomeSession.js @@ -57,6 +57,21 @@ const SessionManagerIface = '\ \ \ \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ \ ';