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:
Florian Müllner
2022-03-04 23:32:24 +01:00
committed by Marge Bot
parent 7b0a94b246
commit cf29ec2f22
2 changed files with 69 additions and 13 deletions

View File

@ -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);