[ROOT] Request for virtualizing of //*SIGNAL* methods

From: Brett Viren (bv@bnl.gov)
Date: Thu Nov 08 2001 - 17:56:14 MET


Hi,

Could we make the *SIGNAL* methods of the TG classes virtual?

For my app, I am working to plug in libsigc++ as an alternative to Rt.
For my subclasses of the TG classes I want my signals called in
response to interactive events (eg. button clicks).  If the *SIGNAL*
methods were made virtual, I could very easily override them.  For
example:

	class MyTextButton : public TGTextButton 
	{
	public:
		...
		SigC::Signal0<void> clicked;
	
	};
	void MyTextButton::Clicked() 
	{
		// Support any old code which uses Rt
		this->TGTextButton::Clicked();
		clicked();
	}


Besides my desire, making the *SIGNAL* methods virtual is generally
useful as it allows people an alternative way to respond to the events
which generate signals by deriving from TG classes instead of
attaching to signals.  Gtk-- does this for all their events by having
some_event_impl() virtual methods in their classes.  Qt kind of does
this as well, but with specific protected virutal methods (for example
in QSlider, the 4 possible signals are translated to 2 possible
virtual protected methods).

Besides the convenience of more options it allows speed optimization
when needed (a virtual method table lookup is much faster than an Rt
signal can ever be).  I am not sure if this is a huge win, but it
isn't a loss.


Thanks,
-Brett.

PS: Looking around gui/{inc,src}/ I think TGMainFrame::CloseWindow()
might need special treatment as it doesn't follow the "standard" and
call Emit().  I would suggest creating a new virtual method
CloseWindowSignal() which does call Emit("CloseWindow()") and use that
in place of the raw Emit("CloseWindow()") call in
TGMainFrame::HandleClientMessage().  I seem to remember other
complications about this signal, so maybe something further is needed
for this signal.



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:06 MET