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>
This commit is contained in:
parent
74720f250e
commit
ad0f11f024
@ -102,11 +102,18 @@ class SignalTracker {
|
|||||||
signalData.destroyId = obj.connect_after('destroy', () => this.untrack(obj));
|
signalData.destroyId = obj.connect_after('destroy', () => this.untrack(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
_disconnectSignal(obj, id) {
|
_disconnectSignalForProto(proto, obj, id) {
|
||||||
const proto = obj instanceof GObject.Object
|
proto['disconnect'].call(obj, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
_getObjectProto(obj) {
|
||||||
|
return obj instanceof GObject.Object
|
||||||
? GObject.Object.prototype
|
? GObject.Object.prototype
|
||||||
: Object.getPrototypeOf(obj);
|
: 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);
|
const { ownerSignals, destroyId } = this._getSignalData(obj);
|
||||||
this._map.delete(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)
|
if (destroyId)
|
||||||
this._disconnectSignal(obj, destroyId);
|
this._disconnectSignal(obj, destroyId);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user