mirror of
https://github.com/edu4rdshl/gnome-shell.git
synced 2026-07-17 23:24:51 +00:00
signalTracker: Provide monkey-patching for (dis)connectObject()
The module exports a `addObjectSignalMethods()` method that extends
the provided prototype with `connectObject()` and `disconnectObject()`
methods.
In its simplest form, `connectObject()` looks like the regular
`connect()` method, except for an additional parameter:
```js
this._button.connectObject('clicked',
() => this._onButtonClicked(), this);
```
The additional object can be used to disconnect all handlers on the
instance that were connected with that object, similar to
`g_signal_handlers_disconnect_by_data()` (which cannot be used
from introspection).
For objects that are subclasses of Clutter.Actor, that will happen
automatically when the actor is destroyed, similar to
`g_signal_connect_object()`.
Finally, `connectObject()` allows to conveniently connect multiple
signals at once, similar to `g_object_connect()`:
```js
this._toggleButton.connect(
'clicked', () => this._onClicked(),
'notify::checked', () => this._onChecked(), this);
```
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1953>
This commit is contained in:
parent
96df498450
commit
f45ccc9143
5 changed files with 316 additions and 0 deletions
79
tests/unit/signalTracker.js
Normal file
79
tests/unit/signalTracker.js
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
// Test cases for version comparison
|
||||
|
||||
const { GObject } = imports.gi;
|
||||
|
||||
const JsUnit = imports.jsUnit;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Environment = imports.ui.environment;
|
||||
Environment.init();
|
||||
|
||||
const Destroyable = GObject.registerClass({
|
||||
Signals: { 'destroy': {} },
|
||||
}, class Destroyable extends GObject.Object {});
|
||||
|
||||
class PlainEmitter {}
|
||||
Signals.addSignalMethods(PlainEmitter.prototype);
|
||||
|
||||
const GObjectEmitter = GObject.registerClass({
|
||||
Signals: { 'signal': {} },
|
||||
}, class GObjectEmitter extends Destroyable {});
|
||||
|
||||
const emitter1 = new PlainEmitter();
|
||||
const emitter2 = new GObjectEmitter();
|
||||
|
||||
const tracked1 = new Destroyable();
|
||||
const tracked2 = {};
|
||||
|
||||
let count = 0;
|
||||
const handler = () => count++;
|
||||
|
||||
emitter1.connectObject('signal', handler, tracked1);
|
||||
emitter2.connectObject('signal', handler, tracked1);
|
||||
|
||||
emitter1.connectObject('signal', handler, tracked2);
|
||||
emitter2.connectObject('signal', handler, tracked2);
|
||||
|
||||
JsUnit.assertEquals(count, 0);
|
||||
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 4);
|
||||
|
||||
tracked1.emit('destroy');
|
||||
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 6);
|
||||
|
||||
emitter1.disconnectObject(tracked2);
|
||||
emitter2.emit('destroy');
|
||||
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 6);
|
||||
|
||||
emitter1.connectObject(
|
||||
'signal', handler,
|
||||
'signal', handler, GObject.ConnectFlags.AFTER,
|
||||
tracked1);
|
||||
emitter2.connectObject(
|
||||
'signal', handler,
|
||||
'signal', handler, GObject.ConnectFlags.AFTER,
|
||||
tracked1);
|
||||
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 10);
|
||||
|
||||
tracked1.emit('destroy');
|
||||
emitter1.emit('signal');
|
||||
emitter2.emit('signal');
|
||||
|
||||
JsUnit.assertEquals(count, 10);
|
||||
Loading…
Add table
Add a link
Reference in a new issue