PEBL 2.2
Psychology Experiment Building Language - Cross-platform psychological experiment development system
PEvent.cpp
Go to the documentation of this file.
1//* -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*- */
3// Name: src/devices/PEvent.cpp
4// Purpose: Events processed by Event Loop.
5// Author: Shane T. Mueller, Ph.D.
6// Copyright: (c) 2003-2026 Shane T. Mueller <smueller@obereed.net>
7// License: GPL 2
8//
9//
10//
11// This file is part of the PEBL project.
12//
13// PEBL is free software; you can redistribute it and/or modify
14// it under the terms of the GNU General Public License as published by
15// the Free Software Foundation; either version 2 of the License, or
16// (at your option) any later version.
17//
18// PEBL is distributed in the hope that it will be useful,
19// but WITHOUT ANY WARRANTY; without even the implied warranty of
20// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21// GNU General Public License for more details.
22//
23// You should have received a copy of the GNU General Public License
24// along with PEBL; if not, write to the Free Software
25// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27#include "PEvent.h"
28#include "../utility/PError.h"
29#include "../base/PList.h"
30#include "../base/PComplexData.h"
31#include "../utility/PEBLUtility.h"
32
33
34#include <iostream>
35
36using std::cout;
37using std::cerr;
38using std::endl;
39
41 long unsigned int time,
42 unsigned int windowID=0):
43 mType(type),
44 mEventTime(time)
45{
46}
47
49
50{
51
52 mEventTime=evt.GetEventTime();
53 mType = evt.GetType();
54 mWindowID = 0;
55
56 switch(mType)
57 {
58 case PDT_KEYBOARD:
59 {
61 mEvent.keyboardEvent = event;
62 }
63 break;
65 {
67 mEvent.textEditingEvent = event;
68 }
69 break;
70 case PDT_TEXT_INPUT:
71 {
73 mEvent.textInputEvent =event;
74 }
75
76 break;
78 {
80 mEvent.mouseMovementEvent = event;
81 }
82 break;
83
85 {
87 mEvent.mouseButtonEvent = event;
88 }
89 break;
90
91 case PDT_MOUSE_WHEEL:
92 {
94 mEvent.mouseWheelEvent = event;
95 }
96 break;
98 {
100 mEvent.movieRefreshEvent = event;
101 }
102 break;
103
104 case PDT_MOVIE_END:
105 {
107 mEvent.movieEndEvent = event;
108 }
109 break;
111 {
112 //do something here that will cause a redraw.
113 }
114 case PDT_TIMER:
115 case PDT_UNKNOWN:
116 default:
117 ;
118 }
119
120}
121
123{
124 mType = PDT_KEYBOARD;
125 mEvent.keyboardEvent = evt;
126}
127
128
129
131{
132 mType = PDT_TEXT_EDITING;
133 mEvent.textEditingEvent= evt;
134}
135
137{
138 mType = PDT_TEXT_INPUT;
139 mEvent.textInputEvent = evt;
140}
141
142
144{
145 mType = PDT_MOUSE_MOVEMENT;
146 mEvent.mouseMovementEvent = evt;
147}
148
150{
151 mType = PDT_MOUSE_BUTTON;
152 mEvent.mouseButtonEvent = evt;
153}
154
155
156
158{
159 mType = PDT_MOUSE_WHEEL;
160 mEvent.mouseWheelEvent = evt;
161}
162
164{
165 mType = PDT_MOVIE_REFRESH;
166 mEvent.movieRefreshEvent = evt;
167}
168
170{
171 mType = PDT_MOVIE_END;
172 mEvent.movieEndEvent = evt;
173}
174
176{
177
178 mType = PDT_WINDOW_RESIZE;
179 mEvent.windowEvent = evt;
180}
181
182
184{
185 mEvent.dummyEvent = evt;
186}
187
189{
190
191 //These .text properties get cleaned up by SDL,
192 //as they are borrowed from the SDL event.
193 if(PDT_TEXT_INPUT==mType)
194 {
195
196 //free(mEvent.textInputEvent.text);
197 }else if(PDT_TEXT_EDITING==mType)
198 {
199 //free(mEvent.textEditingEvent.text);
200 }
201}
202
203
204
205//transforms event into a variant
206//that is exposed to the user.
207
208PEvent::operator Variant()
209{
210
211 Variant ret;
212
213 //cout << "Changing to variant: " << GetType() << endl;
214 switch(GetType())
215 {
217 {
218 PEBL_MouseMovementEvent mbe=GetMouseMovementEvent();
219 PList * newlist = new PList();
220 newlist->PushBack(Variant((int)mbe.x));
221 newlist->PushBack(Variant((int)mbe.y));
222 newlist->PushBack(Variant((int)mbe.relx));
223 newlist->PushBack(Variant((int)mbe.rely));
225 PComplexData * pcd = new PComplexData(newlist2);
226
227 ret = Variant(pcd);
228 }
229 break;
230
231
232 case PDT_MOUSE_BUTTON:
233 {
234 PEBL_MouseButtonEvent mbe=GetMouseButtonEvent();
235 PList * newlist = new PList();
236 newlist->PushBack(Variant((int)mbe.x));
237 newlist->PushBack(Variant((int)mbe.y));
238 newlist->PushBack(Variant((int)mbe.button));
239 newlist->PushBack(Variant((int)mbe.state));
241 PComplexData * pcd = new PComplexData(newlist2);
242
243 ret = Variant(pcd);
244 }
245 break;
246
247 case PDT_MOUSE_WHEEL:
248 {
249 PEBL_MouseWheelEvent mwe=GetMouseWheelEvent();
250 PList * newlist = new PList();
251
252 newlist->PushBack(Variant((int)mwe.x));
253 newlist->PushBack(Variant((int)mwe.y));
254 newlist->PushBack(Variant((int)mwe.deltax));
255 newlist->PushBack(Variant((int)mwe.deltay));
256 newlist->PushBack(Variant((int)mwe.direction));
258 PComplexData * pcd = new PComplexData(newlist2);
259
260 ret = Variant(pcd);
261 }
262 break;
263
264
265 case PDT_KEYBOARD:
266 {
267 PEBL_KeyboardEvent pke=GetKeyboardEvent();
269 }
270 break;
271 case PDT_TIMER:
272 ret = Variant("<timeout>");
273 break;
274
275 case PDT_TEXT_INPUT:
276 {
277 PEBL_TextInputEvent ptie = GetTextInputEvent();
278 ret = Variant(ptie.text);
279 }
280 break;
281
282 default:
283 {
284 ret = Variant("<UNKNOWN_EVENT>");
285 }
286 }
287
288 ret.SetCreationTime(mEventTime);
289 return ret;
290
291}
292
293
295{
296 if(PDT_KEYBOARD == mType )
297
298 return mEvent.keyboardEvent;
299 else
300 {
302
305 tmp.state = PEBL_UNKNOWN;
306 tmp.modkeys = 0;
307 return tmp;
308 }
309}
310
311
313{
314 if(PDT_TEXT_EDITING == mType )
315 return mEvent.textEditingEvent;
316 else
317 {
319 tmp.window =0;
320 tmp.text = (char*)""; //depracated warning send by this
321 return tmp;
322 }
323}
325{
326 if(PDT_TEXT_INPUT== mType )
327 return mEvent.textInputEvent;
328 else
329 {
330
332 tmp.window =0;
333 tmp.text = (char*)"";
334 tmp.start=0;
335 tmp.length=0;
336
337 return tmp;
338 }
339}
340
342{
343 if(PDT_MOUSE_MOVEMENT == mType )
344 return mEvent.mouseMovementEvent;
345 else
346 {
348 tmp.x = 0;
349 tmp.y = 0;
350 tmp.relx = 0;
351 tmp.rely = 0;
352 return tmp;
353 }
354}
355
356
358{
359 if(PDT_MOUSE_BUTTON == mType )
360 return mEvent.mouseButtonEvent;
361 else
362 {
364 tmp.x = 0;
365 tmp.y = 0;
366 tmp.button = 0;
367 tmp.state = 0;
368 return tmp;
369 }
370}
371
373{
374 if(PDT_MOUSE_WHEEL == mType)
375 return mEvent.mouseWheelEvent;
376
377 else{
379 tmp.x = 0;
380 tmp.y = 0;
381 tmp.deltax = 0;
382 tmp.deltay= 0;
383 tmp.direction = 1;
384 return tmp;
385 }
386}
387
388
390{
391 if(PDT_MOVIE_REFRESH == mType )
392 return mEvent.movieRefreshEvent;
393 else
394 {
396 tmp.value = true;
397 return tmp;
398 }
399}
400
402{
403 if(PDT_MOVIE_END == mType )
404 return mEvent.movieEndEvent;
405 else
406 {
408 tmp.value = true;
409 return tmp;
410 }
411}
412
413
415{
416 if(PDT_DUMMY == mType)
417 return mEvent.dummyEvent;
418 else
419 {
420 PEBL_DummyEvent tmp;
421 tmp.value = 0;
422 return tmp;
423 }
424}
425
426
427
428
429
430
431
433{
434 if(PDT_WINDOW_RESIZE == mType)
435 return mEvent.windowEvent;
436 else
437 {
439 tmp.w = 0;
440 tmp.h = 0;
441 return tmp;
442 }
443
444}
445
446
447int PEvent::GetState(int iface) const
448{
449
450 //cout << "Getting state : " << iface << "on type " << mType << " mousetype is " << PDT_MOUSE_WHEEL << endl;
451
452 // This gets the 'state' described in an event.
453 switch(mType)
454 {
455
456 //For keyboard events, the interface is the key.
457 case PDT_KEYBOARD:
458
459 //If the interface is the "anykey", return the key state
461 {
462
463 return mEvent.keyboardEvent.state;
464 }
465
466
467 //Determine which key is being used.
468
469 if(mEvent.keyboardEvent.key == (PEBL_Keycode)iface)
470 {
471
472 return mEvent.keyboardEvent.state;
473 }
474 else
475 return 0;
476
477 break;
478
479 case PDT_TEXT_EDITING:
480 {
481 return 1;
482 //return mEvent.textInputEvent;
483 }
484 break;
485
486 case PDT_TEXT_INPUT:
487 {
488 return 1;
489 //return mEvent.textEditingEvent;
490 }
491 break;
492
493 case PDT_MOUSE_BUTTON:
494 {
495
496
497 //cout << "Getting button state in PEvent.cpp:"<<
498 //mEvent.mouseButtonEvent.button << "--" << iface << endl;
499 if(mEvent.mouseButtonEvent.button == iface)
500 {
501
502 return mEvent.mouseButtonEvent.state;
503 }else
504 {
505 return PEBL_UNKNOWN;
506 }
507
508
509 }
510 break;
511 case PDT_MOUSE_WHEEL:
512 {
513 //cout << "mouse wheel: " << iface <<"|" << mEvent.mouseWheelEvent.deltax<< "|" <<
514 //mEvent.mouseWheelEvent.deltay << endl;
515 if(iface==1)
516 {
517 return (int)(mEvent.mouseWheelEvent.deltax);
518 }
519 else if(iface==2)
520 {
521 return (int)(mEvent.mouseWheelEvent.deltay);
522 }
523 else
524 return PEBL_UNKNOWN;
525 }
526 break;
527
529 case PDT_TIMER:
531 case PDT_MOVIE_END:
532 case PDT_UNKNOWN:
533 return PEBL_UNKNOWN;
534
536 {
537 //Here, the state should describe the size of the window resize.
538 if(iface == PEBL_WINDOWWIDTH)
539 {
540 return mEvent.windowEvent.w;
541 }else
542 {
543 return mEvent.windowEvent.h;
544 }
545 break;
546 }
547 default:
548
549 cerr << mType << endl;
550 PError::SignalFatalError("Unhandled device type in PEvent::GetState\n");
551
552 break;
553 }
554
555
556 return PEBL_UNKNOWN;
557}
558
PEBL_DEVICE_TYPE
Definition PDevice.h:40
@ PDT_MOUSE_WHEEL
Definition PDevice.h:47
@ PDT_MOVIE_END
Definition PDevice.h:58
@ PDT_TEXT_INPUT
Definition PDevice.h:43
@ PDT_MOUSE_MOVEMENT
Definition PDevice.h:45
@ PDT_UNKNOWN
Definition PDevice.h:41
@ PDT_DUMMY
Definition PDevice.h:60
@ PDT_MOUSE_BUTTON
Definition PDevice.h:46
@ PDT_TEXT_EDITING
Definition PDevice.h:44
@ PDT_KEYBOARD
Definition PDevice.h:42
@ PDT_WINDOW_RESIZE
Definition PDevice.h:59
@ PDT_TIMER
Definition PDevice.h:48
@ PDT_MOVIE_REFRESH
Definition PDevice.h:57
@ PEBL_WINDOWWIDTH
Definition PEvent.h:51
@ PEBL_UNKNOWN
Definition PEvent.h:40
PEBL_Keycode
Definition PKeyboard.h:78
@ PEBL_KEYCODE_UNKNOWN
Definition PKeyboard.h:79
@ PEBL_KEYCODE_ANYKEY
Definition PKeyboard.h:329
void SetWindowEvent(const PEBL_WindowEvent &evt)
Definition PEvent.cpp:175
PEBL_WindowEvent GetWindowEvent() const
Definition PEvent.cpp:432
void SetMovieRefreshEvent(const PEBL_MovieRefreshEvent &evt)
Definition PEvent.cpp:163
PEBL_DEVICE_TYPE GetType() const
Definition PEvent.h:167
PEBL_MouseMovementEvent GetMouseMovementEvent() const
Definition PEvent.cpp:341
PEBL_TextInputEvent GetTextInputEvent() const
Definition PEvent.cpp:324
void SetDummyEvent(const PEBL_DummyEvent &evt)
Definition PEvent.cpp:183
PEBL_MovieRefreshEvent GetMovieRefreshEvent() const
Definition PEvent.cpp:389
void SetKeyboardEvent(const PEBL_KeyboardEvent &evt)
Definition PEvent.cpp:122
unsigned long int GetEventTime() const
Definition PEvent.h:183
PEvent(PEBL_DEVICE_TYPE type, long unsigned int time, unsigned int windowID)
Definition PEvent.cpp:40
PEBL_MouseButtonEvent GetMouseButtonEvent() const
Definition PEvent.cpp:357
PEBL_MouseWheelEvent GetMouseWheelEvent() const
Definition PEvent.cpp:372
PEBL_MovieEndEvent GetMovieEndEvent() const
Definition PEvent.cpp:401
void SetMovieEndEvent(const PEBL_MovieEndEvent &evt)
Definition PEvent.cpp:169
PEBL_KeyboardEvent GetKeyboardEvent() const
Definition PEvent.cpp:294
void SetTextInputEvent(const PEBL_TextInputEvent &evt)
Definition PEvent.cpp:136
PEBL_DummyEvent GetDummyEvent() const
Definition PEvent.cpp:414
void SetTextEditingEvent(const PEBL_TextEditingEvent &evt)
Definition PEvent.cpp:130
int GetState(int iface) const
Definition PEvent.cpp:447
void SetMouseMovementEvent(const PEBL_MouseMovementEvent &evt)
Definition PEvent.cpp:143
PEBL_TextEditingEvent GetTextEditingEvent() const
Definition PEvent.cpp:312
void SetMouseButtonEvent(const PEBL_MouseButtonEvent &evt)
Definition PEvent.cpp:149
void SetMouseWheelEvent(const PEBL_MouseWheelEvent &evt)
Definition PEvent.cpp:157
~PEvent()
Definition PEvent.cpp:188
Definition PList.h:45
void PushBack(const Variant &v)
Definition PList.cpp:149
void SetCreationTime(long unsigned int time)
Definition Variant.h:184
std::string TranslateKeycode(const PEBL_Keycode key, int modkeys)
void SignalFatalError(const std::string &message)
unsigned int state
Definition PEvent.h:67
PEBL_Keycode scancode
Definition PEvent.h:61
PEBL_Keycode key
Definition PEvent.h:66
unsigned int x
Definition PEvent.h:105
unsigned int y
Definition PEvent.h:105
unsigned int y
Definition PEvent.h:97
unsigned int x
Definition PEvent.h:97
long unsigned int x
Definition PEvent.h:115
long unsigned int y
Definition PEvent.h:115
unsigned int window
Definition PEvent.h:76
unsigned int window
Definition PEvent.h:85
unsigned int length
Definition PEvent.h:88
unsigned int start
Definition PEvent.h:87