28#include <vdk/vdkobj.h>
31#include <vdk/value_sem_list.h>
32#include <gdk/gdktypes.h>
33#define VDK_EVENT_NAME_LENGHT 63
40class _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) \
77typedef _VDK_Event_Unit<_owner_class> _EventUnit;\
78typedef VDKValueList< _EventUnit > _EventCallbackList;\
79typedef VDKValueListIterator< _EventUnit > _EventCallbackListIterator;\
80_EventCallbackList _event_cbList;\
83virtual bool FindEventAtClassLevel(VDKObject* Pm, char* event);\
85virtual bool FindEventAtParentLevel(VDKObject* Pm, char* event);\
86virtual int VDKEventUnitResponse(GtkWidget* , char* , GdkEvent* , void*);\
90int EventConnect(VDKObject* object, char* event,\
91 bool (_owner_class::*Pmf)(VDKObject* sender, GdkEvent*), bool after = false);\
92int EventConnect(char* event,\
93 bool (_owner_class::*Pmf)(VDKObject* sender, GdkEvent*), bool after = false)\
95return EventConnect(this, event, Pmf,after);\
99bool EventDisconnect(int slot);
104#define DEFINE_EVENT_LIST(_owner_class, _ancestor_class)\
108bool _owner_class::FindEventAtClassLevel(VDKObject* Pm, char* event)\
110_EventUnit su(Pm,event, (bool (_owner_class::*)(VDKObject*, GdkEvent*)) NULL);\
111if(_event_cbList.find(su))\
114 return _ancestor_class::FindEventAtClassLevel(Pm,event);\
119bool _owner_class::FindEventAtParentLevel(VDKObject* Pm, char* event)\
122for(parent = Parent(); parent; parent = parent->Parent())\
123 if(parent->FindEventAtClassLevel(Pm,event))\
130int _owner_class::EventConnect(VDKObject* obj, char* event,\
131 bool (_owner_class::*Pmf)(VDKObject* sender, GdkEvent*), bool after)\
134VDKObjectEventUnit* su = new VDKObjectEventUnit(this,obj,event);\
136_EventUnit sigUnit(obj,event,Pmf);\
137found = 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;\
148sigUnit.gtkobj = obj->ConnectingWidget() != NULL ? \
149 GTK_OBJECT(obj->ConnectingWidget()) : NULL;\
150_event_cbList.add(sigUnit);\
156bool _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);\
175int _owner_class::VDKEventUnitResponse(GtkWidget* mobj,\
180bool treated = false;\
181VDKObject* vdkobj = reinterpret_cast<VDKObject*>(obj);\
182_EventCallbackListIterator li(_event_cbList);\
185_EventUnit su = li.current();\
186if ( (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);\