26#ifndef SIGLISTHANDLE_H
27#define SIGLISTHANDLE_H
29#include <vdk/vdkobj.h>
31#include <vdk/value_sem_list.h>
32#include <gdk/gdktypes.h>
34#define VDK_SIGNAL_NAME_LENGHT 63
50class _VDK_Signal_Unit {
53 typedef bool (T::*PMF)(
VDKObject* sender);
56 char signal[VDK_SIGNAL_NAME_LENGHT+1];
61 _VDK_Signal_Unit(
VDKObject* Pm,
char* sign,
64 Pm(Pm),Pmf(Pmf), slot(-1),connected(true)
66 std::strncpy(signal,sign,VDK_SIGNAL_NAME_LENGHT);
68 signal[VDK_SIGNAL_NAME_LENGHT] =
'\0';
70 bool operator ==(_VDK_Signal_Unit& su)
72 {
return ((!std::strcmp(signal,su.signal)) && (Pm == su.Pm)); }
77#define DECLARE_SIGNAL_LIST(_owner_class) \
80typedef _VDK_Signal_Unit<_owner_class> _SignalUnit;\
81typedef VDKValueList< _SignalUnit > _CallbackList;\
82typedef VDKValueListIterator< _SignalUnit > _CallbackListIterator;\
83_CallbackList _cbList;\
87virtual bool FindSignalAtClassLevel(VDKObject* Pm, char* signal);\
88virtual bool FindSignalAtParentLevel(VDKObject* Pm, char* signal);\
89virtual int VDKSignalUnitResponse(GtkWidget* , char* , void*);\
93int SignalConnect(VDKObject* object, char* signal,\
94 bool (_owner_class::*Pmf)(VDKObject* sender), bool gtk = true, bool after = false);\
95int SignalConnect(char* signal,\
96 bool (_owner_class::*Pmf)(VDKObject* sender), bool gtk = true, bool after = false)\
98return SignalConnect(this, signal, Pmf,gtk, after);\
101virtual int VDKSignalResponseListSize() { return _cbList.size(); }\
103bool SignalDisconnect(int slot);
135#define DEFINE_SIGNAL_LIST(_owner_class, _ancestor_class)\
139bool _owner_class::FindSignalAtClassLevel(VDKObject* Pm, char* signal)\
141_SignalUnit su(Pm,signal, (bool (_owner_class::*)(VDKObject*)) NULL);\
145 return _ancestor_class::FindSignalAtClassLevel(Pm,signal);\
150bool _owner_class::FindSignalAtParentLevel(VDKObject* Pm, char* signal)\
153for(parent = Parent(); parent; parent = parent->Parent())\
154 if(parent->FindSignalAtClassLevel(Pm,signal))\
161int _owner_class::SignalConnect(VDKObject* obj,char* signal,\
162 bool (_owner_class::*Pmf)(VDKObject* sender), bool gtk, bool after)\
165VDKObjectSignalUnit* su = new VDKObjectSignalUnit(this,obj,signal);\
167_SignalUnit sigUnit(obj,signal,Pmf);\
168found = obj->FindSignalAtClassLevel(sigUnit.Pm,sigUnit.signal) || \
169 obj->FindSignalAtParentLevel(sigUnit.Pm,sigUnit.signal);\
171sigUnit.slot = after ? gtk_signal_connect_after(GTK_OBJECT(obj->ConnectingWidget()),signal,\
172 GTK_SIGNAL_FUNC(VDKObject::VDKSignalUnitPipe),\
173 reinterpret_cast<gpointer>(su) ):\
174 gtk_signal_connect(GTK_OBJECT(obj->ConnectingWidget()),signal,\
175 GTK_SIGNAL_FUNC(VDKObject::VDKSignalUnitPipe),\
176 reinterpret_cast<gpointer>(su) );\
178 sigUnit.slot = (_cbList.size()+1)*-1;\
179sigUnit.gtkobj = obj->ConnectingWidget() != NULL ? \
180 GTK_OBJECT(obj->ConnectingWidget()) : NULL;\
181_cbList.add(sigUnit);\
187bool _owner_class::SignalDisconnect(int slot)\
190_CallbackListIterator li(_cbList);\
193_SignalUnit su = li.current();\
197 gtk_signal_disconnect(su.gtkobj,su.slot);\
206int _owner_class::VDKSignalUnitResponse(GtkWidget* mobj,\
207 char* signal, void* obj)\
209bool treated = false;\
210VDKObject* vdkobj = reinterpret_cast<VDKObject*>(obj);\
211_CallbackListIterator li(_cbList);\
214_SignalUnit su = li.current();\
215if ( (su.Pm == vdkobj) &&\
216 (!std::strcmp(su.signal,signal) && su.connected))\
218 bool(_owner_class::*response)(VDKObject* sender)= \
220 if(((*this).*response)(vdkobj) == true)\
227 return _ancestor_class::VDKSignalUnitResponse(mobj,signal,obj);\