26 #ifndef EVLISTHANDLE_H
27 #define EVLISTHANDLE_H
28 #include <vdk/vdkobj.h>
31 #include <vdk/value_sem_list.h>
32 #include <gdk/gdktypes.h>
33 #define VDK_EVENT_NAME_LENGHT 63
40 class _VDK_Event_Unit {
43 typedef bool (T::*PMF)(
VDKObject* sender, GdkEvent* event);
46 char event[VDK_EVENT_NAME_LENGHT+1];
58 Pm(Pm),Pmf(Pmf), slot(-1),connected(true)
60 std::strncpy(event,ev,VDK_EVENT_NAME_LENGHT);
62 event[VDK_EVENT_NAME_LENGHT] =
'\0';
68 bool operator ==(_VDK_Event_Unit& su)
69 {
return ((!std::strcmp(event,su.event)) && (Pm == su.Pm)); }
74 #define DECLARE_EVENT_LIST(_owner_class) \
77 typedef _VDK_Event_Unit<_owner_class> _EventUnit;\
78 typedef VDKValueList< _EventUnit > _EventCallbackList;\
79 typedef VDKValueListIterator< _EventUnit > _EventCallbackListIterator;\
80 _EventCallbackList _event_cbList;\
83 virtual bool FindEventAtClassLevel(VDKObject* Pm, char* event);\
85 virtual bool FindEventAtParentLevel(VDKObject* Pm, char* event);\
86 virtual int VDKEventUnitResponse(GtkWidget* , char* , GdkEvent* , void*);\
90 int EventConnect(VDKObject* object, char* event,\
91 bool (_owner_class::*Pmf)(VDKObject* sender, GdkEvent*), bool after = false);\
92 int EventConnect(char* event,\
93 bool (_owner_class::*Pmf)(VDKObject* sender, GdkEvent*), bool after = false)\
95 return EventConnect(this, event, Pmf,after);\
99 bool EventDisconnect(int slot);
104 #define DEFINE_EVENT_LIST(_owner_class, _ancestor_class)\
108 bool _owner_class::FindEventAtClassLevel(VDKObject* Pm, char* event)\
110 _EventUnit su(Pm,event, (bool (_owner_class::*)(VDKObject*, GdkEvent*)) NULL);\
111 if(_event_cbList.find(su))\
114 return _ancestor_class::FindEventAtClassLevel(Pm,event);\
119 bool _owner_class::FindEventAtParentLevel(VDKObject* Pm, char* event)\
122 for(parent = Parent(); parent; parent = parent->Parent())\
123 if(parent->FindEventAtClassLevel(Pm,event))\
130 int _owner_class::EventConnect(VDKObject* obj, char* event,\
131 bool (_owner_class::*Pmf)(VDKObject* sender, GdkEvent*), bool after)\
134 VDKObjectEventUnit* su = new VDKObjectEventUnit(this,obj,event);\
136 _EventUnit sigUnit(obj,event,Pmf);\
137 found = obj->FindEventAtClassLevel(sigUnit.Pm,sigUnit.event) || \
138 obj->FindEventAtParentLevel(sigUnit.Pm,sigUnit.event);\
140 sigUnit.slot = after ? gtk_signal_connect_after(GTK_OBJECT(obj->ConnectingWidget()),event,\
141 GTK_SIGNAL_FUNC(VDKObject::VDKEventUnitPipe),\
142 reinterpret_cast<gpointer>(su) ):\
143 gtk_signal_connect(GTK_OBJECT(obj->ConnectingWidget()),event,\
144 GTK_SIGNAL_FUNC(VDKObject::VDKEventUnitPipe),\
145 reinterpret_cast<gpointer>(su) );\
147 sigUnit.slot = (_event_cbList.size()+1)*-1;\
148 sigUnit.gtkobj = obj->ConnectingWidget() != NULL ? \
149 GTK_OBJECT(obj->ConnectingWidget()) : NULL;\
150 _event_cbList.add(sigUnit);\
151 return sigUnit.slot;\
156 bool _owner_class::EventDisconnect(int slot)\
159 _EventCallbackListIterator li(_event_cbList);\
162 _EventUnit su = li.current();\
166 gtk_signal_disconnect(su.gtkobj,su.slot);\
167 _event_cbList.unlink(t);\
175 int _owner_class::VDKEventUnitResponse(GtkWidget* mobj,\
180 bool treated = false;\
181 VDKObject* vdkobj = reinterpret_cast<VDKObject*>(obj);\
182 _EventCallbackListIterator li(_event_cbList);\
185 _EventUnit su = li.current();\
186 if ( (su.Pm == vdkobj) &&\
187 (!std::strcmp(su.event,event) && su.connected))\
189 bool(_owner_class::*response)(VDKObject* sender, GdkEvent* )= \
191 if(((*this).*response)(vdkobj, evType) == true)\
198 return _ancestor_class::VDKEventUnitResponse(mobj,event,evType,obj);\