6b2b3475c8
Due to lockdown settings or Polkit policy, shutdown may not be available. If this is the case, the "Power off ..." action should be hidden from the user status menu. https://bugzilla.gnome.org/show_bug.cgi?id=652038
126 lines
3.7 KiB
JavaScript
126 lines
3.7 KiB
JavaScript
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
|
|
const DBus = imports.dbus;
|
|
const Lang = imports.lang;
|
|
const Signals = imports.signals;
|
|
|
|
const PresenceIface = {
|
|
name: 'org.gnome.SessionManager.Presence',
|
|
methods: [{ name: 'SetStatus',
|
|
inSignature: 'u',
|
|
outSignature: '' }],
|
|
properties: [{ name: 'status',
|
|
signature: 'u',
|
|
access: 'readwrite' }],
|
|
signals: [{ name: 'StatusChanged',
|
|
inSignature: 'u' }]
|
|
};
|
|
|
|
const PresenceStatus = {
|
|
AVAILABLE: 0,
|
|
INVISIBLE: 1,
|
|
BUSY: 2,
|
|
IDLE: 3
|
|
};
|
|
|
|
function Presence() {
|
|
this._init();
|
|
}
|
|
|
|
Presence.prototype = {
|
|
_init: function() {
|
|
DBus.session.proxifyObject(this, 'org.gnome.SessionManager', '/org/gnome/SessionManager/Presence', this);
|
|
},
|
|
|
|
getStatus: function(callback) {
|
|
this.GetRemote('status', Lang.bind(this,
|
|
function(status, ex) {
|
|
if (!ex)
|
|
callback(this, status);
|
|
}));
|
|
},
|
|
|
|
setStatus: function(status) {
|
|
this.SetStatusRemote(status);
|
|
}
|
|
};
|
|
DBus.proxifyPrototype(Presence.prototype, PresenceIface);
|
|
|
|
// Note inhibitors are immutable objects, so they don't
|
|
// change at runtime (changes always come in the form
|
|
// of new inhibitors)
|
|
const InhibitorIface = {
|
|
name: 'org.gnome.SessionManager.Inhibitor',
|
|
properties: [{ name: 'app_id',
|
|
signature: 's',
|
|
access: 'readonly' },
|
|
{ name: 'client_id',
|
|
signature: 's',
|
|
access: 'readonly' },
|
|
{ name: 'reason',
|
|
signature: 's',
|
|
access: 'readonly' },
|
|
{ name: 'flags',
|
|
signature: 'u',
|
|
access: 'readonly' },
|
|
{ name: 'toplevel_xid',
|
|
signature: 'u',
|
|
access: 'readonly' },
|
|
{ name: 'cookie',
|
|
signature: 'u',
|
|
access: 'readonly' }],
|
|
};
|
|
|
|
function Inhibitor(objectPath) {
|
|
this._init(objectPath);
|
|
}
|
|
|
|
Inhibitor.prototype = {
|
|
_init: function(objectPath) {
|
|
DBus.session.proxifyObject(this,
|
|
"org.gnome.SessionManager",
|
|
objectPath);
|
|
this.isLoaded = false;
|
|
this._loadingPropertiesCount = InhibitorIface.properties.length;
|
|
for (let i = 0; i < InhibitorIface.properties.length; i++) {
|
|
let propertyName = InhibitorIface.properties[i].name;
|
|
this.GetRemote(propertyName, Lang.bind(this,
|
|
function(value, exception) {
|
|
if (exception)
|
|
return;
|
|
|
|
this[propertyName] = value;
|
|
this._loadingPropertiesCount--;
|
|
|
|
if (this._loadingPropertiesCount == 0) {
|
|
this.isLoaded = true;
|
|
this.emit("is-loaded");
|
|
}
|
|
}));
|
|
}
|
|
},
|
|
};
|
|
DBus.proxifyPrototype(Inhibitor.prototype, InhibitorIface);
|
|
Signals.addSignalMethods(Inhibitor.prototype);
|
|
|
|
|
|
// Not the full interface, only the methods we use
|
|
const SessionManagerIface = {
|
|
name: 'org.gnome.SessionManager',
|
|
methods: [
|
|
{ name: 'Logout', inSignature: 'u', outSignature: '' },
|
|
{ name: 'Shutdown', inSignature: '', outSignature: '' },
|
|
{ name: 'CanShutdown', inSignature: '', outSignature: 'b' }
|
|
]
|
|
};
|
|
|
|
function SessionManager() {
|
|
this._init();
|
|
}
|
|
|
|
SessionManager.prototype = {
|
|
_init: function() {
|
|
DBus.session.proxifyObject(this, 'org.gnome.SessionManager', '/org/gnome/SessionManager');
|
|
}
|
|
};
|
|
DBus.proxifyPrototype(SessionManager.prototype, SessionManagerIface); |