signalTracker: Add TransientSignalHolder class
There are cases where we want to connect to a number of signals for the lifetime of an object, but also other signals for a limited period (say: between show and hide). It is currently not possible to use disconnectObject() for the latter, because it will disconnect all signals. To address this use case, add a small class that can be used as a transient signal holder, while still benefiting from autocleanup by proxying the real owner. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2221>
This commit is contained in:

committed by
Marge Bot

parent
7b0a94b246
commit
cf29ec2f22
@ -8,6 +8,8 @@ const JsUnit = imports.jsUnit;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Environment = imports.ui.environment;
|
||||
const { TransientSignalHolder } = imports.misc.signalTracker;
|
||||
|
||||
Environment.init();
|
||||
|
||||
const Destroyable = GObject.registerClass({
|
||||
@ -77,3 +79,39 @@ emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 10);
|
||||
|
||||
emitter1.connectObject('signal', handler, tracked1);
|
||||
emitter2.connectObject('signal', handler, tracked1);
|
||||
|
||||
transientHolder = new TransientSignalHolder(tracked1);
|
||||
|
||||
emitter1.connectObject('signal', handler, transientHolder);
|
||||
emitter2.connectObject('signal', handler, transientHolder);
|
||||
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 14);
|
||||
|
||||
transientHolder.destroy();
|
||||
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 16);
|
||||
|
||||
transientHolder = new TransientSignalHolder(tracked1);
|
||||
|
||||
emitter1.connectObject('signal', handler, transientHolder);
|
||||
emitter2.connectObject('signal', handler, transientHolder);
|
||||
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 20);
|
||||
|
||||
tracked1.emit('destroy');
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 20);
|
||||
|
Reference in New Issue
Block a user