[gnome-shell/gnome-42] signalTracker: Avoid getting the same owner object proto multiple times
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/gnome-42] signalTracker: Avoid getting the same owner object proto multiple times
- Date: Thu, 11 Aug 2022 12:43:04 +0000 (UTC)
commit 2612864f61b320203b6aa677503c5aea0820dd3c
Author: Marco Trevisan (Treviño) <mail 3v1n0 net>
Date: Wed Jul 6 17:50:57 2022 +0200
signalTracker: Avoid getting the same owner object proto multiple times
While untracking an object we used to compute it's proto for each signal
we were disconnecting from, while this is not needed when we're just
iterating over all the same owner signals, so let's add few more
functions to compute an object prototype, and repeat the disconnections
in the simplest way we can.
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2366>
(cherry picked from commit ad0f11f02482c28868bcd5dbe0fa67f4f3ad8ca4)
js/misc/signalTracker.js | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
---
diff --git a/js/misc/signalTracker.js b/js/misc/signalTracker.js
index 6f87962254..b2101122dc 100644
--- a/js/misc/signalTracker.js
+++ b/js/misc/signalTracker.js
@@ -102,11 +102,18 @@ class SignalTracker {
signalData.destroyId = obj.connect_after('destroy', () => this.untrack(obj));
}
- _disconnectSignal(obj, id) {
- const proto = obj instanceof GObject.Object
+ _disconnectSignalForProto(proto, obj, id) {
+ proto['disconnect'].call(obj, id);
+ }
+
+ _getObjectProto(obj) {
+ return obj instanceof GObject.Object
? GObject.Object.prototype
: Object.getPrototypeOf(obj);
- proto['disconnect'].call(obj, id);
+ }
+
+ _disconnectSignal(obj, id) {
+ this._disconnectSignalForProto(this._getObjectProto(obj), obj, id);
}
/**
@@ -129,7 +136,9 @@ class SignalTracker {
const { ownerSignals, destroyId } = this._getSignalData(obj);
this._map.delete(obj);
- ownerSignals.forEach(id => this._disconnectSignal(this._owner, id));
+ const ownerProto = this._getObjectProto(this._owner);
+ ownerSignals.forEach(id =>
+ this._disconnectSignalForProto(ownerProto, this._owner, id));
if (destroyId)
this._disconnectSignal(obj, destroyId);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]