Extensions Gnome-shell : émettre des événements

Comment, dans une extension gnome-shell, permettre à un objet d'émettre des événements ; et comment se mettre à l'écoute de ces événements.

Utilisation de signals.js

L'obtention des méthodes de gestion d'événement se fait par une forme classique de mixin fournie par un module signals, défini dans le fichier /usr/share/gnome-js/signals.js.

method
void emit ( name [ , arg* ] )
Description
Emettre un événement. Les paramètres passés en plus du nom de l'événement seront transmis aux écouteurs de l'événement.
param
String name Nom de l'événement
param
mixed arg* Un nombre indéfini de paramètres. - optional
method
int connect ( name , listener )
Description
Ecouter l'émission d'un événement. L'écouteur reçoit en paramètres l'objet émetteur de l'événement plus tous les arguments passés lors de l'émission (emit). Si l'écouteur retourne true, les écouteurs suivants ne seront pas appelés.
param
String name Nom de l'événement
param
Function listener Ecouteur de l'événement.
return
int Identifiant de l'écouteur.
method
void disconnect ( id )
Description
Détacher un écouteur d'événement
param
int id Identifiant de l'écouteur à supprimer.
method
void disconnectAll ( )
Description
Détacher tous les écouteurs d'événement.

Exemples

// Importer le module de gestion des événements
const Signals = imports.signals;

// Déclaration de l'objet Foo
var Foo = function () { };

// Méthode émettant un événément 'action' avec 2 paramètres
Foo.prototype.doAction = function () {
    this.emit('action', 'bar', 'baz');
};

// Ajouter les méthodes de gestion d'événements à l'objet.
Signals.addSignalMethods(Foo.prototype);
Création d'un objet Foo émétteur d'événement, dans un fichier foo.js
// Importer le fichier foo.js
const Extension = imports.misc.extensionUtils.getCurrentExtension();
const foo = Extension.imports.foo;

// Instancier l'objet Foo.
var instance = new foo.Foo();

// Attacher un écouteur d'événement 'action'.
var lid = instance.connect('action', function (src, arg1, arg2) {
    global.log(arg1); // => 'bar'
    global.log(arg2); // => 'baz'
});

// Lancer l'action - l'écouteur sera appelé.
instance.doAction();

// Détacher l'écouteur.
instance.disconnect(lid);
Utilisation de l'objet Foo émettant un événement 'action'.