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 50 class _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) \ 80 typedef _VDK_Signal_Unit<_owner_class> _SignalUnit;\ 81 typedef VDKValueList< _SignalUnit > _CallbackList;\ 82 typedef VDKValueListIterator< _SignalUnit > _CallbackListIterator;\ 83 _CallbackList _cbList;\ 87 virtual bool FindSignalAtClassLevel(VDKObject* Pm, char* signal);\ 88 virtual bool FindSignalAtParentLevel(VDKObject* Pm, char* signal);\ 89 virtual int VDKSignalUnitResponse(GtkWidget* , char* , void*);\ 93 int SignalConnect(VDKObject* object, char* signal,\ 94 bool (_owner_class::*Pmf)(VDKObject* sender), bool gtk = true, bool after = false);\ 95 int SignalConnect(char* signal,\ 96 bool (_owner_class::*Pmf)(VDKObject* sender), bool gtk = true, bool after = false)\ 98 return SignalConnect(this, signal, Pmf,gtk, after);\ 101 virtual int VDKSignalResponseListSize() { return _cbList.size(); }\ 103 bool SignalDisconnect(int slot); 135 #define DEFINE_SIGNAL_LIST(_owner_class, _ancestor_class)\ 139 bool _owner_class::FindSignalAtClassLevel(VDKObject* Pm, char* signal)\ 141 _SignalUnit su(Pm,signal, (bool (_owner_class::*)(VDKObject*)) NULL);\ 142 if(_cbList.find(su))\ 145 return _ancestor_class::FindSignalAtClassLevel(Pm,signal);\ 150 bool _owner_class::FindSignalAtParentLevel(VDKObject* Pm, char* signal)\ 153 for(parent = Parent(); parent; parent = parent->Parent())\ 154 if(parent->FindSignalAtClassLevel(Pm,signal))\ 161 int _owner_class::SignalConnect(VDKObject* obj,char* signal,\ 162 bool (_owner_class::*Pmf)(VDKObject* sender), bool gtk, bool after)\ 165 VDKObjectSignalUnit* su = new VDKObjectSignalUnit(this,obj,signal);\ 167 _SignalUnit sigUnit(obj,signal,Pmf);\ 168 found = obj->FindSignalAtClassLevel(sigUnit.Pm,sigUnit.signal) || \ 169 obj->FindSignalAtParentLevel(sigUnit.Pm,sigUnit.signal);\ 171 sigUnit.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;\ 179 sigUnit.gtkobj = obj->ConnectingWidget() != NULL ? \ 180 GTK_OBJECT(obj->ConnectingWidget()) : NULL;\ 181 _cbList.add(sigUnit);\ 182 return sigUnit.slot;\ 187 bool _owner_class::SignalDisconnect(int slot)\ 190 _CallbackListIterator li(_cbList);\ 193 _SignalUnit su = li.current();\ 197 gtk_signal_disconnect(su.gtkobj,su.slot);\ 206 int _owner_class::VDKSignalUnitResponse(GtkWidget* mobj,\ 207 char* signal, void* obj)\ 209 bool treated = false;\ 210 VDKObject* vdkobj = reinterpret_cast<VDKObject*>(obj);\ 211 _CallbackListIterator li(_cbList);\ 214 _SignalUnit su = li.current();\ 215 if ( (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);\