Compare commits
	
		
			3 Commits
		
	
	
		
			3.33.4
			...
			wip/gdbus-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | d2052a885e | ||
|   | afcc1b7b52 | ||
|   | a6b4d68a1d | 
| @@ -21,7 +21,16 @@ const GnomeShellIface = <interface name="org.gnome.Shell.Extensions"> | ||||
| </signal> | ||||
| </interface>; | ||||
|  | ||||
| const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface); | ||||
| const GnomeShellProxy = new Gio.DBusProxyClass({ | ||||
|     Name: 'GnomeShellProxy', | ||||
|     Interface: GnomeShellIface, | ||||
|  | ||||
|     _init: function() { | ||||
| 	this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
| 		      g_name: 'org.gnome.Shell', | ||||
| 		      g_object_path: '/org/gnome/Shell' }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| function stripPrefix(string, prefix) { | ||||
|     if (string.slice(0, prefix.length) == prefix) | ||||
| @@ -191,7 +200,8 @@ const Application = new Lang.Class({ | ||||
|  | ||||
|         this._extensionPrefsBin.add(label); | ||||
|  | ||||
|         this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell'); | ||||
|         this._shellProxy = new GnomeShellProxy(); | ||||
|         this._shellProxy.init(null); | ||||
|         this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) { | ||||
|             if (ExtensionUtils.extensions[uuid] !== undefined) | ||||
|                 this._scanExtensions(); | ||||
|   | ||||
| @@ -11,16 +11,14 @@ const FprintManagerIface = <interface name='net.reactivated.Fprint.Manager'> | ||||
| </method> | ||||
| </interface>; | ||||
|  | ||||
| const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface); | ||||
| const FprintManager = new Gio.DBusProxyClass({ | ||||
|     Name: 'FprintManager', | ||||
|     Interface: FprintManagerIface, | ||||
|  | ||||
| function FprintManager() { | ||||
|     var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system, | ||||
|                                    g_interface_name: FprintManagerInfo.name, | ||||
|                                    g_interface_info: FprintManagerInfo, | ||||
|                                    g_name: 'net.reactivated.Fprint', | ||||
|                                    g_object_path: '/net/reactivated/Fprint/Manager', | ||||
|                                    g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) }); | ||||
|  | ||||
|     self.init(null); | ||||
|     return self; | ||||
| } | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'net.reactivated.Fprint', | ||||
|                       g_object_path: '/net/reactivated/Fprint/Manager', | ||||
|                       g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) }); | ||||
|     } | ||||
| }); | ||||
|   | ||||
| @@ -35,7 +35,13 @@ const PowerMenuButton = new Lang.Class({ | ||||
|         /* Translators: accessible name of the power menu in the login screen */ | ||||
|         this.parent('system-shutdown-symbolic', _("Power")); | ||||
|  | ||||
|         this._loginManager = LoginManager.getLoginManager(); | ||||
|         LoginManager.getLoginManager(Lang.bind(this, function(manager) { | ||||
|             this._loginManager = manager; | ||||
|  | ||||
|             this._updateHaveShutdown(); | ||||
|             this._updateHaveRestart(); | ||||
|             this._updateHaveSuspend(); | ||||
|         })); | ||||
|  | ||||
|         this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA }); | ||||
|         this._settings.connect('changed::disable-restart-buttons', | ||||
| @@ -64,6 +70,12 @@ const PowerMenuButton = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _updateHaveShutdown: function() { | ||||
|         if (!this._loginManager) { | ||||
|             this._haveShutdown = false; | ||||
|             this._powerOffItem.actor.visible = false; | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._loginManager.canPowerOff(Lang.bind(this, function(result) { | ||||
|             this._haveShutdown = result; | ||||
|             this._powerOffItem.actor.visible = this._haveShutdown; | ||||
| @@ -72,6 +84,12 @@ const PowerMenuButton = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _updateHaveRestart: function() { | ||||
|         if (!this._loginManager) { | ||||
|             this._haveRestart = false; | ||||
|             this._restartItem.actor.visible = false; | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._loginManager.canReboot(Lang.bind(this, function(result) { | ||||
|             this._haveRestart = result; | ||||
|             this._restartItem.actor.visible = this._haveRestart; | ||||
| @@ -80,6 +98,12 @@ const PowerMenuButton = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _updateHaveSuspend: function() { | ||||
|         if (!this._loginManager) { | ||||
|             this._haveSuspend = false; | ||||
|             this._suspendItem.actor.visible = false; | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._loginManager.canSuspend(Lang.bind(this, function(result) { | ||||
|             this._haveSuspend = result; | ||||
|             this._suspendItem.actor.visible = this._haveSuspend; | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const Gio = imports.gi.Gio; | ||||
| const GLib = imports.gi.GLib; | ||||
| const Lang = imports.lang; | ||||
| const Shell = imports.gi.Shell; | ||||
| const Signals = imports.signals; | ||||
| @@ -16,7 +17,16 @@ const ProviderIface = <interface name='org.freedesktop.realmd.Provider'> | ||||
|         <arg name="realm" type="ao" direction="out"/> | ||||
|     </method> | ||||
| </interface>; | ||||
| const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface); | ||||
| const Provider = new Gio.DBusProxyClass({ | ||||
|     Name: 'RealmdProvider', | ||||
|     Interface: ProviderIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.realmd', | ||||
|                       g_object_path: '/org/freedesktop/realmd' }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const ServiceIface = <interface name="org.freedesktop.realmd.Service"> | ||||
|     <method name="Cancel"> | ||||
| @@ -31,7 +41,16 @@ const ServiceIface = <interface name="org.freedesktop.realmd.Service"> | ||||
|         <arg name="operation" type="s"/> | ||||
|     </signal> | ||||
| </interface>; | ||||
| const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface); | ||||
| const Service = new Gio.DBusProxyClass({ | ||||
|     Name: 'RealmdService', | ||||
|     Interface: ServiceIface, | ||||
|  | ||||
|     _init: function(service) { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.realmd', | ||||
|                       g_object_path: service }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const RealmIface = <interface name="org.freedesktop.realmd.Realm"> | ||||
|     <property name="Name" type="s" access="read"/> | ||||
| @@ -51,16 +70,22 @@ const RealmIface = <interface name="org.freedesktop.realmd.Realm"> | ||||
|         <arg name="options" type="a{sv}" direction="in"/> | ||||
|     </method> | ||||
| </interface>; | ||||
| const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface); | ||||
| const Realm = new Gio.DBusProxyClass({ | ||||
|     Name: 'RealmdRealm', | ||||
|     Interface: RealmIface, | ||||
|  | ||||
|     _init: function(realm) { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.realmd', | ||||
|                       g_object_path: realm }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const Manager = new Lang.Class({ | ||||
|     Name: 'Manager', | ||||
|  | ||||
|     _init: function(parentActor) { | ||||
|         this._aggregateProvider = Provider(Gio.DBus.system, | ||||
|                                            'org.freedesktop.realmd', | ||||
|                                            '/org/freedesktop/realmd', | ||||
|                                            Lang.bind(this, this._reloadRealms)) | ||||
|         this._aggregateProvider = new Provider(); | ||||
|         this._realms = {}; | ||||
|  | ||||
|         this._aggregateProvider.connect('g-properties-changed', | ||||
| @@ -68,6 +93,16 @@ const Manager = new Lang.Class({ | ||||
|                                             if ('Realms' in properties.deep_unpack()) | ||||
|                                                 this._reloadRealms(); | ||||
|                                         })); | ||||
|  | ||||
|         this._aggregateProvider.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 proxy.init_finish(result); | ||||
|             } catch(e) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             this._reloadRealms(); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     _reloadRealms: function() { | ||||
| @@ -77,10 +112,8 @@ const Manager = new Lang.Class({ | ||||
|             return; | ||||
|  | ||||
|         for (let i = 0; i < realmPaths.length; i++) { | ||||
|             let realm = Realm(Gio.DBus.system, | ||||
|                               'org.freedesktop.realmd', | ||||
|                               realmPaths[i], | ||||
|                               Lang.bind(this, this._onRealmLoaded)); | ||||
|             let realm = new Realm(realmPaths[i]); | ||||
|             realm.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, this._onRealmLoaded)); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
| @@ -97,9 +130,10 @@ const Manager = new Lang.Class({ | ||||
|         this._updateLoginFormat(); | ||||
|     }, | ||||
|  | ||||
|     _onRealmLoaded: function(realm, error) { | ||||
|         if (error) | ||||
|             return; | ||||
|     _onRealmLoaded: function(realm, result) { | ||||
|         try { | ||||
|             realm.init_finish(result); | ||||
|         } catch(e) { return; } | ||||
|  | ||||
|         this._reloadRealm(realm); | ||||
|  | ||||
|   | ||||
| @@ -82,6 +82,8 @@ const ShellUserVerifier = new Lang.Class({ | ||||
|         this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA }); | ||||
|  | ||||
|         this._fprintManager = new Fprint.FprintManager(); | ||||
|         this._fprintManager.init(null); | ||||
|  | ||||
|         this._realmManager = new Realmd.Manager(); | ||||
|  | ||||
|         this._failCounter = 0; | ||||
| @@ -137,11 +139,14 @@ const ShellUserVerifier = new Lang.Class({ | ||||
|         if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY)) | ||||
|             return; | ||||
|  | ||||
|         this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this, | ||||
|             function(device, error) { | ||||
|                 if (!error && device) | ||||
|                     this._haveFingerprintReader = true; | ||||
|             })); | ||||
|         this._fprintManager.GetDefaultDeviceRemote(this._cancellable, Lang.bind(this, function(manager, result) { | ||||
|             try { | ||||
|                 let device = manager.GetDefaultDeviceFinish(result); | ||||
|                 this._haveFingerprintReader = !!device; | ||||
|             } catch(e) { | ||||
|                 this._haveFingerprintReader = false; | ||||
|             } | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     _reportInitError: function(where, error) { | ||||
|   | ||||
| @@ -21,11 +21,16 @@ const PresenceStatus = { | ||||
|     IDLE: 3 | ||||
| }; | ||||
|  | ||||
| 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); | ||||
| } | ||||
| const Presence = new Gio.DBusProxyClass({ | ||||
|     Name: 'GnomeSessionPresence', | ||||
|     Interface: PresenceIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: 'org.gnome.SessionManager', | ||||
|                       g_object_path: '/org/gnome/SessionManager/Presence' }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| // Note inhibitors are immutable objects, so they don't | ||||
| // change at runtime (changes always come in the form | ||||
| @@ -39,10 +44,16 @@ const InhibitorIface = <interface name="org.gnome.SessionManager.Inhibitor"> | ||||
| </method> | ||||
| </interface>; | ||||
|  | ||||
| var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface); | ||||
| function Inhibitor(objectPath, initCallback, cancellable) { | ||||
|     return new InhibitorProxy(Gio.DBus.session, 'org.gnome.SessionManager', objectPath, initCallback, cancellable); | ||||
| } | ||||
| const Inhibitor = new Gio.DBusProxyClass({ | ||||
|     Name: 'GnomeSessionInhibitor', | ||||
|     Interface: InhibitorIface, | ||||
|  | ||||
|     _init: function(inhibitor) { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: 'org.gnome.SessionManager', | ||||
|                       g_object_path: inhibitor }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| // Not the full interface, only the methods we use | ||||
| const SessionManagerIface = <interface name="org.gnome.SessionManager"> | ||||
| @@ -66,7 +77,14 @@ const SessionManagerIface = <interface name="org.gnome.SessionManager"> | ||||
| </signal> | ||||
| </interface>; | ||||
|  | ||||
| var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface); | ||||
| function SessionManager(initCallback, cancellable) { | ||||
|     return new SessionManagerProxy(Gio.DBus.session, 'org.gnome.SessionManager', '/org/gnome/SessionManager', initCallback, cancellable); | ||||
| } | ||||
| const SessionManager = new Gio.DBusProxyClass({ | ||||
|     Name: 'GnomeSessionManager', | ||||
|     Interface: SessionManagerIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: 'org.gnome.SessionManager', | ||||
|                       g_object_path: '/org/gnome/SessionManager' }); | ||||
|     }, | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| const GLib = imports.gi.GLib; | ||||
| const Gio = imports.gi.Gio; | ||||
| const GObject = imports.gi.GObject; | ||||
| const Lang = imports.lang; | ||||
| const Mainloop = imports.mainloop; | ||||
| const Shell = imports.gi.Shell; | ||||
| @@ -33,8 +34,26 @@ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session | ||||
| <signal name='Unlock' /> | ||||
| </interface>; | ||||
|  | ||||
| const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); | ||||
| const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); | ||||
| const SystemdLoginManager = new Gio.DBusProxyClass({ | ||||
|     Name: 'SystemdLoginManager', | ||||
|     Interface: SystemdLoginManagerIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.login1', | ||||
|                       g_object_path: '/org/freedesktop/login1' }); | ||||
|     } | ||||
| }); | ||||
| const SystemdLoginSession = new Gio.DBusProxyClass({ | ||||
|     Name: 'SystemdLoginSession', | ||||
|     Interface: SystemdLoginSessionIface, | ||||
|  | ||||
|     _init: function(session) { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.login1', | ||||
|                       g_object_path: session }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const ConsoleKitManagerIface = <interface name='org.freedesktop.ConsoleKit.Manager'> | ||||
| <method name='CanRestart'> | ||||
| @@ -61,51 +80,128 @@ const ConsoleKitSessionIface = <interface name='org.freedesktop.ConsoleKit.Sessi | ||||
| <signal name='Unlock' /> | ||||
| </interface>; | ||||
|  | ||||
| const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface); | ||||
| const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface); | ||||
| const ConsoleKitSession = new Gio.DBusProxyClass({ | ||||
|     Name: 'ConsoleKitSession', | ||||
|     Interface: ConsoleKitSessionIface, | ||||
|  | ||||
|     _init: function(session) { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.ConsoleKit', | ||||
|                       g_object_path: session }); | ||||
|     } | ||||
| }); | ||||
| const ConsoleKitManager = new Gio.DBusProxyClass({ | ||||
|     Name: 'ConsoleKitManager', | ||||
|     Interface: ConsoleKitManagerIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.ConsoleKit', | ||||
|                       g_object_path: '/org/freedesktop/ConsoleKit/Manager' }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| function haveSystemd() { | ||||
|     return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0; | ||||
| } | ||||
|  | ||||
| let _loginManager = null; | ||||
| let _pendingAsyncCallbacks = []; | ||||
|  | ||||
| /** | ||||
|  * LoginManager: | ||||
|  * An abstraction over systemd/logind and ConsoleKit. | ||||
|  * | ||||
|  */ | ||||
| function getLoginManager() { | ||||
| function getLoginManager(asyncCallback) { | ||||
|     if (_loginManager == null) { | ||||
|         if (haveSystemd()) | ||||
|             _loginManager = new LoginManagerSystemd(); | ||||
|         else | ||||
|             _loginManager = new LoginManagerConsoleKit(); | ||||
|     } | ||||
|         if (_pendingAsyncCallbacks.length == 0) { | ||||
|             let manager; | ||||
|  | ||||
|     return _loginManager; | ||||
|             if (haveSystemd()) | ||||
|                 manager = new LoginManagerSystemd(); | ||||
|             else | ||||
|                 manager = new LoginManagerConsoleKit(); | ||||
|  | ||||
|             manager.initAsync(null, function(obj, result) { | ||||
|                 obj.initFinish(result); | ||||
|  | ||||
|                 _loginManager = manager; | ||||
|  | ||||
|                 _pendingAsyncCallbacks.forEach(function (f) { f(obj) }); | ||||
|                 _pendingAsyncCallbacks = []; | ||||
|             }); | ||||
|  | ||||
|             _pendingAsyncCallbacks = [asyncCallback]; | ||||
|         } else { | ||||
|             _pendingAsyncCallbacks.push(asyncCallback); | ||||
|         } | ||||
|     } else { | ||||
|         GLib.idle_add(GLib.PRIORITY_DEFAULT, function() { | ||||
|             asyncCallback(_loginManager); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| const LoginManagerSystemd = new Lang.Class({ | ||||
|     Name: 'LoginManagerSystemd', | ||||
|     Extends: GObject.Object, | ||||
|  | ||||
|     _init: function() { | ||||
|         this._proxy = new SystemdLoginManager(Gio.DBus.system, | ||||
|                                               'org.freedesktop.login1', | ||||
|                                               '/org/freedesktop/login1'); | ||||
|         this.parent(); | ||||
|  | ||||
|         this._proxy = new SystemdLoginManager(); | ||||
|     }, | ||||
|  | ||||
|     initAsync: function(cancellable, asyncCallback) { | ||||
|         let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null); | ||||
|         simpleResult.set_check_cancellable(cancellable); | ||||
|  | ||||
|         this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 proxy.init_finish(result); | ||||
|  | ||||
|                 if (cancellable && cancellable.is_cancelled()) | ||||
|                     return; | ||||
|  | ||||
|                 this._fetchCurrentSession(cancellable, simpleResult); | ||||
|             } catch(e if e instanceof GLib.Error) { | ||||
|                 simpleResult.set_from_error(e); | ||||
|                 simpleResult.complete(); | ||||
|             } | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     initFinish: function(simpleResult) { | ||||
|         if (!simpleResult.propagate_error()) | ||||
|             return simpleResult.get_op_res_gboolean(); | ||||
|  | ||||
|         return true; | ||||
|     }, | ||||
|  | ||||
|     _fetchCurrentSession: function(cancellable, simpleResult) { | ||||
|         this._currentSession = new SystemdLoginSession('/org/freedesktop/login1/session/' + | ||||
|                                                        GLib.getenv('XDG_SESSION_ID')); | ||||
|  | ||||
|         this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 proxy.init_finish(result); | ||||
|  | ||||
|                 simpleResult.set_op_res_gboolean(true); | ||||
|             } catch(e if e instanceof GLib.Error) { | ||||
|                 simpleResult.set_from_error(e); | ||||
|             } | ||||
|  | ||||
|             simpleResult.complete(); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     // Having this function is a bit of a hack since the Systemd and ConsoleKit | ||||
|     // session objects have different interfaces - but in both cases there are | ||||
|     // Lock/Unlock signals, and that's all we count upon at the moment. | ||||
|     // | ||||
|     // This is only valid after async initialization | ||||
|     getCurrentSessionProxy: function() { | ||||
|         if (!this._currentSession) { | ||||
|             this._currentSession = new SystemdLoginSession(Gio.DBus.system, | ||||
|                                                            'org.freedesktop.login1', | ||||
|                                                            '/org/freedesktop/login1/session/' + | ||||
|                                                            GLib.getenv('XDG_SESSION_ID')); | ||||
|         } | ||||
|  | ||||
|         return this._currentSession; | ||||
|     }, | ||||
|  | ||||
| @@ -114,66 +210,126 @@ const LoginManagerSystemd = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     canPowerOff: function(asyncCallback) { | ||||
|         this._proxy.CanPowerOffRemote(function(result, error) { | ||||
|             if (error) | ||||
|                 asyncCallback(false); | ||||
|             else | ||||
|                 asyncCallback(result[0] != 'no'); | ||||
|         this._proxy.CanPowerOffRemote(null, function(proxy, result) { | ||||
|             let val = false; | ||||
|  | ||||
|             try { | ||||
|                 val = proxy.CanPowerOffFinish(result)[0] != 'no'; | ||||
|             } catch(e) { } | ||||
|  | ||||
|             asyncCallback(val); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     canReboot: function(asyncCallback) { | ||||
|         this._proxy.CanRebootRemote(function(result, error) { | ||||
|             if (error) | ||||
|                 asyncCallback(false); | ||||
|             else | ||||
|                 asyncCallback(result[0] != 'no'); | ||||
|         this._proxy.CanRebootRemote(null, function(proxy, result) { | ||||
|             let val = false; | ||||
|  | ||||
|             try { | ||||
|                 val = proxy.CanRebootFinish(result)[0] != 'no'; | ||||
|             } catch(e) { } | ||||
|  | ||||
|             asyncCallback(val); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     canSuspend: function(asyncCallback) { | ||||
|         this._proxy.CanSuspendRemote(function(result, error) { | ||||
|             if (error) | ||||
|                 asyncCallback(false); | ||||
|             else | ||||
|                 asyncCallback(result[0] != 'no'); | ||||
|         this._proxy.CanSuspendRemote(null, function(proxy, result) { | ||||
|             let val = false; | ||||
|  | ||||
|             try { | ||||
|                 val = proxy.CanRebootFinish(result)[0] != 'no'; | ||||
|             } catch(e) { } | ||||
|  | ||||
|             asyncCallback(val); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     powerOff: function() { | ||||
|         this._proxy.PowerOffRemote(true); | ||||
|         this._proxy.PowerOffRemote(true, null, null); | ||||
|     }, | ||||
|  | ||||
|     reboot: function() { | ||||
|         this._proxy.RebootRemote(true); | ||||
|         this._proxy.RebootRemote(true, null, null); | ||||
|     }, | ||||
|  | ||||
|     suspend: function() { | ||||
|         this._proxy.SuspendRemote(true); | ||||
|         this._proxy.SuspendRemote(true, null, null); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const LoginManagerConsoleKit = new Lang.Class({ | ||||
|     Name: 'LoginManagerConsoleKit', | ||||
|     Extends: GObject.Object, | ||||
|  | ||||
|     _init: function() { | ||||
|         this._proxy = new ConsoleKitManager(Gio.DBus.system, | ||||
|                                             'org.freedesktop.ConsoleKit', | ||||
|                                             '/org/freedesktop/ConsoleKit/Manager'); | ||||
|         this.parent(); | ||||
|  | ||||
|         this._proxy = new ConsoleKitManager(); | ||||
|         this._upClient = new UPowerGlib.Client(); | ||||
|     }, | ||||
|  | ||||
|     initAsync: function(cancellable, asyncCallback) { | ||||
|         let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null); | ||||
|         simpleResult.set_check_cancellable(cancellable); | ||||
|  | ||||
|         this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 proxy.init_finish(result); | ||||
|  | ||||
|                 if (cancellable && cancellable.is_cancelled()) | ||||
|                     return; | ||||
|  | ||||
|                 this._fetchCurrentSession(cancellable, simpleResult); | ||||
|             } catch(e if e instanceof GLib.Error) { | ||||
|                 simpleResult.set_from_error(e); | ||||
|                 simpleResult.complete(); | ||||
|             } | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     initFinish: function(simpleResult) { | ||||
|         if (!simpleResult.propagate_error()) | ||||
|             return simpleResult.get_op_res_gboolean(); | ||||
|  | ||||
|         return true; | ||||
|     }, | ||||
|  | ||||
|     _fetchCurrentSession: function(cancellable, simpleResult) { | ||||
|         this._proxy.GetCurrentSessionRemote(cancellable, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 let [currentSessionId] = proxy.GetCurrentSessionFinish(result); | ||||
|  | ||||
|                 if (cancellable && cancellable.is_cancelled()) | ||||
|                     return; | ||||
|  | ||||
|                 this._createSessionProxy(currentSessionId, cancellable, simpleResult); | ||||
|             } catch(e if e instanceof GLib.Error) { | ||||
|                 simpleResult.set_from_error(e); | ||||
|                 simpleResult.complete(); | ||||
|             } | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     _createSessionProxy: function(currentSessionId, cancellable, simpleResult) { | ||||
|         this._currentSession = new ConsoleKitSession(currentSessionId); | ||||
|         this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 proxy.init_finish(result); | ||||
|  | ||||
|                 simpleResult.set_op_res_gboolean(true); | ||||
|             } catch(e if e instanceof GLib.Error) { | ||||
|                 simpleResult.set_from_error(e); | ||||
|             } | ||||
|  | ||||
|             simpleResult.complete(); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     // Having this function is a bit of a hack since the Systemd and ConsoleKit | ||||
|     // session objects have different interfaces - but in both cases there are | ||||
|     // Lock/Unlock signals, and that's all we count upon at the moment. | ||||
|     getCurrentSessionProxy: function() { | ||||
|         if (!this._currentSession) { | ||||
|             let [currentSessionId] = this._proxy.GetCurrentSessionSync(); | ||||
|             this._currentSession = new ConsoleKitSession(Gio.DBus.system, | ||||
|                                                          'org.freedesktop.ConsoleKit', | ||||
|                                                          currentSessionId); | ||||
|         } | ||||
|  | ||||
|         return this._currentSession; | ||||
|     }, | ||||
|  | ||||
| @@ -185,26 +341,32 @@ const LoginManagerConsoleKit = new Lang.Class({ | ||||
|         session.connectSignal('ActiveChanged', Lang.bind(this, function(object, senderName, [isActive]) { | ||||
|             this._sessionActive = isActive; | ||||
|         })); | ||||
|         [this._sessionActive] = session.IsActiveSync(); | ||||
|         [this._sessionActive] = session.IsActiveSync(null); | ||||
|  | ||||
|         return this._sessionActive; | ||||
|     }, | ||||
|  | ||||
|     canPowerOff: function(asyncCallback) { | ||||
|         this._proxy.CanStopRemote(function(result, error) { | ||||
|             if (error) | ||||
|                 asyncCallback(false); | ||||
|             else | ||||
|                 asyncCallback(result[0]); | ||||
|         this._proxy.CanStopRemote(null, function(proxy, result) { | ||||
|             let val = false; | ||||
|  | ||||
|             try { | ||||
|                 [val] = proxy.CanStopFinish(result); | ||||
|             } catch(e) { } | ||||
|  | ||||
|             asyncCallback(val); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     canReboot: function(asyncCallback) { | ||||
|         this._proxy.CanRestartRemote(function(result, error) { | ||||
|             if (error) | ||||
|                 asyncCallback(false); | ||||
|             else | ||||
|                 asyncCallback(result[0]); | ||||
|         this._proxy.CanRestartRemote(null, function(proxy, result) { | ||||
|             let val = false; | ||||
|  | ||||
|             try { | ||||
|                 [val] = proxy.CanRestartFinish(result); | ||||
|             } catch(e) { } | ||||
|  | ||||
|             asyncCallback(val); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
| @@ -216,11 +378,11 @@ const LoginManagerConsoleKit = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     powerOff: function() { | ||||
|         this._proxy.StopRemote(); | ||||
|         this._proxy.StopRemote(null, null); | ||||
|     }, | ||||
|  | ||||
|     reboot: function() { | ||||
|         this._proxy.RestartRemote(); | ||||
|         this._proxy.RestartRemote(null, null); | ||||
|     }, | ||||
|  | ||||
|     suspend: function() { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const Gio = imports.gi.Gio; | ||||
| const GLib = imports.gi.GLib; | ||||
| const Lang = imports.lang; | ||||
| const Shell = imports.gi.Shell; | ||||
| const Signals = imports.signals; | ||||
| @@ -26,7 +27,16 @@ const ModemGsmNetworkInterface = <interface name="org.freedesktop.ModemManager.M | ||||
| </signal> | ||||
| </interface>; | ||||
|  | ||||
| const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface); | ||||
| const ModemGsmNetworkProxy = new Gio.DBusProxyClass({ | ||||
|     Name: 'ModemGsmNetworkProxy', | ||||
|     Interface: ModemGsmNetworkInterface, | ||||
|  | ||||
|     _init: function(modem) { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.ModemManager', | ||||
|                       g_object_path: modem }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma"> | ||||
| <method name="GetSignalQuality"> | ||||
| @@ -40,7 +50,16 @@ const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.C | ||||
| </signal> | ||||
| </interface>; | ||||
|  | ||||
| const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface); | ||||
| const ModemCdmaProxy = new Gio.DBusProxyClass({ | ||||
|     Name: 'ModemCdmaProxy', | ||||
|     Interface: ModemCdmaInterface, | ||||
|  | ||||
|     _init: function(modem) { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SYSTEM, | ||||
|                       g_name: 'org.freedesktop.ModemManager', | ||||
|                       g_object_path: modem }); | ||||
|     }, | ||||
| }); | ||||
|  | ||||
| let _providersTable; | ||||
| function _getProvidersTable() { | ||||
| @@ -54,11 +73,18 @@ const ModemGsm = new Lang.Class({ | ||||
|     Name: 'ModemGsm', | ||||
|  | ||||
|     _init: function(path) { | ||||
|         this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); | ||||
|         this._proxy = new ModemGsmNetworkProxy(path); | ||||
|         this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) { | ||||
|             obj.init_finish(result); | ||||
|  | ||||
|             this._finishInit(); | ||||
|         })); | ||||
|  | ||||
|         this.signal_quality = 0; | ||||
|         this.operator_name = null; | ||||
|     }, | ||||
|  | ||||
|     _finishInit: function() { | ||||
|         // Code is duplicated because the function have different signatures | ||||
|         this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, [quality]) { | ||||
|             this.signal_quality = quality; | ||||
| @@ -68,24 +94,19 @@ const ModemGsm = new Lang.Class({ | ||||
|             this.operator_name = this._findOperatorName(name, code); | ||||
|             this.emit('notify::operator-name'); | ||||
|         })); | ||||
|         this._proxy.GetRegistrationInfoRemote(Lang.bind(this, function([result], err) { | ||||
|             if (err) { | ||||
|                 log(err); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             let [status, code, name] = result; | ||||
|         this._proxy.GetRegistrationInfoRemote(null, Lang.bind(this, function(proxy, result) { | ||||
|             let [status, code, name] = proxy.GetRegistrationInfoFinish(result); | ||||
|             this.operator_name = this._findOperatorName(name, code); | ||||
|             this.emit('notify::operator-name'); | ||||
|         })); | ||||
|         this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) { | ||||
|             if (err) { | ||||
|         this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 [this.signal_quality] = proxy.GetSignalQualityFinish(result); | ||||
|             } catch(e) { | ||||
|                 // it will return an error if the device is not connected | ||||
|                 this.signal_quality = 0; | ||||
|             } else { | ||||
|                 let [quality] = result; | ||||
|                 this.signal_quality = quality; | ||||
|             } | ||||
|  | ||||
|             this.emit('notify::signal-quality'); | ||||
|         })); | ||||
|     }, | ||||
| @@ -157,10 +178,18 @@ const ModemCdma = new Lang.Class({ | ||||
|     Name: 'ModemCdma', | ||||
|  | ||||
|     _init: function(path) { | ||||
|         this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); | ||||
|         this._proxy = new ModemCdmaProxy(path); | ||||
|         this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) { | ||||
|             obj.init_finish(result); | ||||
|  | ||||
|             this._finishInit(); | ||||
|         })); | ||||
|  | ||||
|         this.signal_quality = 0; | ||||
|         this.operator_name = null; | ||||
|     }, | ||||
|  | ||||
|     _finishInit: function() { | ||||
|         this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, params) { | ||||
|             this.signal_quality = params[0]; | ||||
|             this.emit('notify::signal-quality'); | ||||
| @@ -170,30 +199,31 @@ const ModemCdma = new Lang.Class({ | ||||
|             if (this.operator_name == null) | ||||
|                 this._refreshServingSystem(); | ||||
|         })); | ||||
|         this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) { | ||||
|             if (err) { | ||||
|         this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 [this.signal_quality] = proxy.GetSignalQualityFinish(result); | ||||
|             } catch(e) { | ||||
|                 // it will return an error if the device is not connected | ||||
|                 this.signal_quality = 0; | ||||
|             } else { | ||||
|                 let [quality] = result; | ||||
|                 this.signal_quality = quality; | ||||
|             } | ||||
|  | ||||
|             this.emit('notify::signal-quality'); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     _refreshServingSystem: function() { | ||||
|         this._proxy.GetServingSystemRemote(Lang.bind(this, function([result], err) { | ||||
|             if (err) { | ||||
|                 // it will return an error if the device is not connected | ||||
|                 this.operator_name = null; | ||||
|             } else { | ||||
|                 let [bandClass, band, id] = result; | ||||
|         this._proxy.GetServingSystemRemote(null, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 let [bandClass, band, name] = proxy.GetServingSystemFinish(result); | ||||
|                 if (name.length > 0) | ||||
|                     this.operator_name = this._findProviderForSid(id); | ||||
|                     this.operator_name = this._findProviderForSid(name); | ||||
|                 else | ||||
|                     this.operator_name = null; | ||||
|             } catch(e) { | ||||
|                 // it will return an error if the device is not connected | ||||
|                 this.operator_name = null; | ||||
|             } | ||||
|  | ||||
|             this.emit('notify::operator-name'); | ||||
|         })); | ||||
|     }, | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const Clutter = imports.gi.Clutter; | ||||
| const GLib = imports.gi.GLib; | ||||
| const Gio = imports.gi.Gio; | ||||
| const Lang = imports.lang; | ||||
| const St = imports.gi.St; | ||||
| @@ -200,19 +201,17 @@ const CalendarServerIface = <interface name="org.gnome.Shell.CalendarServer"> | ||||
| <signal name="Changed" /> | ||||
| </interface>; | ||||
|  | ||||
| const CalendarServerInfo  = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface); | ||||
| const CalendarServer = new Gio.DBusProxyClass({ | ||||
|     Name: 'CalendarServer', | ||||
|     Interface: CalendarServerIface, | ||||
|  | ||||
| function CalendarServer() { | ||||
|     var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session, | ||||
|                                    g_interface_name: CalendarServerInfo.name, | ||||
|                                    g_interface_info: CalendarServerInfo, | ||||
|                                    g_name: 'org.gnome.Shell.CalendarServer', | ||||
|                                    g_object_path: '/org/gnome/Shell/CalendarServer', | ||||
|                                    g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES }); | ||||
|  | ||||
|     self.init(null); | ||||
|     return self; | ||||
| } | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: 'org.gnome.Shell.CalendarServer', | ||||
|                       g_object_path: '/org/gnome/Shell/CalendarServer', | ||||
|                       g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| function _datesEqual(a, b) { | ||||
|     if (a < b) | ||||
| @@ -242,11 +241,15 @@ const DBusEventSource = new Lang.Class({ | ||||
|         this._dbusProxy = new CalendarServer(); | ||||
|         this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged)); | ||||
|  | ||||
|         this._dbusProxy.connect('notify::g-name-owner', Lang.bind(this, function() { | ||||
|             if (this._dbusProxy.g_name_owner) | ||||
|                 this._onNameAppeared(); | ||||
|             else | ||||
|                 this._onNameVanished(); | ||||
|         this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 proxy.init_finish(result); | ||||
|             } catch(e) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             this._resetCache(); | ||||
|             this.emit('changed'); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
| @@ -256,52 +259,52 @@ const DBusEventSource = new Lang.Class({ | ||||
|         this._lastRequestEnd = null; | ||||
|     }, | ||||
|  | ||||
|     _onNameAppeared: function(owner) { | ||||
|         this._resetCache(); | ||||
|         this._loadEvents(true); | ||||
|     }, | ||||
|  | ||||
|     _onNameVanished: function(oldOwner) { | ||||
|         this._resetCache(); | ||||
|         this.emit('changed'); | ||||
|     }, | ||||
|  | ||||
|     _onChanged: function() { | ||||
|         this._loadEvents(false); | ||||
|     }, | ||||
|  | ||||
|     _onEventsReceived: function(results, error) { | ||||
|         let newEvents = []; | ||||
|         let appointments = results ? results[0] : null; | ||||
|         if (appointments != null) { | ||||
|             for (let n = 0; n < appointments.length; n++) { | ||||
|                 let a = appointments[n]; | ||||
|                 let date = new Date(a[4] * 1000); | ||||
|                 let end = new Date(a[5] * 1000); | ||||
|                 let summary = a[1]; | ||||
|                 let allDay = a[3]; | ||||
|                 let event = new CalendarEvent(date, end, summary, allDay); | ||||
|                 newEvents.push(event); | ||||
|             } | ||||
|             newEvents.sort(function(event1, event2) { | ||||
|                 return event1.date.getTime() - event2.date.getTime(); | ||||
|             }); | ||||
|     _onEventsReceived: function(proxy, result) { | ||||
|         let appointments; | ||||
|         try { | ||||
|             [appointments] = proxy.call_finish(result).deep_unpack(); | ||||
|         } catch(e if e instanceof GLib.Error) { | ||||
|             // ignore errors coming from DBus | ||||
|             appointments = []; | ||||
|         } | ||||
|  | ||||
|         let newEvents = []; | ||||
|         for (let n = 0; n < appointments.length; n++) { | ||||
|             let a = appointments[n]; | ||||
|             let date = new Date(a[4] * 1000); | ||||
|             let end = new Date(a[5] * 1000); | ||||
|             let summary = a[1]; | ||||
|             let allDay = a[3]; | ||||
|             let event = new CalendarEvent(date, end, summary, allDay); | ||||
|             newEvents.push(event); | ||||
|         } | ||||
|         newEvents.sort(function(event1, event2) { | ||||
|             return event1.date.getTime() - event2.date.getTime(); | ||||
|         }); | ||||
|  | ||||
|         this._events = newEvents; | ||||
|         this.emit('changed'); | ||||
|     }, | ||||
|  | ||||
|     _loadEvents: function(forceReload) { | ||||
|         if (this._curRequestBegin && this._curRequestEnd){ | ||||
|             /* Can't use GetEventsRemote because we need to pass the | ||||
|                flags here */ | ||||
|             let callFlags = Gio.DBusCallFlags.NO_AUTO_START; | ||||
|             if (forceReload) | ||||
|                 callFlags = Gio.DBusCallFlags.NONE; | ||||
|             this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000, | ||||
|                                             this._curRequestEnd.getTime() / 1000, | ||||
|                                             forceReload, | ||||
|                                             Lang.bind(this, this._onEventsReceived), | ||||
|                                             callFlags); | ||||
|                  callFlags = Gio.DBusCallFlags.NONE; | ||||
|             this._dbusProxy.call("GetEvents", | ||||
|                                  GLib.Variant.new("(xxb)", [this._curRequestBegin.getTime() / 1000, | ||||
|                                                             this._curRequestEnd.getTime() / 1000, | ||||
|                                                             forceReload]), | ||||
|                                  callFlags, | ||||
|                                  -1, | ||||
|                                  null, | ||||
|                                  Lang.bind(this, this._onEventsReceived)); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
| @@ -394,7 +397,6 @@ const Calendar = new Lang.Class({ | ||||
|             this._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, function() { | ||||
|                 this._update(false); | ||||
|             })); | ||||
|             this._update(true); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|   | ||||
| @@ -33,7 +33,9 @@ const AutomountManager = new Lang.Class({ | ||||
|                                     Lang.bind(this, this._InhibitorsChanged)); | ||||
|         this._inhibited = false; | ||||
|  | ||||
|         this._loginManager = LoginManager.getLoginManager(); | ||||
|         LoginManager.getLoginManager(Lang.bind(this, function(manager) { | ||||
|             this._loginManager = manager; | ||||
|         })); | ||||
|         this._volumeMonitor = Gio.VolumeMonitor.get(); | ||||
|     }, | ||||
|  | ||||
| @@ -85,7 +87,7 @@ const AutomountManager = new Lang.Class({ | ||||
|     _onDriveConnected: function() { | ||||
|         // if we're not in the current ConsoleKit session, | ||||
|         // or screensaver is active, don't play sounds | ||||
|         if (!this._loginManager.sessionActive) | ||||
|         if (!this._loginManager || !this._loginManager.sessionActive) | ||||
|             return; | ||||
|  | ||||
|         global.play_theme_sound(0, 'device-added-media'); | ||||
| @@ -94,7 +96,7 @@ const AutomountManager = new Lang.Class({ | ||||
|     _onDriveDisconnected: function() { | ||||
|         // if we're not in the current ConsoleKit session, | ||||
|         // or screensaver is active, don't play sounds | ||||
|         if (!this._loginManager.sessionActive) | ||||
|         if (!this._loginManager || !this._loginManager.sessionActive) | ||||
|             return; | ||||
|  | ||||
|         global.play_theme_sound(0, 'device-removed-media');         | ||||
| @@ -103,7 +105,7 @@ const AutomountManager = new Lang.Class({ | ||||
|     _onDriveEjectButton: function(monitor, drive) { | ||||
|         // TODO: this code path is not tested, as the GVfs volume monitor | ||||
|         // doesn't emit this signal just yet. | ||||
|         if (!this._loginManager.sessionActive) | ||||
|         if (!this._loginManager || !this._loginManager.sessionActive) | ||||
|             return; | ||||
|  | ||||
|         // we force stop/eject in this case, so we don't have to pass a | ||||
| @@ -143,7 +145,7 @@ const AutomountManager = new Lang.Class({ | ||||
|         if (params.checkSession) { | ||||
|             // if we're not in the current ConsoleKit session, | ||||
|             // don't attempt automount | ||||
|             if (!this._loginManager.sessionActive) | ||||
|             if (!this._loginManager || !this._loginManager.sessionActive) | ||||
|                 return; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| const Lang = imports.lang; | ||||
| const Gio = imports.gi.Gio; | ||||
| const GLib = imports.gi.GLib; | ||||
| const St = imports.gi.St; | ||||
|  | ||||
| const LoginManager = imports.misc.loginManager; | ||||
| @@ -82,12 +83,16 @@ const HotplugSnifferIface = <interface name="org.gnome.Shell.HotplugSniffer"> | ||||
| </method> | ||||
| </interface>; | ||||
|  | ||||
| const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface); | ||||
| function HotplugSniffer() { | ||||
|     return new HotplugSnifferProxy(Gio.DBus.session, | ||||
|                                    'org.gnome.Shell.HotplugSniffer', | ||||
|                                    '/org/gnome/Shell/HotplugSniffer'); | ||||
| } | ||||
| const HotplugSniffer = new Gio.DBusProxyClass({ | ||||
|     Name: 'HotplugSnifferProxy', | ||||
|     Interface: HotplugSnifferIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: 'org.gnome.Shell.HotplugSniffer', | ||||
|                       g_object_path: '/org/gnome/Shell/HotplugSniffer' }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const ContentTypeDiscoverer = new Lang.Class({ | ||||
|     Name: 'ContentTypeDiscoverer', | ||||
| @@ -127,10 +132,14 @@ const ContentTypeDiscoverer = new Lang.Class({ | ||||
|             let root = mount.get_root(); | ||||
|  | ||||
|             let hotplugSniffer = new HotplugSniffer(); | ||||
|             hotplugSniffer.SniffURIRemote(root.get_uri(), | ||||
|                  Lang.bind(this, function([contentTypes]) { | ||||
|                      this._emitCallback(mount, contentTypes); | ||||
|                  })); | ||||
|             hotplugSniffer.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|                 proxy.init_finish(result); | ||||
|  | ||||
|                 proxy.SniffURIRemote(root.get_uri(), null, Lang.bind(this, function(proxy, result) { | ||||
|                     let [contentTypes] = proxy.SniffURIFinish(result); | ||||
|                     this._emitCallback(mount, contentTypes); | ||||
|                 })); | ||||
|             })); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
| @@ -162,7 +171,9 @@ const AutorunManager = new Lang.Class({ | ||||
|     Name: 'AutorunManager', | ||||
|  | ||||
|     _init: function() { | ||||
|         this._loginManager = LoginManager.getLoginManager(); | ||||
|         LoginManager.getLoginManager(Lang.bind(this, function(manager) { | ||||
|             this._loginManager = manager; | ||||
|         })); | ||||
|  | ||||
|         this._volumeMonitor = Gio.VolumeMonitor.get(); | ||||
|  | ||||
| @@ -215,7 +226,7 @@ const AutorunManager = new Lang.Class({ | ||||
|     _onMountAdded: function(monitor, mount) { | ||||
|         // don't do anything if our session is not the currently | ||||
|         // active one | ||||
|         if (!this._loginManager.sessionActive) | ||||
|         if (!this._loginManager || !this._loginManager.sessionActive) | ||||
|             return; | ||||
|  | ||||
|         this._processMount(mount, true); | ||||
|   | ||||
| @@ -218,6 +218,34 @@ function init() { | ||||
|     _endSessionDialog = new EndSessionDialog(); | ||||
| } | ||||
|  | ||||
| const EndSessionExporter = new Gio.DBusImplementerClass({ | ||||
|     Name: 'EndSessionExporter', | ||||
|     Interface: EndSessionDialogIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent(); | ||||
|  | ||||
|         this.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog'); | ||||
|     }, | ||||
|  | ||||
|     OpenAsync: function(parameters, invocation) { | ||||
|         this.emit('open', parameters, invocation); | ||||
|     }, | ||||
|  | ||||
|     close: function() { | ||||
|         this.emit_signal('Closed'); | ||||
|     }, | ||||
|  | ||||
|     cancel: function() { | ||||
|         this.emit_signal('Canceled'); | ||||
|     }, | ||||
|  | ||||
|     confirm: function(type) { | ||||
|         this.emit_signal(type); | ||||
|     }, | ||||
| }); | ||||
| Signals.addSignalMethods(EndSessionExporter.prototype); | ||||
|  | ||||
| const EndSessionDialog = new Lang.Class({ | ||||
|     Name: 'EndSessionDialog', | ||||
|     Extends: ModalDialog.ModalDialog, | ||||
| @@ -295,8 +323,8 @@ const EndSessionDialog = new Lang.Class({ | ||||
|                                               scrollView.hide(); | ||||
|                                       })); | ||||
|  | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog'); | ||||
|         this._exporter = new EndSessionExporter(); | ||||
|         this._exporter.connect('open', Lang.bind(this, this._onOpenRequest)); | ||||
|     }, | ||||
|  | ||||
|     _onDestroy: function() { | ||||
| @@ -387,19 +415,19 @@ const EndSessionDialog = new Lang.Class({ | ||||
|  | ||||
|     close: function() { | ||||
|         this.parent(); | ||||
|         this._dbusImpl.emit_signal('Closed', null); | ||||
|         this._exporter.close(); | ||||
|     }, | ||||
|  | ||||
|     cancel: function() { | ||||
|         this._stopTimer(); | ||||
|         this._dbusImpl.emit_signal('Canceled', null); | ||||
|         this._exporter.cancel(); | ||||
|         this.close(global.get_current_time()); | ||||
|     }, | ||||
|  | ||||
|     _confirm: function(signal) { | ||||
|         this._fadeOutDialog(); | ||||
|         this._stopTimer(); | ||||
|         this._dbusImpl.emit_signal(signal, null); | ||||
|         this._exporter.confirm(signal); | ||||
|     }, | ||||
|  | ||||
|     _onOpened: function() { | ||||
| @@ -452,7 +480,7 @@ const EndSessionDialog = new Lang.Class({ | ||||
|         this._updateContent(); | ||||
|     }, | ||||
|  | ||||
|     OpenAsync: function(parameters, invocation) { | ||||
|     _onOpenRequest: function(exporter, parameters, invocation) { | ||||
|         let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters; | ||||
|         this._totalSecondsToStayOpen = totalSecondsToStayOpen; | ||||
|         this._inhibitors = []; | ||||
| @@ -466,7 +494,10 @@ const EndSessionDialog = new Lang.Class({ | ||||
|         } | ||||
|  | ||||
|         for (let i = 0; i < inhibitorObjectPaths.length; i++) { | ||||
|             let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i], Lang.bind(this, function(proxy, error) { | ||||
|             let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i]); | ||||
|             inhibitor.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|                 proxy.init_finish(result); | ||||
|  | ||||
|                 this._onInhibitorLoaded(proxy); | ||||
|             })); | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,6 @@ | ||||
|  | ||||
| const Caribou = imports.gi.Caribou; | ||||
| const Clutter = imports.gi.Clutter; | ||||
| const DBus = imports.dbus; | ||||
| const Gdk = imports.gi.Gdk; | ||||
| const Gio = imports.gi.Gio; | ||||
| const GLib = imports.gi.GLib; | ||||
| @@ -191,13 +190,14 @@ const Key = new Lang.Class({ | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const Keyboard = new Lang.Class({ | ||||
| const Keyboard = new Gio.DBusImplementerClass({ | ||||
|     // HACK: we can't set Name, because it collides with Name dbus property | ||||
|     // Name: 'Keyboard', | ||||
|     Interface: CaribouKeyboardIface, | ||||
|  | ||||
|     _init: function () { | ||||
|         this._impl = Gio.DBusExportedObject.wrapJSObject(CaribouKeyboardIface, this); | ||||
|         this._impl.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard'); | ||||
|         this.parent(); | ||||
|         this.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard'); | ||||
|  | ||||
|         this.actor = null; | ||||
|         this._focusInTray = false; | ||||
|   | ||||
| @@ -96,14 +96,15 @@ const ZoomRegionIface = <interface name={ZOOM_SERVICE_NAME}> | ||||
| // '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc. | ||||
| let _zoomRegionInstanceCount = 0; | ||||
|  | ||||
| const ShellMagnifier = new Lang.Class({ | ||||
| const ShellMagnifier = new Gio.DBusImplementerClass({ | ||||
|     Name: 'ShellMagnifier', | ||||
|     Interface: MagnifierIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this._zoomers = {}; | ||||
|         this.parent(); | ||||
|         this.export(Gio.DBus.session, MAG_SERVICE_PATH); | ||||
|  | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH); | ||||
|         this._zoomers = {}; | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -332,14 +333,15 @@ const ShellMagnifier = new Lang.Class({ | ||||
|  * @zoomerObjectPath:   String that is the path to a DBus ZoomRegion. | ||||
|  * @zoomRegion:         The actual zoom region associated with the object path. | ||||
|  */ | ||||
| const ShellMagnifierZoomRegion = new Lang.Class({ | ||||
| const ShellMagnifierZoomRegion = new Gio.DBusImplementerClass({ | ||||
|     Name: 'ShellMagnifierZoomRegion', | ||||
|     Interface: ZoomRegionIface, | ||||
|  | ||||
|     _init: function(zoomerObjectPath, zoomRegion) { | ||||
|         this._zoomRegion = zoomRegion; | ||||
|         this.parent(); | ||||
|         this.export(Gio.DBus.session, zoomerObjectPath); | ||||
|  | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath); | ||||
|         this._zoomRegion = zoomRegion; | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -417,6 +419,6 @@ const ShellMagnifierZoomRegion = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     destroy: function() { | ||||
|         this._dbusImpl.unexport(); | ||||
|         this.unexport(); | ||||
|     } | ||||
| }); | ||||
|   | ||||
| @@ -1365,13 +1365,16 @@ const MessageTray = new Lang.Class({ | ||||
|     Name: 'MessageTray', | ||||
|  | ||||
|     _init: function() { | ||||
|         this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) { | ||||
|         this._presence = new GnomeSession.Presence(); | ||||
|         this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|             proxy.init_finish(result); | ||||
|  | ||||
|             this._onStatusChanged(proxy.status); | ||||
|             this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { | ||||
|                 this._onStatusChanged(status); | ||||
|             })); | ||||
|         })); | ||||
|         this._busy = false; | ||||
|         this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { | ||||
|             this._onStatusChanged(status); | ||||
|         })); | ||||
|  | ||||
|         this.actor = new St.Widget({ name: 'message-tray', | ||||
|                                      reactive: true, | ||||
|   | ||||
| @@ -25,10 +25,19 @@ const BusIface = <interface name="org.freedesktop.DBus"> | ||||
| </method> | ||||
| </interface>; | ||||
|  | ||||
| var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface); | ||||
| function Bus() { | ||||
|     return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus'); | ||||
| } | ||||
| const Bus = new Gio.DBusProxyClass({ | ||||
|     Name: 'SessionBusProxy', | ||||
|     Interface: BusIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: 'org.freedesktop.DBus', | ||||
|                       g_object_path: '/org/freedesktop/DBus', | ||||
|                       g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | | ||||
|                                 Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS | | ||||
|                                 Gio.DBusProxyFlags.DO_NOT_AUTO_START) }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const NotificationDaemonIface = <interface name="org.freedesktop.Notifications"> | ||||
| <method name="Notify"> | ||||
| @@ -103,17 +112,20 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = { | ||||
|     'ibus-ui-gtk': 'keyboard' | ||||
| }; | ||||
|  | ||||
| const NotificationDaemon = new Lang.Class({ | ||||
| const NotificationDaemon = new Gio.DBusImplementerClass({ | ||||
|     Name: 'NotificationDaemon', | ||||
|     Interface: NotificationDaemonIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(NotificationDaemonIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications'); | ||||
|         this.parent(); | ||||
|         this.export(Gio.DBus.session, '/org/freedesktop/Notifications'); | ||||
|  | ||||
|         this._sources = []; | ||||
|         this._senderToPid = {}; | ||||
|         this._notifications = {}; | ||||
|         this._busProxy = new Bus(); | ||||
|         // This is synchronous but fast because of the flags we use. | ||||
|         this._busProxy.init(null); | ||||
|  | ||||
|         this._trayManager = new Shell.TrayManager(); | ||||
|         this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded)); | ||||
| @@ -316,18 +328,20 @@ const NotificationDaemon = new Lang.Class({ | ||||
|             return invocation.return_value(GLib.Variant.new('(u)', [id]));; | ||||
|         } | ||||
|  | ||||
|         this._busProxy.GetConnectionUnixProcessIDRemote(sender, Lang.bind(this, function (result, excp) { | ||||
|         this._busProxy.GetConnectionUnixProcessIDRemote(sender, null, Lang.bind(this, function (proxy, result) { | ||||
|             // The app may have updated or removed the notification | ||||
|             ndata = this._notifications[id]; | ||||
|             if (!ndata) | ||||
|                 return; | ||||
|  | ||||
|             if (excp) { | ||||
|              | ||||
|             let pid; | ||||
|             try { | ||||
|                 [pid] = proxy.GetConnectionUnixProcessIDFinish(result); | ||||
|             } catch(excp) { | ||||
|                 logError(excp, 'Call to GetConnectionUnixProcessID failed'); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             let [pid] = result; | ||||
|             source = this._getSource(appName, pid, ndata, sender, null); | ||||
|  | ||||
|             // We only store sender-pid entries for persistent sources. | ||||
| @@ -487,13 +501,11 @@ const NotificationDaemon = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _emitNotificationClosed: function(id, reason) { | ||||
|         this._dbusImpl.emit_signal('NotificationClosed', | ||||
|                                    GLib.Variant.new('(uu)', [id, reason])); | ||||
|         this.emit_signal('NotificationClosed', id, reason); | ||||
|     }, | ||||
|  | ||||
|     _emitActionInvoked: function(id, action) { | ||||
|         this._dbusImpl.emit_signal('ActionInvoked', | ||||
|                                    GLib.Variant.new('(us)', [id, action])); | ||||
|         this.emit_signal('ActionInvoked', id, action); | ||||
|     }, | ||||
|  | ||||
|     _onTrayIconAdded: function(o, icon) { | ||||
|   | ||||
| @@ -29,8 +29,15 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider"> | ||||
| </method> | ||||
| </interface>; | ||||
|  | ||||
| var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface); | ||||
| var SearchProviderProxy = new Gio.DBusProxyClass({ | ||||
|     Name: 'SearchProviderProxy', | ||||
|     Interface: SearchProviderIface, | ||||
|  | ||||
|     _init: function(params) { | ||||
|         params.g_bus_type = Gio.BusType.SESSION; | ||||
|         this.parent(params); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| function loadRemoteSearchProviders(addProviderCallback) { | ||||
|     let dataDirs = GLib.get_system_data_dirs(); | ||||
| @@ -90,13 +97,22 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb | ||||
|                                                           icon, | ||||
|                                                           busName, | ||||
|                                                           objectPath); | ||||
|                 remoteProvider.initAsync(null, function(obj, result) { | ||||
|                     try { | ||||
|                         remoteProvider.initFinish(result); | ||||
|                     } catch(e) { | ||||
|                         log('Failed to add search provider "%s": %s'.format(title, e.toString())); | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     addProviderCallback(remoteProvider); | ||||
|                 }); | ||||
|  | ||||
|                 loadedProviders[objectPath] = remoteProvider; | ||||
|             } catch(e) { | ||||
|                 log('Failed to add search provider "%s": %s'.format(title, e.toString())); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             addProviderCallback(remoteProvider); | ||||
|         } | ||||
|     })); | ||||
|  | ||||
| @@ -107,13 +123,41 @@ const RemoteSearchProvider = new Lang.Class({ | ||||
|     Extends: Search.SearchProvider, | ||||
|  | ||||
|     _init: function(title, icon, dbusName, dbusPath) { | ||||
|         this._proxy = new SearchProviderProxy(Gio.DBus.session, | ||||
|                                               dbusName, dbusPath); | ||||
|  | ||||
|         this.parent(title.toUpperCase()); | ||||
|  | ||||
|         this._proxy = new SearchProviderProxy({ g_name: dbusName, | ||||
|                                                 g_object_path: dbusPath }); | ||||
|         this._cancellable = new Gio.Cancellable(); | ||||
|     }, | ||||
|  | ||||
|     initAsync: function(cancellable, asyncCallback) { | ||||
|         // Can't pass "this" as source object, because RemoteSearchProvider | ||||
|         // is not a GObject.Object (and in gjs you can't inherit from a JS | ||||
|         // type that in turn inherits from GObject) | ||||
|  | ||||
|         let simpleResult = Gio.SimpleAsyncResult.new(null, asyncCallback, null); | ||||
|         simpleResult.set_check_cancellable(cancellable); | ||||
|  | ||||
|         this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 proxy.init_finish(result); | ||||
|  | ||||
|                 simpleResult.set_op_res_gboolean(true); | ||||
|             } catch(e if e instanceof GLib.Error) { | ||||
|                 simpleResult.set_from_error(e); | ||||
|             } | ||||
|  | ||||
|             simpleResult.complete(); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     initFinish: function(simpleResult) { | ||||
|         if (!simpleResult.propagate_error()) | ||||
|             return simpleResult.get_op_res_gboolean(); | ||||
|  | ||||
|         return false; | ||||
|     }, | ||||
|  | ||||
|     createIcon: function(size, meta) { | ||||
|         if (meta['gicon']) { | ||||
|             return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']), | ||||
| @@ -131,10 +175,17 @@ const RemoteSearchProvider = new Lang.Class({ | ||||
|                              icon_size: size }); | ||||
|     }, | ||||
|  | ||||
|     _getResultsFinished: function(results, error) { | ||||
|         if (error) | ||||
|             return; | ||||
|         this.searchSystem.pushResults(this, results[0]); | ||||
|     _getResultsFinished: function(proxy, result) { | ||||
|         try { | ||||
|             // We rely on a small implementation detail of the | ||||
|             // GDBus bindings here: all *Finish are equal | ||||
|  | ||||
|             let [results] = proxy.GetInitialResultSetFinish(result); | ||||
|             this.searchSystem.pushResults(this, results); | ||||
|         } catch(e) { | ||||
|             if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) | ||||
|                 log('Received error from search provider %s: %s'.format(this.title, String(e))); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     getInitialResultSet: function(terms) { | ||||
| @@ -142,8 +193,8 @@ const RemoteSearchProvider = new Lang.Class({ | ||||
|         this._cancellable.reset(); | ||||
|         try { | ||||
|             this._proxy.GetInitialResultSetRemote(terms, | ||||
|                                                   Lang.bind(this, this._getResultsFinished), | ||||
|                                                   this._cancellable); | ||||
|                                                   this._cancellable, | ||||
|                                                   Lang.bind(this, this._getResultsFinished)); | ||||
|         } catch(e) { | ||||
|             log('Error calling GetInitialResultSet for provider %s: %s'.format( this.title, e.toString())); | ||||
|             this.searchSystem.pushResults(this, []); | ||||
| @@ -155,30 +206,30 @@ const RemoteSearchProvider = new Lang.Class({ | ||||
|         this._cancellable.reset(); | ||||
|         try { | ||||
|             this._proxy.GetSubsearchResultSetRemote(previousResults, newTerms, | ||||
|                                                     Lang.bind(this, this._getResultsFinished), | ||||
|                                                     this._cancellable); | ||||
|                                                     this._cancellable, | ||||
|                                                     Lang.bind(this, this._getResultsFinished)) | ||||
|         } catch(e) { | ||||
|             log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.title, e.toString())); | ||||
|             this.searchSystem.pushResults(this, []); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     _getResultMetasFinished: function(results, error, callback) { | ||||
|         if (error) { | ||||
|     _getResultMetasFinished: function(proxy, result, callback) { | ||||
|         try { | ||||
|             let [metas] = results.GetResultMetasFinish(result); | ||||
|             let resultMetas = []; | ||||
|             for (let i = 0; i < metas.length; i++) { | ||||
|                 for (let prop in metas[i]) | ||||
|                     metas[i][prop] = metas[i][prop].deep_unpack(); | ||||
|                 resultMetas.push({ id: metas[i]['id'], | ||||
|                                    name: metas[i]['name'], | ||||
|                                    createIcon: Lang.bind(this, | ||||
|                                                          this.createIcon, metas[i]) }); | ||||
|             } | ||||
|             callback(resultMetas); | ||||
|         } catch(e) { | ||||
|             callback([]); | ||||
|             return; | ||||
|         } | ||||
|         let metas = results[0]; | ||||
|         let resultMetas = []; | ||||
|         for (let i = 0; i < metas.length; i++) { | ||||
|             for (let prop in metas[i]) | ||||
|                 metas[i][prop] = metas[i][prop].deep_unpack(); | ||||
|             resultMetas.push({ id: metas[i]['id'], | ||||
|                                name: metas[i]['name'], | ||||
|                                createIcon: Lang.bind(this, | ||||
|                                                      this.createIcon, metas[i]) }); | ||||
|         } | ||||
|         callback(resultMetas); | ||||
|     }, | ||||
|  | ||||
|     getResultMetas: function(ids, callback) { | ||||
| @@ -186,8 +237,8 @@ const RemoteSearchProvider = new Lang.Class({ | ||||
|         this._cancellable.reset(); | ||||
|         try { | ||||
|             this._proxy.GetResultMetasRemote(ids, | ||||
|                                              Lang.bind(this, this._getResultMetasFinished, callback), | ||||
|                                              this._cancellable); | ||||
|                                              this._cancellable, | ||||
|                                              Lang.bind(this, this._getResultMetasFinished, callback)); | ||||
|         } catch(e) { | ||||
|             log('Error calling GetResultMetas for provider %s: %s'.format(this.title, e.toString())); | ||||
|             callback([]); | ||||
| @@ -195,7 +246,7 @@ const RemoteSearchProvider = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     activateResult: function(id) { | ||||
|         this._proxy.ActivateResultRemote(id); | ||||
|         this._proxy.ActivateResultRemote(id, null, null); | ||||
|     } | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -418,10 +418,11 @@ const ScreenShield = new Lang.Class({ | ||||
|  | ||||
|         this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this); | ||||
|  | ||||
|         this._loginManager = LoginManager.getLoginManager(); | ||||
|         this._loginSession = this._loginManager.getCurrentSessionProxy(); | ||||
|         this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); })); | ||||
|         this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); })); | ||||
|         LoginManager.getLoginManager(Lang.bind(this, function(manager) { | ||||
|             this._loginSession = manager.getCurrentSessionProxy(); | ||||
|             this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); })); | ||||
|             this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); })); | ||||
|         })); | ||||
|  | ||||
|         this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA }); | ||||
|  | ||||
| @@ -875,6 +876,7 @@ const ScreenShieldFallback = new Lang.Class({ | ||||
|                                           g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START | | ||||
|                                                     Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES), | ||||
|                                         }); | ||||
|         // This is synchronous but it is the fallback case. | ||||
|         this._proxy.init(null); | ||||
|  | ||||
|         this._proxy.connect('g-signal', Lang.bind(this, this._onSignal)); | ||||
|   | ||||
| @@ -80,15 +80,23 @@ const PerfHelperIface = <interface name="org.gnome.Shell.PerfHelper"> | ||||
| <method name="DestroyWindows" /> | ||||
| </interface>; | ||||
|  | ||||
| var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface); | ||||
| function PerfHelper() { | ||||
|     return new PerfHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PerfHelper', '/org/gnome/Shell/PerfHelper'); | ||||
| } | ||||
| const PerfHelper = new Gio.DBusProxyClass({ | ||||
|     Name: 'PerfHelperProxy', | ||||
|     Interface: PerfHelperIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: 'org.gnome.Shell.PerfHelper', | ||||
|                       g_object_path: '/org/gnome/Shell/PerfHelper' }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| let _perfHelper = null; | ||||
| function _getPerfHelper() { | ||||
|     if (_perfHelper == null) | ||||
|     if (_perfHelper == null) { | ||||
|         _perfHelper = new PerfHelper(); | ||||
|         _perfHelper.init(null); | ||||
|     } | ||||
|  | ||||
|     return _perfHelper; | ||||
| } | ||||
| @@ -111,7 +119,8 @@ function createTestWindow(width, height, alpha, maximized) { | ||||
|     let perfHelper = _getPerfHelper(); | ||||
|  | ||||
|     perfHelper.CreateWindowRemote(width, height, alpha, maximized, | ||||
|                                   function(result, excp) { | ||||
|                                   null, | ||||
|                                   function(proxy, result) { | ||||
|                                       if (cb) | ||||
|                                           cb(); | ||||
|                                   }); | ||||
| @@ -131,7 +140,7 @@ function waitTestWindows() { | ||||
|     let cb; | ||||
|     let perfHelper = _getPerfHelper(); | ||||
|  | ||||
|     perfHelper.WaitWindowsRemote(function(result, excp) { | ||||
|     perfHelper.WaitWindowsRemote(null, function(proxy, result) { | ||||
|                                      if (cb) | ||||
|                                          cb(); | ||||
|                                  }); | ||||
| @@ -154,7 +163,7 @@ function destroyTestWindows() { | ||||
|     let cb; | ||||
|     let perfHelper = _getPerfHelper(); | ||||
|  | ||||
|     perfHelper.DestroyWindowsRemote(function(result, excp) { | ||||
|     perfHelper.DestroyWindowsRemote(null, function(proxy, result) { | ||||
|                                         if (cb) | ||||
|                                             cb(); | ||||
|                                     }); | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| const Gio = imports.gi.Gio; | ||||
| const GLib = imports.gi.GLib; | ||||
| const GObject = imports.gi.GObject; | ||||
| const Lang = imports.lang; | ||||
| const Signals = imports.signals; | ||||
| const Shell = imports.gi.Shell; | ||||
| @@ -75,6 +76,8 @@ const SearchProvider = new Lang.Class({ | ||||
|     Name: 'SearchProvider', | ||||
|  | ||||
|     _init: function(title) { | ||||
|         this.parent(); | ||||
|  | ||||
|         this.title = title; | ||||
|         this.searchSystem = null; | ||||
|     }, | ||||
|   | ||||
| @@ -67,14 +67,16 @@ const ScreenSaverIface = <interface name="org.gnome.ScreenSaver"> | ||||
| </signal> | ||||
| </interface>; | ||||
|  | ||||
| const GnomeShell = new Lang.Class({ | ||||
| const GnomeShell = new Gio.DBusImplementerClass({ | ||||
|     Name: 'GnomeShellDBus', | ||||
|     Interface: GnomeShellIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); | ||||
|         this.parent(); | ||||
|  | ||||
|         this._extensionsSerivce = new GnomeShellExtensions(); | ||||
|         this.export(Gio.DBus.session, '/org/gnome/Shell'); | ||||
|  | ||||
|         this._extensionsService = new GnomeShellExtensions(); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
| @@ -236,12 +238,14 @@ const GnomeShellExtensionsIface = <interface name="org.gnome.Shell.Extensions"> | ||||
| <property name="ShellVersion" type="s" access="read" /> | ||||
| </interface>; | ||||
|  | ||||
| const GnomeShellExtensions = new Lang.Class({ | ||||
| const GnomeShellExtensions = new Gio.DBusImplementerClass({ | ||||
|     Name: 'GnomeShellExtensionsDBus', | ||||
|     Interface: GnomeShellExtensionsIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); | ||||
|         this.parent(); | ||||
|  | ||||
|         this.export(Gio.DBus.session, '/org/gnome/Shell'); | ||||
|         ExtensionSystem.connect('extension-state-changed', | ||||
|                                 Lang.bind(this, this._extensionStateChanged)); | ||||
|     }, | ||||
| @@ -335,25 +339,23 @@ const GnomeShellExtensions = new Lang.Class({ | ||||
|     ShellVersion: Config.PACKAGE_VERSION, | ||||
|  | ||||
|     _extensionStateChanged: function(_, newState) { | ||||
|         this._dbusImpl.emit_signal('ExtensionStatusChanged', | ||||
|                                    GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error])); | ||||
|         this.emit_signal('ExtensionStatusChanged', newState.uuid, newState.state, newState.error); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const ScreenSaverDBus = new Lang.Class({ | ||||
| const ScreenSaverDBus = new Gio.DBusImplementerClass({ | ||||
|     Name: 'ScreenSaverDBus', | ||||
|     Interface: ScreenSaverIface, | ||||
|  | ||||
|     _init: function(screenShield) { | ||||
|         this.parent(); | ||||
|  | ||||
|         this._screenShield = screenShield; | ||||
|         screenShield.connect('lock-status-changed', Lang.bind(this, function(shield) { | ||||
|             this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.locked])); | ||||
|             this.emit_signal('ActiveChanged', shield.locked); | ||||
|         })); | ||||
|  | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver'); | ||||
|  | ||||
|         this.export(Gio.DBus.session, '/org/gnome/ScreenSaver'); | ||||
|         Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null); | ||||
|     }, | ||||
|  | ||||
|   | ||||
| @@ -554,14 +554,16 @@ const ShellMountOperationType = { | ||||
|     SHOW_PROCESSES: 3 | ||||
| }; | ||||
|  | ||||
| const GnomeShellMountOpHandler = new Lang.Class({ | ||||
| const GnomeShellMountOpHandler = new Gio.DBusImplementerClass({ | ||||
|     Name: 'GnomeShellMountOpHandler', | ||||
|     Interface: GnomeShellMountOpIface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this); | ||||
|         this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler'); | ||||
|         Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler', | ||||
|                                        Gio.BusNameOwnerFlags.REPLACE, null, null); | ||||
|         this.parent(); | ||||
|  | ||||
|         this.export(Gio.DBus.session, '/org/gtk/MountOperationHandler'); | ||||
|         Gio.DBus.session.own_name('org.gtk.MountOperationHandler', | ||||
|                                   Gio.BusNameOwnerFlags.REPLACE, null, null); | ||||
|  | ||||
|         this._dialog = null; | ||||
|         this._volumeMonitor = Gio.VolumeMonitor.get(); | ||||
|   | ||||
| @@ -1629,7 +1629,44 @@ const NMApplet = new Lang.Class({ | ||||
|         this.secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn-symbolic' })); | ||||
|         this.secondaryIcon.hide(); | ||||
|  | ||||
|         this._client = NMClient.Client.new(); | ||||
|         // Device types | ||||
|         this._dtypes = { }; | ||||
|         this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired; | ||||
|         this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless; | ||||
|         this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem; | ||||
|         this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth; | ||||
|         // TODO: WiMax support | ||||
|  | ||||
|         // Connection types | ||||
|         this._ctypes = { }; | ||||
|         this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS; | ||||
|         this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED; | ||||
|         this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED; | ||||
|         this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED; | ||||
|         this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN; | ||||
|         this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN; | ||||
|         this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN; | ||||
|         this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN; | ||||
|  | ||||
|         NMClient.Client.new_async(null, Lang.bind(this, this._clientGot)); | ||||
|         NMClient.RemoteSettings.new_async(null, null, Lang.bind(this, this._remoteSettingsGot)); | ||||
|     }, | ||||
|  | ||||
|     _clientGot: function(obj, result) { | ||||
|         this._client = NMClient.Client.new_finish(result); | ||||
|  | ||||
|         this._tryLateInit(); | ||||
|     }, | ||||
|  | ||||
|     _remoteSettingsGot: function(obj, result) { | ||||
|         this._settings = NMClient.RemoteSettings.new_finish(result); | ||||
|  | ||||
|         this._tryLateInit(); | ||||
|     }, | ||||
|  | ||||
|     _tryLateInit: function() { | ||||
|         if (!this._client || !this._settings) | ||||
|             return; | ||||
|  | ||||
|         this._statusSection = new PopupMenu.PopupMenuSection(); | ||||
|         this._statusItem = new PopupMenu.PopupMenuItem('', { reactive: false }); | ||||
| @@ -1690,44 +1727,17 @@ const NMApplet = new Lang.Class({ | ||||
|         this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); | ||||
|         this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop'); | ||||
|  | ||||
|         // Device types | ||||
|         this._dtypes = { }; | ||||
|         this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired; | ||||
|         this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless; | ||||
|         this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem; | ||||
|         this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth; | ||||
|         // TODO: WiMax support | ||||
|         this._readConnections(); | ||||
|         this._readDevices(); | ||||
|         this._syncNMState(); | ||||
|  | ||||
|         // Connection types | ||||
|         this._ctypes = { }; | ||||
|         this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS; | ||||
|         this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED; | ||||
|         this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED; | ||||
|         this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED; | ||||
|         this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN; | ||||
|         this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN; | ||||
|         this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN; | ||||
|         this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN; | ||||
|  | ||||
|         this._settings = NMClient.RemoteSettings.new(null); | ||||
|         this._connectionsReadId = this._settings.connect('connections-read', Lang.bind(this, function() { | ||||
|             this._readConnections(); | ||||
|             this._readDevices(); | ||||
|             this._syncNMState(); | ||||
|  | ||||
|             // Connect to signals late so that early signals don't find in inconsistent state | ||||
|             // and connect only once (this signal handler can be called again if NetworkManager goes up and down) | ||||
|             if (!this._inited) { | ||||
|                 this._inited = true; | ||||
|                 this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState)); | ||||
|                 this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState)); | ||||
|                 this._client.connect('notify::state', Lang.bind(this, this._syncNMState)); | ||||
|                 this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon)); | ||||
|                 this._client.connect('device-added', Lang.bind(this, this._deviceAdded)); | ||||
|                 this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved)); | ||||
|                 this._settings.connect('new-connection', Lang.bind(this, this._newConnection)); | ||||
|             } | ||||
|         })); | ||||
|         this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState)); | ||||
|         this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState)); | ||||
|         this._client.connect('notify::state', Lang.bind(this, this._syncNMState)); | ||||
|         this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon)); | ||||
|         this._client.connect('device-added', Lang.bind(this, this._deviceAdded)); | ||||
|         this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved)); | ||||
|         this._settings.connect('new-connection', Lang.bind(this, this._newConnection)); | ||||
|     }, | ||||
|  | ||||
|     _ensureSource: function() { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const Gio = imports.gi.Gio; | ||||
| const GLib = imports.gi.GLib; | ||||
| const Lang = imports.lang; | ||||
| const St = imports.gi.St; | ||||
|  | ||||
| @@ -45,7 +46,16 @@ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power"> | ||||
| <property name="Icon" type="s" access="read" /> | ||||
| </interface>; | ||||
|  | ||||
| const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface); | ||||
| const PowerManagerProxy = new Gio.DBusProxyClass({ | ||||
|     Name: 'PowerManagerProxy', | ||||
|     Interface: PowerManagerInterface, | ||||
|  | ||||
|     _init: function() { | ||||
|         this.parent({ g_bus_type: Gio.BusType.SESSION, | ||||
|                       g_name: BUS_NAME, | ||||
|                       g_object_path: OBJECT_PATH }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const Indicator = new Lang.Class({ | ||||
|     Name: 'PowerIndicator', | ||||
| @@ -54,7 +64,7 @@ const Indicator = new Lang.Class({ | ||||
|     _init: function() { | ||||
|         this.parent('battery-missing-symbolic', _("Battery")); | ||||
|  | ||||
|         this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH); | ||||
|         this._proxy = new PowerManagerProxy(); | ||||
|  | ||||
|         this._deviceItems = [ ]; | ||||
|         this._hasPrimary = false; | ||||
| @@ -73,18 +83,26 @@ const Indicator = new Lang.Class({ | ||||
|  | ||||
|         this._proxy.connect('g-properties-changed', | ||||
|                             Lang.bind(this, this._devicesChanged)); | ||||
|         this._devicesChanged(); | ||||
|         this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|             proxy.init_finish(result); | ||||
|  | ||||
|             this._devicesChanged(); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     _readPrimaryDevice: function() { | ||||
|         this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) { | ||||
|             if (error) { | ||||
|         this._proxy.GetPrimaryDeviceRemote(null, Lang.bind(this, function(proxy, result) { | ||||
|             let device_id, device_type, icon, percentage, state, seconds; | ||||
|             try { | ||||
|                 [[device_id, device_type, icon, percentage, state, seconds]] = | ||||
|                     proxy.GetPrimaryDeviceFinish(result); | ||||
|             } catch(e) { | ||||
|                 this._hasPrimary = false; | ||||
|                 this._primaryDeviceId = null; | ||||
|                 this._batteryItem.actor.hide(); | ||||
|                 return; | ||||
|             } | ||||
|             let [[device_id, device_type, icon, percentage, state, seconds]] = result; | ||||
|  | ||||
|             if (device_type == UPDeviceType.BATTERY) { | ||||
|                 this._hasPrimary = true; | ||||
|                 let time = Math.round(seconds / 60); | ||||
| @@ -121,16 +139,18 @@ const Indicator = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _readOtherDevices: function() { | ||||
|         this._proxy.GetDevicesRemote(Lang.bind(this, function(result, error) { | ||||
|         this._proxy.GetDevicesRemote(null, Lang.bind(this, function(proxy, result) { | ||||
|             this._deviceItems.forEach(function(i) { i.destroy(); }); | ||||
|             this._deviceItems = []; | ||||
|  | ||||
|             if (error) { | ||||
|             let devices; | ||||
|             try { | ||||
|                 [devices] = proxy.GetDevicesFinish(result); | ||||
|             } catch(e) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             let position = 0; | ||||
|             let [devices] = result; | ||||
|             for (let i = 0; i < devices.length; i++) { | ||||
|                 let [device_id, device_type] = devices[i]; | ||||
|                 if (device_type == UPDeviceType.AC_POWER || device_id == this._primaryDeviceId) | ||||
|   | ||||
| @@ -195,8 +195,12 @@ const IMStatusChooserItem = new Lang.Class({ | ||||
|                             Lang.bind(this, this._changeIMStatus)); | ||||
|  | ||||
|         this._presence = new GnomeSession.Presence(); | ||||
|         this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { | ||||
|             this._sessionStatusChanged(status); | ||||
|         this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) { | ||||
|             obj.init_finish(result); | ||||
|  | ||||
|             this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { | ||||
|                 this._sessionStatusChanged(status); | ||||
|             })); | ||||
|         })); | ||||
|  | ||||
|         this._sessionPresenceRestored = false; | ||||
| @@ -480,14 +484,33 @@ const UserMenuButton = new Lang.Class({ | ||||
|         this._userManager = AccountsService.UserManager.get_default(); | ||||
|  | ||||
|         this._user = this._userManager.get_user(GLib.get_user_name()); | ||||
|  | ||||
|         this._presence = new GnomeSession.Presence(); | ||||
|         this._session = new GnomeSession.SessionManager(); | ||||
|         this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|             proxy.init_finish(result); | ||||
|  | ||||
|             this._updateSwitch(this._presence.status); | ||||
|             this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) { | ||||
|                 this._updateSwitch(status); | ||||
|             })); | ||||
|         })); | ||||
|  | ||||
|         let session = new GnomeSession.SessionManager(); | ||||
|         session.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) { | ||||
|             // This should never fail. | ||||
|             proxy.init_finish(result); | ||||
|  | ||||
|             this._session = proxy; | ||||
|             this._updateHaveShutdown(); | ||||
|         })); | ||||
|         this._haveShutdown = true; | ||||
|         this._haveSuspend = true; | ||||
|  | ||||
|         this._accountMgr = Tp.AccountManager.dup(); | ||||
|  | ||||
|         this._loginManager = LoginManager.getLoginManager(); | ||||
|         LoginManager.getLoginManager(Lang.bind(this, function(manager) { | ||||
|             this._loginManager = manager; | ||||
|         })); | ||||
|         this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); | ||||
|  | ||||
|         this._iconBox = new St.Bin(); | ||||
| @@ -533,11 +556,6 @@ const UserMenuButton = new Lang.Class({ | ||||
|  | ||||
|         this._createSubMenu(); | ||||
|  | ||||
|         this._updateSwitch(this._presence.status); | ||||
|         this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) { | ||||
|             this._updateSwitch(status); | ||||
|         })); | ||||
|  | ||||
|         this._userManager.connect('notify::is-loaded', | ||||
|                                   Lang.bind(this, this._updateMultiUser)); | ||||
|         this._userManager.connect('notify::has-multiple-users', | ||||
| @@ -637,17 +655,29 @@ const UserMenuButton = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _updateHaveShutdown: function() { | ||||
|         this._session.CanShutdownRemote(Lang.bind(this, | ||||
|             function(result, error) { | ||||
|                 if (!error) { | ||||
|                     this._haveShutdown = result[0]; | ||||
|                     this._updateInstallUpdates(); | ||||
|                     this._updateSuspendOrPowerOff(); | ||||
|                 } | ||||
|             })); | ||||
|         if (!this._session) { | ||||
|             this._haveShutdown = false; | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._session.CanShutdownRemote(null, Lang.bind(this, function(proxy, result) { | ||||
|             try { | ||||
|                 [this._haveShutdown] = proxy.CanShutdownFinish(result); | ||||
|             } catch(e) { | ||||
|                 this._haveShutdown = false; | ||||
|             } | ||||
|  | ||||
|             this._updateInstallUpdates(); | ||||
|             this._updateSuspendOrPowerOff(); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     _updateHaveSuspend: function() { | ||||
|         if (!this._loginManager) { | ||||
|             this._haveSuspend = false; | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._loginManager.canSuspend(Lang.bind(this, | ||||
|             function(result) { | ||||
|                 this._haveSuspend = result; | ||||
| @@ -837,14 +867,17 @@ const UserMenuButton = new Lang.Class({ | ||||
|  | ||||
|     _onQuitSessionActivate: function() { | ||||
|         Main.overview.hide(); | ||||
|         this._session.LogoutRemote(0); | ||||
|  | ||||
|         if (this._session) | ||||
|             this._session.LogoutRemote(0, null, null); | ||||
|     }, | ||||
|  | ||||
|     _onInstallUpdatesActivate: function() { | ||||
|         Main.overview.hide(); | ||||
|         Util.spawn(['pkexec', '/usr/libexec/pk-trigger-offline-update']); | ||||
|  | ||||
|         this._session.RebootRemote(); | ||||
|         if (this._haveShutdown) | ||||
|             this._session.RebootRemote(null, null); | ||||
|     }, | ||||
|  | ||||
|     _onSuspendOrPowerOffActivate: function() { | ||||
| @@ -852,8 +885,8 @@ const UserMenuButton = new Lang.Class({ | ||||
|  | ||||
|         if (this._haveShutdown && | ||||
|             this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) { | ||||
|             this._session.ShutdownRemote(); | ||||
|         } else { | ||||
|             this._session.ShutdownRemote(null, null); | ||||
|         } else if (this._haveSuspend) { | ||||
|             if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) { | ||||
|                 let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() { | ||||
|                     Main.screenShield.disconnect(tmpId); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user