00001
00002 #ifndef _sigc_eventsignals_h_
00003 #define _sigc_eventsignals_h_
00004 #ifdef USE_SIGCPLUSPLUS
00005
00006 #include <sigc++/signal_system.h>
00007 #include <vdk/sigc_events.h>
00008 using namespace SigC;
00009
00018 class VDKRawEventSignal : public VDKSignal1<void, const GdkEvent *>,
00019 private VDKNotCopyAble
00020 {
00021 public:
00022 VDKRawEventSignal(VDKObject*);
00023 ~VDKRawEventSignal();
00024 Connection connect(const Slot1<void, const GdkEvent*>&);
00025 Connection connect(const Slot2<void, VDKObject*, const GdkEvent *>&);
00026 void disconnect(Connection&);
00027
00028 private:
00029 VDKObject* _obj;
00030 guint _handler_id;
00031 static gint event_handler(GtkObject* wid, GdkEvent* eve, gpointer obj);
00032 };
00033
00034
00035
00036
00037 typedef enum{
00038 BUTTON_PRESS,
00039 BUTTON_RELEASE,
00040 FOCUS_KEY_IN,
00041 FOCUS_KEY_OUT,
00042 FOCUS_POINTER_IN,
00043 FOCUS_POINTER_OUT,
00044 GEOMETRY,
00045 KEY_PRESS,
00046 KEY_RELEASE,
00047 MAPEVENT,
00048 PAINT,
00049 POINTER_MOVE,
00050 POINTER_PRESSED
00051 } W2_TraitEnum;
00052
00058
00059
00060
00061
00062
00063 typedef VDKMapState VDKMapEventFilter;
00064
00075 typedef enum{
00076 BE_RELEASE,
00077 BE_PRESS,
00078 BE_CLICK2,
00079 BE_CLICK3
00080 } VDKButtonEventFilter;
00081
00082
00083
00090 typedef enum{
00091 KE_RELEASE,
00092 KE_PRESS
00093 } VDKKeyEventFilter;
00094
00101 typedef enum{
00102 FE_IN,
00103 FE_OUT
00104 } VDKFocusEventFilter;
00105
00111 typedef enum{
00112 PE_ALL,
00113 PE_PRESSED
00114 } VDKPointerEventFilter;
00115
00116
00117
00118
00119
00120
00121 template<W2_TraitEnum id, int scount=0>
00122 class W2_Trait
00123 {
00124 public:
00125 typedef GdkEvent ge_type;
00126 typedef int T_vcmp;
00127 typedef GdkEventType T_gcmp;
00128
00129 static const char* signame;
00130 static T_gcmp Field(GdkEvent* eve)
00131 {return eve->type;}
00132 };
00133
00134 template<W2_TraitEnum id>
00135 class W2_Trait<id, 1>
00136 {
00137 public:
00138 typedef GdkEvent ge_type;
00139 typedef int T_vcmp;
00140 typedef GdkEventType T_gcmp;
00141 static const int s_count;
00142 static const char* signame;
00143 static T_gcmp Field(GdkEvent* eve);
00144 static const T_vcmp EN1;
00145 static const T_gcmp GN1;
00146 };
00147
00148 template<W2_TraitEnum id>
00149 class W2_Trait<id,2>
00150 {
00151 public:
00152 typedef GdkEvent ge_type;
00153 typedef int T_vcmp;
00154 typedef GdkEventType T_gcmp;
00155 static const int s_count;
00156 static const char* signame;
00157 static T_gcmp Field(GdkEvent* eve);
00158 static const T_vcmp EN1;
00159 static const T_gcmp GN1;
00160 static const T_vcmp EN2;
00161 static const T_gcmp GN2;
00162 };
00163
00164 template<W2_TraitEnum id>
00165 class W2_Trait<id,3>
00166 {
00167 public:
00168 typedef GdkEvent ge_type;
00169 typedef int T_vcmp;
00170 typedef GdkEventType T_gcmp;
00171
00172 static const int s_count;
00173 static const char* signame;
00174 static T_gcmp Field(GdkEvent* eve)
00175 {return eve->type;}
00176 static const T_vcmp EN1;
00177 static const T_gcmp GN1;
00178 static const T_vcmp EN2;
00179 static const T_gcmp GN2;
00180 static const T_vcmp EN3;
00181 static const T_gcmp GN3;
00182 };
00183
00184 #include <vdk/sigc_eventtraits.h>
00185
00186
00187
00188
00189
00190
00191 template<W2_TraitEnum id, class T_vevent>
00192 class DirectEventSignal : public VDKSignal1<void, const T_vevent &>
00193 {
00194 int _handler_id;
00195 static void event_handler(GtkObject*, GdkEvent*, gpointer obj);
00196 VDKObject* _sender;
00197 typedef W2_Trait<id> T_trait;
00198 public:
00199 DirectEventSignal(VDKObject* sender) : _handler_id(0),_sender(sender) {}
00200 ~DirectEventSignal();
00201 Connection connect(const Slot2<void,VDKObject*,const T_vevent &>&);
00202 Connection connect(const Slot1<void, const T_vevent &>&);
00203 void disconnect(Connection& con);
00204 };
00205
00206
00207
00208
00209
00210 template<W2_TraitEnum id, class T_vevent, int s_count, class trait>
00211 class SignalWrapperStage2Base
00212 {
00213 typedef W2_Trait<id> Trait;
00214 typedef W2_Trait<id>::T_vcmp T_vcmp;
00215 typedef W2_Trait<id>::T_gcmp T_gcmp;
00216 int _handler_id;
00217 VDKObject* _sender;
00218 VDKSignal1<void,const T_vevent& > sig_vec[s_count];
00219 static void event_handler(GtkObject*, GdkEvent*, gpointer obj);
00220 public:
00221 SignalWrapperStage2Base(VDKObject* obj)
00222 : _handler_id(0), _sender(obj) {}
00223 ~SignalWrapperStage2Base();
00224
00225
00226 void cleanup();
00227 void disconnect(Connection&);
00228 Connection connect(const Slot2<void,VDKObject*,const T_vevent &>&,
00229 T_vcmp spec);
00230 Connection connect(const Slot1<void,const T_vevent &>&, T_vcmp spec);
00231 bool empty()const;
00232 bool responsible(T_vcmp spec) const;
00233 };
00234
00235 template<W2_TraitEnum id, class T_vevent, int s>
00236 class SignalWrapperStage2
00237 {
00238 typedef W2_Trait<id> Trait;
00239 typedef Trait::T_vcmp T_vcmp;
00240 typedef Trait::T_gcmp T_gcmp;
00241
00242 public:
00243 SignalWrapperStage2(VDKObject* obj);
00244 };
00245
00246
00247 template<W2_TraitEnum id, class T_vevent>
00248 class SignalWrapperStage2<id,T_vevent,1>
00249 : public SignalWrapperStage2Base<id,T_vevent,1, SignalWrapperStage2<id,T_vevent,1> >
00250 {
00251 typedef W2_Trait<id> Trait;
00252 typedef W2_Trait<id>::T_vcmp T_vcmp;
00253 typedef W2_Trait<id>::T_gcmp T_gcmp;
00254
00255 friend class SignalWrapperStage2Base<id, T_vevent,1, SignalWrapperStage2<id,T_vevent,1> >;
00256 static int vdk2vec(T_vcmp);
00257 static int eve2vec(GdkEvent* eve);
00258 public:
00259 SignalWrapperStage2(VDKObject* obj)
00260 : SignalWrapperStage2Base<id, T_vevent,1, SignalWrapperStage2<id,T_vevent,1> >(obj)
00261 {}
00262 };
00263
00264 template<W2_TraitEnum id, class T_vevent>
00265 class SignalWrapperStage2<id,T_vevent,2>
00266 : public SignalWrapperStage2Base<id,T_vevent,2, SignalWrapperStage2<id,T_vevent,2> >
00267 {
00268 typedef W2_Trait<id> myTrait;
00269 typedef myTrait::T_vcmp T_vcmp;
00270 typedef myTrait::T_gcmp T_gcmp;
00271 friend class SignalWrapperStage2Base<id,T_vevent,2,SignalWrapperStage2<id,T_vevent,2> >;
00272 static int vdk2vec(T_vcmp);
00273 static int eve2vec(GdkEvent* eve);
00274 public:
00275 SignalWrapperStage2(VDKObject* obj)
00276 : SignalWrapperStage2Base<id,T_vevent,2, SignalWrapperStage2<id,T_vevent,2> >(obj)
00277 {}
00278 };
00279
00280 template<W2_TraitEnum id, class T_vevent>
00281 class SignalWrapperStage2<id,T_vevent,3>
00282 : public SignalWrapperStage2Base<id,T_vevent,3, SignalWrapperStage2<id,T_vevent,3> >
00283 {
00284 typedef W2_Trait<id> myTrait;
00285 typedef myTrait::T_vcmp T_vcmp;
00286 typedef myTrait::T_gcmp T_gcmp;
00287 friend class SignalWrapperStage2Base<id,T_vevent, 3, SignalWrapperStage2<id,T_vevent,3> >;
00288 static int vdk2vec(T_vcmp);
00289 static int eve2vec(GdkEvent* eve);
00290 public:
00291 SignalWrapperStage2(VDKObject* obj)
00292 : SignalWrapperStage2Base<id,T_vevent,3, SignalWrapperStage2<id,T_vevent,3> >(obj)
00293 {}
00294 };
00295
00296
00297
00298
00299 template<W2_TraitEnum id1, int s_count1, W2_TraitEnum id2, int s_count2, class T_vevent>
00300 class SignalWrapperStage1M2
00301 {
00302 private:
00303 typedef W2_Trait<id1> Trait1;
00304 typedef W2_Trait<id2> Trait2;
00305 typedef Trait1::T_vcmp T_vcmp;
00306 SignalWrapperStage2<id1, T_vevent, s_count1> swrap1;
00307 SignalWrapperStage2<id2, T_vevent, s_count2> swrap2;
00308 public:
00309 SignalWrapperStage1M2(VDKObject* obj)
00310 : swrap1(obj), swrap2(obj){}
00311 bool empty() const;
00312 Connection connect(const Slot2<void, VDKObject*, const T_vevent&>& sl,
00313 T_vcmp spec);
00314 Connection connect(const Slot1<void, const T_vevent&>& sl, T_vcmp spec);
00315 void disconnect(Connection& con);
00316 };
00317
00318
00319
00320
00321 typedef SignalWrapperStage1M2<BUTTON_PRESS,3, BUTTON_RELEASE, 1, VDKMouseEvent>
00322 VDKButtonSignal;
00323 typedef SignalWrapperStage1M2<FOCUS_KEY_IN,1, FOCUS_KEY_OUT,1, VDKKeyFocusEvent>
00324 VDKKeyFocusSignal;
00325 typedef SignalWrapperStage1M2<FOCUS_POINTER_IN,1, FOCUS_POINTER_OUT,1, VDKMouseFocusEvent>
00326 VDKPointerFocusSignal;
00327 typedef SignalWrapperStage1M2<KEY_PRESS,1, KEY_RELEASE,1, VDKKeyEvent>
00328 VDKKeySignal;
00329 typedef SignalWrapperStage1M2<POINTER_PRESSED,1, POINTER_MOVE,1, VDKMouseEvent>
00330 VDKPointerSignal;
00331 typedef SignalWrapperStage2<MAPEVENT, VDKMapEvent, 3>
00332 VDKMapSignal;
00333 typedef DirectEventSignal<GEOMETRY,VDKGeometryEvent>
00334 VDKGeometrySignal;
00335 typedef DirectEventSignal<PAINT,VDKPaintEvent>
00336 VDKPaintSignal;
00337
00338 #endif
00339 #endif