diff options
Diffstat (limited to 'extension.js')
-rw-r--r-- | extension.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/extension.js b/extension.js new file mode 100644 index 0000000..6b3fc29 --- /dev/null +++ b/extension.js @@ -0,0 +1,87 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; +const Lang = imports.lang; +const St = imports.gi.St; +const PopupMenu = imports.ui.popupMenu; +const Main = imports.ui.main; + +const ORIENTATION_SCHEMA = 'org.gnome.settings-daemon.peripherals.touchscreen' +const ORIENTATION_LOCK_KEY = 'orientation-lock' +const ORIENTATION_BUS_NAME = 'org.gnome.SettingsDaemon' +const ORIENTATION_OBJECT_PATH = '/org/gnome/SettingsDaemon' + +const pingIface = <interface name='org.freedesktop.DBus.Introspectable'> +<method name='Introspect'> + <arg type='s' direction='out'/> +</method> +</interface>; +const Proxy = Gio.DBusProxy.makeProxyWrapper(pingIface); + +function LockRotation() { + this._init(); +} + +LockRotation.prototype = { + _init: function() { + let state; + let item = new PopupMenu.PopupSwitchMenuItem(_("Lock Rotation")); + + item.connect('toggled', Lang.bind(this, this._rotationLockSwitched)); + this._rotationLockSwitch = item; + + this._settings = new Gio.Settings({ schema: ORIENTATION_SCHEMA }); + this._settingsID = + this._settings.connect('changed::' + ORIENTATION_LOCK_KEY, + Lang.bind(this, this._updateRotationLock)); + this._updateRotationLock(); + }, + + _rotationLockSwitched: function (item, event) { + if (this._settings.is_writable(ORIENTATION_LOCK_KEY)) { + this._settings.set_boolean(ORIENTATION_LOCK_KEY, item.state); + } + }, + + _updateRotationLock: function () { + let state = this._settings.get_boolean(ORIENTATION_LOCK_KEY); + this._rotationLockSwitch.setToggleState(state) + }, + + /* check whether we have the orientation object on the bus */ + _has_orientation: function () { + }, + + enable: function() { + let proxy = new Proxy(Gio.DBus.session, + ORIENTATION_BUS_NAME, + ORIENTATION_OBJECT_PATH); + + proxy.IntrospectRemote(Lang.bind(this, function([result], err) { + if (result.indexOf("Orientation") != -1) { + let userMenu = Main.panel.statusArea.userMenu.menu; + userMenu.addMenuItem(this._rotationLockSwitch, 4); + } + })); + }, + + disable: function() { + this._settings.disconnect(this._settingsID); + this._rotationLockSwitch.destroy(); + }, +}; + +let _lockrotation; + +function init() { + /* do nothing */ +} + +function enable() { + _lockrotation = new LockRotation(); + _lockrotation.enable(); +} + +function disable() { + _lockrotation.disable(); +} |