Suggestion: signal/slot mechanism

Kristian kjkilpi at gmail.com
Sat Sep 2 03:50:22 PDT 2006


It would be nice if D had a signal/slot mechanism similiar to Qt:
http://doc.trolltech.com/4.1/signalsandslots.html

It's an elegant way to handle messages sent between objects. It beats  
event table declarations used by other GUI libraries IMHO.

It would make D a lot more appealing language to write GUI applications.  
Think of wxWidgets written in D... ;)


I think it would be quite simple to build a S/S support for a compiler (at  
first glance, at least). For example:

The 'Object' class has a pointer to S/S data (it's null if the object  
don't currently use signals/slots). S/S data holds a slot list for each  
signal. It also holds a list of objects that have slot(s) connected to  
this object's signal(s). This list is used to disconnect necessary slots  
at a destruction of the object.

When the compiler reads a 'emit X' statement, it will do two things.  
First, it generates an id for the signal which is used to retrieve a  
correct slot list.

Second, the compiler puts the signal's parameters to the stack as it would  
call a corresponding function. Instead, the 'Object._emit_signal(id)'  
function (or something) is called, where 'id' is the generated id. (Note  
that there are no function bodies for signals.) '_emit_signal()' retrieves  
the correct slot list, and calls all the slots (delegates) in it. Finally  
the parameters are removed from the stack.

Of course, slots should not modify their parameters so that all the slots  
will receive the same parameter values. Hence slots should not use the  
'out type'. There is a market for a 'const type' here... *wink*


Maybe there should be no slot keyword at all as there is in Qt. You don't  
need to declare a function to be a slot; all the (virtual) functions can  
be used with signals.

Because the return values of all the signals are void, the void typeword  
could be removed from signal declarations.

signal clicked();

signals:
clicked();
clicked(int button);


BTW, Qt generates ids for signals as follows:

signals:
void clicked(int button, bool isMoved);
-> the id is a string "clicked(int,bool)"



More information about the Digitalmars-d mailing list