[gnome-shell] objectManager: handle proxies coming and going
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] objectManager: handle proxies coming and going
- Date: Thu, 22 Jun 2017 18:32:27 +0000 (UTC)
commit 9c8a47093470f6ddacaa9bdbd6d982d5ecd9942c
Author: Ray Strode <rstrode redhat com>
Date: Fri Oct 7 15:40:14 2016 -0400
objectManager: handle proxies coming and going
Ever since commit b8e29ae8c78658917c8a8ddd391667d7d9e36971
(I think), start up is littered with this message:
Gjs-WARNING **: JS ERROR: could not get remote objects for service
org.gnome.SettingsDaemon.Smartcard path
since gnome-shell is now started before gnome-settings-daemon.
This commit addresses the problem by making the object manager code
not try to autostart its proxy, and instead wait for it to appear.
https://bugzilla.gnome.org/show_bug.cgi?id=772589
js/misc/objectManager.js | 34 ++++++++++++++++++++++++++++++++--
1 files changed, 32 insertions(+), 2 deletions(-)
---
diff --git a/js/misc/objectManager.js b/js/misc/objectManager.js
index c86e47a..835057f 100644
--- a/js/misc/objectManager.js
+++ b/js/misc/objectManager.js
@@ -46,7 +46,7 @@ const ObjectManager = new Lang.Class({
g_interface_info: ObjectManagerInfo,
g_name: this._serviceName,
g_object_path: this._managerPath,
- g_flags: Gio.DBusProxyFlags.NONE });
+ g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
this._interfaceInfos = {};
this._objects = {};
@@ -65,6 +65,9 @@ const ObjectManager = new Lang.Class({
},
_tryToCompleteLoad: function() {
+ if (this._numLoadInhibitors == 0)
+ return;
+
this._numLoadInhibitors--;
if (this._numLoadInhibitors == 0) {
if (this._onLoaded)
@@ -86,7 +89,7 @@ const ObjectManager = new Lang.Class({
g_object_path: objectPath,
g_interface_name: interfaceName,
g_interface_info: info,
- g_flags: Gio.DBusProxyFlags.NONE });
+ g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
proxy.init_async(GLib.PRIORITY_DEFAULT,
this._cancellable,
@@ -181,6 +184,18 @@ const ObjectManager = new Lang.Class({
return;
}
+ this._managerProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
+ if (this._managerProxy.g_name_owner)
+ this._onNameAppeared();
+ else
+ this._onNameVanished();
+ }));
+
+ if (this._managerProxy.g_name_owner)
+ this._onNameAppeared();
+ },
+
+ _onNameAppeared: function() {
this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
if (!result) {
if (error) {
@@ -218,6 +233,21 @@ const ObjectManager = new Lang.Class({
}));
},
+ _onNameVanished: function() {
+ let objectPaths = Object.keys(this._objects);
+ for (let i = 0; i < objectPaths.length; i++) {
+ let object = this._objects[objectPaths];
+
+ let interfaceNames = Object.keys(object);
+ for (let j = 0; i < interfaceNames.length; i++) {
+ let interfaceName = interfaceNames[i];
+
+ if (object[interfaceName])
+ this._removeInterface(objectPath, interfaceName);
+ }
+ }
+ },
+
_registerInterfaces: function(interfaces) {
for (let i = 0; i < interfaces.length; i++) {
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]