From adc187c32e4521127836f0c7b12983c097817191 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Tue, 16 Aug 2011 14:24:39 +0200 Subject: [PATCH] screensaver, gnomesession: port to GDBus based bindings Port org.gnome.ScreenSaver and org.gnome.SessionManager glue code to use GDBus, and move /org/gnome/Shell/EndSessionDialog to the GDBus connection, so it is backed by the org.gnome.Shell name. https://bugzilla.gnome.org/show_bug.cgi?id=648651 --- js/misc/gnomeSession.js | 139 ++++++++++---------------------------- js/misc/screenSaver.js | 87 +++++++++++------------- js/ui/automountManager.js | 7 +- js/ui/endSessionDialog.js | 76 ++++++++++----------- js/ui/layout.js | 15 ++-- js/ui/messageTray.js | 11 +-- js/ui/userMenu.js | 21 +++--- 7 files changed, 145 insertions(+), 211 deletions(-) diff --git a/js/misc/gnomeSession.js b/js/misc/gnomeSession.js index a2b61fd49..dc58abdb0 100644 --- a/js/misc/gnomeSession.js +++ b/js/misc/gnomeSession.js @@ -1,20 +1,18 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -const DBus = imports.dbus; +const Gio = imports.gi.Gio; 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 PresenceIface = + + + + + + + +; const PresenceStatus = { AVAILABLE: 0, @@ -23,104 +21,41 @@ const PresenceStatus = { IDLE: 3 }; -function Presence() { - this._init(); +var PresenceProxy = Gio.DBusProxy.makeProxyWrapper(PresenceIface); +function Presence(initCallback, cancellable) { + return new PresenceProxy(Gio.DBus.session, 'org.gnome.SessionManager', + '/org/gnome/SessionManager/Presence', initCallback, cancellable); } -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' }], -}; +const InhibitorIface = + + + + + + +; -function Inhibitor(objectPath) { - this._init(objectPath); +var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface); +function Inhibitor(objectPath, initCallback, cancellable) { + return new InhibitorProxy(Gio.DBus.session, 'org.gnome.SessionManager', objectPath, initCallback, cancellable); } -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' } - ] -}; +const SessionManagerIface = + + + + + + + +; -function SessionManager() { - this._init(); +var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface); +function SessionManager(initCallback, cancellable) { + return new SessionManagerProxy(Gio.DBus.session, 'org.gnome.SessionManager', '/org/gnome/SessionManager', initCallback, cancellable); } - -SessionManager.prototype = { - _init: function() { - DBus.session.proxifyObject(this, 'org.gnome.SessionManager', '/org/gnome/SessionManager'); - } -}; -DBus.proxifyPrototype(SessionManager.prototype, SessionManagerIface); \ No newline at end of file diff --git a/js/misc/screenSaver.js b/js/misc/screenSaver.js index c47185635..87687e195 100644 --- a/js/misc/screenSaver.js +++ b/js/misc/screenSaver.js @@ -1,53 +1,48 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -const DBus = imports.dbus; +const Gio = imports.gi.Gio; const Lang = imports.lang; -const ScreenSaverIface = { - name: 'org.gnome.ScreenSaver', - methods: [{ name: 'GetActive', - inSignature: '', - outSignature: 'b' }, - { name: 'Lock', - inSignature: '' }, - { name: 'SetActive', - inSignature: 'b' }], - signals: [{ name: 'ActiveChanged', - inSignature: 'b' }] -}; +const ScreenSaverIface = + + + + + + + + + + +; + +const ScreenSaverInfo = Gio.DBusInterfaceInfo.new_for_xml(ScreenSaverIface); function ScreenSaverProxy() { - this._init(); + var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session, + g_interface_name: ScreenSaverInfo.name, + g_interface_info: ScreenSaverInfo, + g_name: 'org.gnome.ScreenSaver', + g_object_path: '/org/gnome/ScreenSaver', + g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START | + Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) }); + self.init(null); + self.screenSaverActive = false; + + self.connectSignal('ActiveChanged', function(proxy, senderName, [isActive]) { + self.screenSaverActive = isActive; + }); + self.connect('notify::g-name-owner', function() { + if (self.g_name_owner) { + self.GetActiveRemote(function(result, excp) { + if (result) { + let [isActive] = result; + self.screenSaverActive = isActive; + } + }); + } else + self.screenSaverActive = false; + }); + + return self; } - -ScreenSaverProxy.prototype = { - _init: function() { - DBus.session.proxifyObject(this, - 'org.gnome.ScreenSaver', - '/org/gnome/ScreenSaver'); - - DBus.session.watch_name('org.gnome.ScreenSaver', - false, // do not launch a name-owner if none exists - Lang.bind(this, this._onSSAppeared), - Lang.bind(this, this._onSSVanished)); - - this.screenSaverActive = false; - this.connect('ActiveChanged', - Lang.bind(this, this._onActiveChanged)); - }, - - _onSSAppeared: function(owner) { - this.GetActiveRemote(Lang.bind(this, function(isActive) { - this.screenSaverActive = isActive; - })) - }, - - _onSSVanished: function(oldOwner) { - this.screenSaverActive = false; - }, - - _onActiveChanged: function(object, isActive) { - this.screenSaverActive = isActive; - } -}; -DBus.proxifyPrototype(ScreenSaverProxy.prototype, ScreenSaverIface); diff --git a/js/ui/automountManager.js b/js/ui/automountManager.js index 9a73da294..e3dfe4dda 100644 --- a/js/ui/automountManager.js +++ b/js/ui/automountManager.js @@ -86,9 +86,8 @@ AutomountManager.prototype = { this.ckListener = new ConsoleKitManager(); this._ssProxy = new ScreenSaver.ScreenSaverProxy(); - this._ssProxy.connect('ActiveChanged', - Lang.bind(this, - this._screenSaverActiveChanged)); + this._ssProxy.connectSignal('ActiveChanged', + Lang.bind(this, this._screenSaverActiveChanged)); this._volumeMonitor = Gio.VolumeMonitor.get(); @@ -111,7 +110,7 @@ AutomountManager.prototype = { Mainloop.idle_add(Lang.bind(this, this._startupMountAll)); }, - _screenSaverActiveChanged: function(object, isActive) { + _screenSaverActiveChanged: function(object, senderName, [isActive]) { if (!isActive) { this._volumeQueue.forEach(Lang.bind(this, function(volume) { this._checkAndMountVolume(volume); diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js index 4dcd87f62..4650097a3 100644 --- a/js/ui/endSessionDialog.js +++ b/js/ui/endSessionDialog.js @@ -18,19 +18,19 @@ * 02111-1307, USA. */ -const DBus = imports.dbus; const Lang = imports.lang; const Signals = imports.signals; const AccountsService = imports.gi.AccountsService; const Clutter = imports.gi.Clutter; +const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Gtk = imports.gi.Gtk; const Pango = imports.gi.Pango; const St = imports.gi.St; const Shell = imports.gi.Shell; -const GnomeSession = imports.misc.gnomeSession +const GnomeSession = imports.misc.gnomeSession; const Lightbox = imports.ui.lightbox; const Main = imports.ui.main; const ModalDialog = imports.ui.modalDialog; @@ -43,18 +43,19 @@ const _DIALOG_ICON_SIZE = 32; const GSM_SESSION_MANAGER_LOGOUT_FORCE = 2; -const EndSessionDialogIface = { - name: 'org.gnome.SessionManager.EndSessionDialog', - methods: [{ name: 'Open', - inSignature: 'uuuao', - outSignature: '' - } - ], - signals: [{ name: 'Canceled', - inSignature: '', - }], - properties: [] -}; +const EndSessionDialogIface = + + + + + + + + + + + +; const logoutDialogContent = { subjectWithUser: C_("title", "Log Out %s"), @@ -232,8 +233,6 @@ function _setLabelText(label, text) { function EndSessionDialog() { if (_endSessionDialog == null) { this._init(); - DBus.session.exportObject('/org/gnome/SessionManager/EndSessionDialog', - this); _endSessionDialog = this; } @@ -326,6 +325,9 @@ EndSessionDialog.prototype = { if (this._applicationList.get_children().length == 0) scrollView.hide(); })); + + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this); + this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog'); }, _onDestroy: function() { @@ -440,25 +442,19 @@ EndSessionDialog.prototype = { close: function() { ModalDialog.ModalDialog.prototype.close.call(this); - DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog', - 'org.gnome.SessionManager.EndSessionDialog', - 'Closed', '', []); + this._dbusImpl.emit_signal('Closed', null); }, cancel: function() { this._stopTimer(); - DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog', - 'org.gnome.SessionManager.EndSessionDialog', - 'Canceled', '', []); + this._dbusImpl.emit_signal('Canceled', null); this.close(global.get_current_time()); }, _confirm: function(signal) { this._fadeOutDialog(); this._stopTimer(); - DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog', - 'org.gnome.SessionManager.EndSessionDialog', - signal, '', []); + this._dbusImpl.emit_signal(signal, null); }, _onOpened: function() { @@ -510,39 +506,41 @@ EndSessionDialog.prototype = { this._updateContent(); }, - OpenAsync: function(type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths, callback) { + OpenAsync: function(parameters, invocation) { + let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters; this._totalSecondsToStayOpen = totalSecondsToStayOpen; this._inhibitors = []; this._applicationList.destroy_children(); this._type = type; - if (!(this._type in DialogContent)) - throw new DBus.DBusError('org.gnome.Shell.ModalDialog.TypeError', - "Unknown dialog type requested"); + if (!(this._type in DialogContent)) { + invocation.report_dbus_error('org.gnome.Shell.ModalDialog.TypeError', + "Unknown dialog type requested"); + return; + } for (let i = 0; i < inhibitorObjectPaths.length; i++) { - let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i]); + let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i], Lang.bind(this, function(proxy, error) { + this._onInhibitorLoaded(proxy); + })); - inhibitor.connect('is-loaded', - Lang.bind(this, function() { - this._onInhibitorLoaded(inhibitor); - })); this._inhibitors.push(inhibitor); } this._updateButtons(); - if (!this.open(timestamp)) - throw new DBus.DBusError('org.gnome.Shell.ModalDialog.GrabError', - "Cannot grab pointer and keyboard"); + if (!this.open(timestamp)) { + invocation.report_dbus_error('org.gnome.Shell.ModalDialog.GrabError', + "Cannot grab pointer and keyboard"); + return; + } this._updateContent(); let signalId = this.connect('opened', Lang.bind(this, function() { - callback(); + invocation.return_value(null); this.disconnect(signalId); })); } }; -DBus.conformExport(EndSessionDialog.prototype, EndSessionDialogIface); diff --git a/js/ui/layout.js b/js/ui/layout.js index 04e8e4ab5..e4fcb6247 100644 --- a/js/ui/layout.js +++ b/js/ui/layout.js @@ -587,12 +587,13 @@ Chrome.prototype = { this._screenSaverActive = false; this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy(); - this._screenSaverProxy.connect('ActiveChanged', Lang.bind(this, this._onScreenSaverActiveChanged)); - this._screenSaverProxy.GetActiveRemote(Lang.bind(this, - function(result, err) { - if (!err) - this._onScreenSaverActiveChanged(this._screenSaverProxy, result); - })); + this._screenSaverProxy.connectSignal('ActiveChanged', Lang.bind(this, function(proxy, senderName, [isActive]) { + this._onScreenSaverActiveChanged(isActive); + })); + this._screenSaverProxy.GetActiveRemote(Lang.bind(this, function(result, err) { + if (!err) + this._onScreenSaverActiveChanged(result[0]); + })); this._relayout(); }, @@ -733,7 +734,7 @@ Chrome.prototype = { this._queueUpdateRegions(); }, - _onScreenSaverActiveChanged: function(proxy, screenSaverActive) { + _onScreenSaverActiveChanged: function(screenSaverActive) { this._screenSaverActive = screenSaverActive; this._updateVisibility(); this._queueUpdateRegions(); diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index 64c84aa4a..ef5c19b0b 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -1349,12 +1349,15 @@ function MessageTray() { MessageTray.prototype = { _init: function() { - this._presence = new GnomeSession.Presence(); + this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) { + this._onStatusChanged(proxy.status); + })); this._userStatus = GnomeSession.PresenceStatus.AVAILABLE; this._busy = false; this._backFromAway = false; - this._presence.connect('StatusChanged', Lang.bind(this, this._onStatusChanged)); - this._presence.getStatus(Lang.bind(this, this._onStatusChanged)); + this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { + this._onStatusChanged(status); + })); this.actor = new St.Group({ name: 'message-tray', reactive: true, @@ -1902,7 +1905,7 @@ MessageTray.prototype = { this._updateState(); }, - _onStatusChanged: function(presence, status) { + _onStatusChanged: function(status) { this._backFromAway = (this._userStatus == GnomeSession.PresenceStatus.IDLE && this._userStatus != status); this._userStatus = status; diff --git a/js/ui/userMenu.js b/js/ui/userMenu.js index 8e7131984..5d84bf972 100644 --- a/js/ui/userMenu.js +++ b/js/ui/userMenu.js @@ -157,8 +157,9 @@ IMStatusChooserItem.prototype = { Lang.bind(this, this._changeIMStatus)); this._presence = new GnomeSession.Presence(); - this._presence.connect('StatusChanged', - Lang.bind(this, this._sessionStatusChanged)); + this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { + this._sessionStatusChanged(status); + })); this._sessionPresenceRestored = false; this._imPresenceRestored = false; @@ -292,7 +293,9 @@ IMStatusChooserItem.prototype = { this._setComboboxPresence(presence); if (!this._sessionPresenceRestored) { - this._presence.getStatus(Lang.bind(this, this._sessionStatusChanged)); + this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) { + this._sessionStatusChanged(status); + })); return; } @@ -376,14 +379,14 @@ IMStatusChooserItem.prototype = { return this._currentPresence; }, - _sessionStatusChanged: function(sessionPresence, sessionStatus) { + _sessionStatusChanged: function(sessionStatus) { if (!this._imPresenceRestored) return; if (!this._sessionPresenceRestored) { let savedStatus = global.settings.get_int('saved-session-presence'); if (sessionStatus != savedStatus) { - this._presence.setStatus(savedStatus); + this._presence.status = savedStatus; return; } this._sessionPresenceRestored = true; @@ -452,9 +455,9 @@ UserMenuButton.prototype = { this._idleIcon = new St.Icon({ icon_name: 'user-idle', style_class: 'popup-menu-icon' }); - this._presence.connect('StatusChanged', - Lang.bind(this, this._updateSwitch)); - this._presence.getStatus(Lang.bind(this, this._updateSwitch)); + this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) { + this._updateSwitch(status); + })); this._accountMgr.connect('most-available-presence-changed', Lang.bind(this, this._updatePresenceIcon)); @@ -575,7 +578,7 @@ UserMenuButton.prototype = { } }, - _updateSwitch: function(presence, status) { + _updateSwitch: function(status) { let active = status == GnomeSession.PresenceStatus.AVAILABLE; this._notificationsSwitch.setToggleState(active); },