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);\