FIFE
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
eventmanager.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2005-2013 by the FIFE team *
3  * http://www.fifengine.net *
4  * This file is part of FIFE. *
5  * *
6  * FIFE is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU Lesser General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2.1 of the License, or (at your option) any later version. *
10  * *
11  * This library is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
14  * Lesser General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Lesser General Public *
17  * License along with this library; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
20  ***************************************************************************/
21 
22 // Standard C++ library includes
23 #include <iostream>
24 
25 // 3rd party library includes
26 
27 // FIFE includes
28 // These includes are split up in two parts, separated by one empty line
29 // First block: files included from the FIFE root src directory
30 // Second block: files included from the same folder
31 #include "util/base/exception.h"
32 #include "util/log/logger.h"
33 #include "util/math/fife_math.h"
40 #include "video/renderbackend.h"
41 
42 #include "eventmanager.h"
43 
44 namespace FIFE {
45  static Logger _log(LM_EVTCHANNEL);
46 
48  m_commandlisteners(),
49  m_keylisteners(),
50  m_mouselisteners(),
51  m_sdleventlisteners(),
52  m_keystatemap(),
53  m_keyfilter(0),
54  m_mousefilter(0),
55  m_mousestate(0),
56  m_mostrecentbtn(MouseEvent::EMPTY),
57  m_mousesensitivity(0.0),
58  m_acceleration(false),
59  m_warp(false),
60  m_enter(false),
61  m_oldx(0),
62  m_oldy(0),
63  m_lastticks(0),
64  m_oldvelocity(0.0) {
65  }
66 
68  }
69 
70  template<typename T>
71  void removeListener(std::deque<T>& vec, T& listener) {
72  vec.push_back(listener);
73  }
74 
75  template<typename T>
76  void addListener(std::deque<T>& vec, T& listener) {
77  vec.push_back(listener);
78  }
79 
81  addListener<ICommandListener*>(m_pending_commandlisteners, listener);
82  }
83 
85  addListener<ICommandListener*>(m_pending_commandlisteners_front, listener);
86  }
87 
89  removeListener<ICommandListener*>(m_pending_cldeletions, listener);
90  }
91 
93  addListener<IKeyListener*>(m_pending_keylisteners, listener);
94  }
95 
97  addListener<IKeyListener*>(m_pending_keylisteners_front, listener);
98  }
99 
101  removeListener<IKeyListener*>(m_pending_kldeletions, listener);
102  }
103 
105  addListener<IMouseListener*>(m_pending_mouselisteners, listener);
106  }
107 
109  addListener<IMouseListener*>(m_pending_mouselisteners_front, listener);
110  }
111 
113  removeListener<IMouseListener*>(m_pending_mldeletions, listener);
114  }
115 
117  addListener<ISdlEventListener*>(m_pending_sdleventlisteners, listener);
118  }
119 
121  addListener<ISdlEventListener*>(m_pending_sdleventlisteners_front, listener);
122  }
123 
125  removeListener<ISdlEventListener*>(m_pending_sdldeletions, listener);
126  }
127 
129  if(!m_pending_commandlisteners.empty()) {
130  std::deque<ICommandListener*>::iterator i = m_pending_commandlisteners.begin();
131  while (i != m_pending_commandlisteners.end()) {
132  m_commandlisteners.push_back(*i);
133  ++i;
134  }
136  }
137 
138  if(!m_pending_commandlisteners_front.empty()) {
139  std::deque<ICommandListener*>::iterator i = m_pending_commandlisteners_front.begin();
140  while (i != m_pending_commandlisteners_front.end()) {
141  m_commandlisteners.push_front(*i);
142  ++i;
143  }
145  }
146 
147  if (!m_pending_cldeletions.empty()) {
148  std::deque<ICommandListener*>::iterator i = m_pending_cldeletions.begin();
149  while (i != m_pending_cldeletions.end()) {
150  std::deque<ICommandListener*>::iterator j = m_commandlisteners.begin();
151  while (j != m_commandlisteners.end()) {
152  if(*j == *i) {
153  m_commandlisteners.erase(j);
154  break;
155  }
156  ++j;
157  }
158  ++i;
159  }
160  m_pending_cldeletions.clear();
161  }
162 
163  std::deque<ICommandListener*>::iterator i = m_commandlisteners.begin();
164  while (i != m_commandlisteners.end()) {
165  (*i)->onCommand(command);
166  if (command.isConsumed()) {
167  break;
168  }
169  ++i;
170  }
171  }
172 
174  if(!m_pending_keylisteners.empty()) {
175  std::deque<IKeyListener*>::iterator i = m_pending_keylisteners.begin();
176  while (i != m_pending_keylisteners.end()) {
177  m_keylisteners.push_back(*i);
178  ++i;
179  }
180  m_pending_keylisteners.clear();
181  }
182 
183  if(!m_pending_keylisteners_front.empty()) {
184  std::deque<IKeyListener*>::iterator i = m_pending_keylisteners_front.begin();
185  while (i != m_pending_keylisteners_front.end()) {
186  m_keylisteners.push_front(*i);
187  ++i;
188  }
190  }
191 
192  if (!m_pending_kldeletions.empty()) {
193  std::deque<IKeyListener*>::iterator i = m_pending_kldeletions.begin();
194  while (i != m_pending_kldeletions.end()) {
195  std::deque<IKeyListener*>::iterator j = m_keylisteners.begin();
196  while (j != m_keylisteners.end()) {
197  if(*j == *i) {
198  m_keylisteners.erase(j);
199  break;
200  }
201  ++j;
202  }
203  ++i;
204  }
205  m_pending_kldeletions.clear();
206  }
207 
208  std::deque<IKeyListener*>::iterator i = m_keylisteners.begin();
209  while (i != m_keylisteners.end()) {
210  switch (evt.getType()) {
211  case KeyEvent::PRESSED:
212  (*i)->keyPressed(evt);
213  break;
214  case KeyEvent::RELEASED:
215  (*i)->keyReleased(evt);
216  break;
217  default:
218  break;
219  }
220  ++i;
221  }
222  }
223 
225  if(!m_pending_mouselisteners.empty()) {
226  std::deque<IMouseListener*>::iterator i = m_pending_mouselisteners.begin();
227  while (i != m_pending_mouselisteners.end()) {
228  m_mouselisteners.push_back(*i);
229  ++i;
230  }
231  m_pending_mouselisteners.clear();
232  }
233 
234  if(!m_pending_mouselisteners_front.empty()) {
235  std::deque<IMouseListener*>::iterator i = m_pending_mouselisteners_front.begin();
236  while (i != m_pending_mouselisteners_front.end()) {
237  m_mouselisteners.push_front(*i);
238  ++i;
239  }
241  }
242 
243  if (!m_pending_mldeletions.empty()) {
244  std::deque<IMouseListener*>::iterator i = m_pending_mldeletions.begin();
245  while (i != m_pending_mldeletions.end()) {
246  std::deque<IMouseListener*>::iterator j = m_mouselisteners.begin();
247  while (j != m_mouselisteners.end()) {
248  if(*j == *i) {
249  m_mouselisteners.erase(j);
250  break;
251  }
252  ++j;
253  }
254  ++i;
255  }
256  m_pending_mldeletions.clear();
257  }
258 
259  std::deque<IMouseListener*>::iterator i = m_mouselisteners.begin();
260  while (i != m_mouselisteners.end()) {
261  switch (evt.getType()) {
262  case MouseEvent::MOVED:
263  (*i)->mouseMoved(evt);
264  break;
265  case MouseEvent::PRESSED:
266  (*i)->mousePressed(evt);
267  break;
269  (*i)->mouseReleased(evt);
270  break;
272  (*i)->mouseWheelMovedDown(evt);
273  break;
275  (*i)->mouseWheelMovedUp(evt);
276  break;
277  case MouseEvent::CLICKED:
278  (*i)->mouseClicked(evt);
279  break;
280  case MouseEvent::ENTERED:
281  (*i)->mouseEntered(evt);
282  break;
283  case MouseEvent::EXITED:
284  (*i)->mouseExited(evt);
285  break;
286  case MouseEvent::DRAGGED:
287  (*i)->mouseDragged(evt);
288  break;
289  default:
290  break;
291  }
292  if (evt.isConsumed()) {
293  break;
294  }
295  ++i;
296  }
297  }
298 
299  bool EventManager::dispatchSdlEvent(SDL_Event& evt) {
300  bool ret = false;
301  if (!m_pending_sdleventlisteners.empty()) {
302  std::deque<ISdlEventListener*>::iterator i = m_pending_sdleventlisteners.begin();
303  while(i != m_pending_sdleventlisteners.end()) {
304  m_sdleventlisteners.push_back(*i);
305  ++i;
306  }
308  }
309 
310  if (!m_pending_sdleventlisteners_front.empty()) {
311  std::deque<ISdlEventListener*>::iterator i = m_pending_sdleventlisteners_front.begin();
312  while(i != m_pending_sdleventlisteners_front.end()) {
313  m_sdleventlisteners.push_front(*i);
314  ++i;
315  }
317  }
318 
319  if (!m_pending_sdldeletions.empty()) {
320  std::deque<ISdlEventListener*>::iterator i = m_pending_sdldeletions.begin();
321  while (i != m_pending_sdldeletions.end()) {
322  std::deque<ISdlEventListener*>::iterator j = m_sdleventlisteners.begin();
323  while (j != m_sdleventlisteners.end()) {
324  if(*j == *i) {
325  m_sdleventlisteners.erase(j);
326  break;
327  }
328  ++j;
329  }
330  ++i;
331  }
332  m_pending_sdldeletions.clear();
333  }
334 
335  std::deque<ISdlEventListener*>::iterator i = m_sdleventlisteners.begin();
336  while (i != m_sdleventlisteners.end()) {
337  ret = ret || (*i)->onSdlEvent(evt);
338  ++i;
339  }
340  return ret;
341  }
342 
343  bool EventManager::combineEvents(SDL_Event& event1, const SDL_Event& event2) {
344  if(event1.type == event2.type) {
345  switch (event1.type) {
346  case SDL_MOUSEMOTION:
347  if(event1.motion.state == event2.motion.state) {
348  event1.motion.x = event2.motion.x;
349  event1.motion.y = event2.motion.y;
350  event1.motion.xrel += event2.motion.xrel;
351  event1.motion.yrel += event2.motion.yrel;
352  return true;
353  }
354  return false;
355  }
356  }
357  return false;
358  }
359 
361  // The double SDL_PollEvent calls don't throw away events,
362  // but try to combine (mouse motion) events.
363  SDL_Event event, next_event;
364  bool has_next_event = (SDL_PollEvent(&event) != 0);
365  while (has_next_event) {
366  has_next_event = (SDL_PollEvent(&next_event) != 0);
367  if(has_next_event && combineEvents(event, next_event))
368  continue;
369 
370  switch (event.type) {
371  case SDL_QUIT: {
372  Command cmd;
373  cmd.setSource(this);
375  dispatchCommand(cmd);
376  }
377  break;
378 
379  case SDL_ACTIVEEVENT:
380  processActiveEvent(event);
381  break;
382 
383  case SDL_KEYDOWN:
384  case SDL_KEYUP:
385  processKeyEvent(event);
386  break;
387 
388  case SDL_MOUSEBUTTONUP:
389  case SDL_MOUSEMOTION:
390  case SDL_MOUSEBUTTONDOWN:
391  processMouseEvent(event);
392  break;
393  }
394  if(has_next_event)
395  event = next_event;
396  }
397  }
398 
399  void EventManager::processActiveEvent(SDL_Event event) {
400  if (dispatchSdlEvent(event)) {
401  return;
402  }
403 
404  SDL_ActiveEvent actevt = event.active;
405  std::vector<Command*> commands;
406 
407  if (actevt.state & SDL_APPMOUSEFOCUS) {
408  Command* cmd = new Command();
409  if (actevt.gain) {
411  m_enter = true;
412  } else {
414  }
415  commands.push_back(cmd);
416  }
417  if (actevt.state & SDL_APPINPUTFOCUS) {
418  Command* cmd = new Command();
419  if (actevt.gain) {
421  } else {
423  }
424  commands.push_back(cmd);
425  }
426  if (actevt.state & SDL_APPACTIVE) {
427  Command* cmd = new Command();
428  if (actevt.gain) {
430  } else {
432  }
433  commands.push_back(cmd);
434  }
435 
436  std::vector<Command*>::iterator it = commands.begin();
437  for (; it != commands.end(); ++it) {
438  dispatchCommand(**it);
439  delete *it;
440  }
441  }
442 
443  void EventManager::processKeyEvent(SDL_Event event) {
444  KeyEvent keyevt;
445  keyevt.setSource(this);
446  fillKeyEvent(event, keyevt);
447  m_keystatemap[keyevt.getKey().getValue()] = (keyevt.getType() == KeyEvent::PRESSED);
448 
449  bool dispatchAsSdl = !keyevt.getKey().isFunctionKey();
450  if( dispatchAsSdl && m_keyfilter ) {
451  dispatchAsSdl = !m_keyfilter->isFiltered(keyevt);
452  }
453 
454  if( dispatchAsSdl ) {
455  if( dispatchSdlEvent(event) )
456  return;
457  }
458 
459  dispatchKeyEvent(keyevt);
460  }
461 
462  void EventManager::processMouseEvent(SDL_Event event) {
463  if (event.type == SDL_MOUSEMOTION && (!Mathf::Equal(m_mousesensitivity, 0.0) || m_acceleration)) {
464  uint16_t tmp_x = event.motion.x;
465  uint16_t tmp_y = event.motion.y;
466  if (m_enter) {
467  m_oldx = tmp_x;
468  m_oldy = tmp_y;
469  m_oldvelocity = 0.0;
470  m_enter = false;
471  }
472 
473  float modifier;
474  if (m_acceleration) {
475  uint32_t ticks = SDL_GetTicks();
476  float difference = static_cast<float>((ticks - m_lastticks) + 1);
477  m_lastticks = ticks;
478  float dx = static_cast<float>(tmp_x - m_oldx);
479  float dy = static_cast<float>(tmp_y - m_oldy);
480  float distance = Mathf::Sqrt(dx * dx + dy * dy);
481  float acceleration = static_cast<float>((distance / difference) / difference);
482  float velocity = (m_oldvelocity + acceleration * difference)/2;
483  if (velocity > m_mousesensitivity+1) {
484  velocity = m_mousesensitivity+1;
485  }
486  m_oldvelocity = velocity;
487  modifier = velocity;
488  } else {
489  modifier = m_mousesensitivity;
490  }
491 
492  int16_t tmp_xrel = static_cast<int16_t>(tmp_x - m_oldx);
493  int16_t tmp_yrel = static_cast<int16_t>(tmp_y - m_oldy);
494  if ((tmp_xrel != 0) || (tmp_yrel != 0)) {
495  Rect screen = RenderBackend::instance()->getArea();
496  int16_t x_fact = static_cast<int16_t>(round(static_cast<float>(tmp_xrel * modifier)));
497  int16_t y_fact = static_cast<int16_t>(round(static_cast<float>(tmp_yrel * modifier)));
498  if ((tmp_x + x_fact) > screen.w) {
499  tmp_x = screen.w;
500  } else if ((tmp_x + x_fact) < screen.x) {
501  tmp_x = screen.x;
502  } else {
503  tmp_x += x_fact;
504  }
505 
506  if (tmp_y + y_fact > screen.h) {
507  tmp_y = screen.h;
508  } else if ((tmp_y + y_fact) < screen.y) {
509  tmp_y = screen.y;
510  } else {
511  tmp_y += y_fact;
512  }
513  m_oldx = tmp_x;
514  m_oldy = tmp_y;
515  event.motion.x = tmp_x;
516  event.motion.y = tmp_y;
517  m_warp = true; //don't trigger an event handler when warping
518  SDL_WarpMouse(tmp_x, tmp_y);
519  m_warp = false;
520  }
521 
522  }
523  MouseEvent mouseevt;
524  mouseevt.setSource(this);
525  fillMouseEvent(event, mouseevt);
526  fillModifiers(mouseevt);
527  if (event.type == SDL_MOUSEBUTTONDOWN) {
528  m_mousestate |= static_cast<int32_t>(mouseevt.getButton());
529  m_mostrecentbtn = mouseevt.getButton();
530  } else if (event.type == SDL_MOUSEBUTTONUP) {
531  m_mousestate &= ~static_cast<int32_t>(mouseevt.getButton());
532  }
533  bool consumed = dispatchSdlEvent(event);
534  if (consumed && m_mousefilter) {
535  consumed = !m_mousefilter->isFiltered(mouseevt);
536  }
537  if (consumed) {
538  return;
539  }
540  // fire scrollwheel events only once
541  if (event.button.button == SDL_BUTTON_WHEELDOWN || event.button.button == SDL_BUTTON_WHEELUP) {
542  if (event.type == SDL_MOUSEBUTTONUP) {
543  return;
544  }
545  }
546  dispatchMouseEvent(mouseevt);
547  }
548 
549 
550  void EventManager::fillMouseEvent(const SDL_Event& sdlevt, MouseEvent& mouseevt) {
551  if (m_warp) {
552  return;
553  }
554 
555  mouseevt.setX(sdlevt.button.x);
556  mouseevt.setY(sdlevt.button.y);
557 
558  mouseevt.setButton(MouseEvent::EMPTY);
559  mouseevt.setType(MouseEvent::MOVED);
560  if ((sdlevt.type == SDL_MOUSEBUTTONUP) || (sdlevt.type == SDL_MOUSEBUTTONDOWN)) {
561  switch (sdlevt.button.button) {
562  case SDL_BUTTON_LEFT:
563  mouseevt.setButton(MouseEvent::LEFT);
564  break;
565  case SDL_BUTTON_RIGHT:
566  mouseevt.setButton(MouseEvent::RIGHT);
567  break;
568  case SDL_BUTTON_MIDDLE:
569  mouseevt.setButton(MouseEvent::MIDDLE);
570  break;
571  default:
573  break;
574  }
575 
576  if (sdlevt.type == SDL_MOUSEBUTTONUP ) {
577  mouseevt.setType(MouseEvent::RELEASED);
578  } else {
579  mouseevt.setType(MouseEvent::PRESSED);
580  }
581 
582  switch (sdlevt.button.button) {
583  case SDL_BUTTON_WHEELDOWN:
585  break;
586  case SDL_BUTTON_WHEELUP:
588  break;
589  default:
590  break;
591  }
592  }
593  if ((mouseevt.getType() == MouseEvent::MOVED) && m_mousestate) {
594  mouseevt.setType(MouseEvent::DRAGGED);
595  mouseevt.setButton(m_mostrecentbtn);
596  }
597  }
598 
599  void EventManager::fillKeyEvent(const SDL_Event& sdlevt, KeyEvent& keyevt) {
600  if (sdlevt.type == SDL_KEYDOWN) {
601  keyevt.setType(KeyEvent::PRESSED);
602  } else if (sdlevt.type == SDL_KEYUP) {
603  keyevt.setType(KeyEvent::RELEASED);
604  } else {
605  FL_WARN(_log, LMsg("fillKeyEvent()")
606  << " Invalid key event type of " << sdlevt.type << ". Ignoring event.");
607  return;
608  }
609  SDL_keysym keysym = sdlevt.key.keysym;
610 
611  keyevt.setShiftPressed((keysym.mod & KMOD_SHIFT) != 0);
612  keyevt.setControlPressed((keysym.mod & KMOD_CTRL) != 0);
613  keyevt.setAltPressed((keysym.mod & KMOD_ALT) != 0);
614  keyevt.setMetaPressed((keysym.mod & KMOD_META) != 0);
615  keyevt.setNumericPad(keysym.sym >= SDLK_KP0 && keysym.sym <= SDLK_KP_EQUALS);
616  keyevt.setKey(Key(static_cast<Key::KeyType>(keysym.sym), keysym.unicode));
617  }
618 
629  }
630 
632  return ES_ENGINE;
633  }
634 
636  m_keyfilter = keyFilter;
637  }
638 
640  m_mousefilter = mouseFilter;
641  }
642 
643  void EventManager::setMouseSensitivity(float sensitivity) {
644  if (sensitivity < -0.99) {
645  sensitivity = -0.99;
646  } else if (sensitivity > 10.0) {
647  sensitivity = 10.0;
648  }
649  m_mousesensitivity = sensitivity;
650  }
651 
653  return m_mousesensitivity;
654  }
655 
657  m_acceleration = acceleration;
658  }
659 
661  return m_acceleration;
662  }
663 }
#define FL_WARN(logger, msg)
Definition: logger.h:72
void removeMouseListener(IMouseListener *listener)
Removes an added listener from the controller.
KeyEventType getType() const
Definition: ec_keyevent.h:65
float getMouseSensitivity() const
Gets mouse sensitivity.
virtual void setControlPressed(bool pressed)
Definition: ec_inputevent.h:66
void setY(int32_t y)
Listener of SDL events.
void addKeyListenerFront(IKeyListener *listener)
Adds a listener to the front of the listener deque Listener will be notified via the corresponding ev...
Class for mouse events.
Definition: ec_mouseevent.h:42
virtual bool isConsumed() const
Checks if the event is consumed.
Definition: ec_command.h:70
static T Sqrt(T _val)
Definition: fife_math.h:276
T h
Height of the rectangle.
Definition: rect.h:93
IKeyFilter * m_keyfilter
Definition: eventmanager.h:171
void setKey(const Key &key)
Definition: ec_keyevent.h:72
Helper class to create log strings out from separate parts Usage: LMsg("some text") << variable << "...
Definition: logger.h:82
KeyType getValue() const
Gets the value of the key.
Definition: ec_key.h:305
Controller provides a way to receive events from the system Using this interface, clients can subscri...
Definition: ec_ikeyfilter.h:42
Base class for input events (like mouse and keyboard)
Definition: ec_inputevent.h:42
MouseEventType getType() const
Gets the type of the event.
Definition: ec_mouseevent.h:98
T x
The X Coordinate.
Definition: rect.h:84
std::deque< IKeyListener * > m_pending_keylisteners
Definition: eventmanager.h:156
std::deque< IMouseListener * > m_pending_mouselisteners
Definition: eventmanager.h:161
std::deque< ISdlEventListener * > m_pending_sdleventlisteners_front
Definition: eventmanager.h:167
bool combineEvents(SDL_Event &event1, const SDL_Event &event2)
virtual void setShiftPressed(bool pressed)
Definition: ec_inputevent.h:76
Listener of command events.
void setMouseFilter(IMouseFilter *mouseFilter)
virtual void setSource(IEventSource *source)
Sets the source of the event.
Definition: ec_command.h:72
virtual void setSource(IEventSource *source)
Sets the source of the event.
MouseButtonType getButton() const
Gets the button of the mouse event.
Definition: ec_mouseevent.h:91
void addSdlEventListener(ISdlEventListener *listener)
Adds a listener to the back of the listener deque Listener will be notified via the corresponding eve...
static Logger _log(LM_AUDIO)
void dispatchCommand(Command &command)
Use this method to send command to command listeners.
void addCommandListenerFront(ICommandListener *listener)
Adds a listener to the front of the listener deque Listener will be notified via the corresponding ev...
Listener of mouse events.
void setMouseAccelerationEnabled(bool acceleration)
Sets mouse acceleration if mouse acceleration is enabled, then the mouse sensitivity is used as speed...
virtual void setAltPressed(bool pressed)
Definition: ec_inputevent.h:61
std::deque< IKeyListener * > m_pending_kldeletions
Definition: eventmanager.h:158
virtual void setControlPressed(bool pressed)
Definition: ec_keyevent.h:77
static RenderBackend * instance()
Definition: singleton.h:84
virtual void setShiftPressed(bool pressed)
Definition: ec_keyevent.h:81
virtual void setSource(IEventSource *source)
Sets the source of the event.
Definition: ec_keyevent.h:88
void removeCommandListener(ICommandListener *listener)
Removes an added listener from the controller.
IMouseFilter * m_mousefilter
Definition: eventmanager.h:172
void dispatchMouseEvent(MouseEvent &evt)
const Key & getKey() const
Definition: ec_keyevent.h:71
std::deque< ISdlEventListener * > m_pending_sdleventlisteners
Definition: eventmanager.h:166
static bool Equal(T _val1, T _val2)
Definition: fife_math.h:286
virtual void setMetaPressed(bool pressed)
Definition: ec_keyevent.h:79
void addCommandListener(ICommandListener *listener)
Adds a listener to the back of the listener deque Listener will be notified via the corresponding eve...
std::deque< IKeyListener * > m_keylisteners
Definition: eventmanager.h:155
std::deque< ICommandListener * > m_pending_cldeletions
Definition: eventmanager.h:153
void removeListener(std::deque< T > &vec, T &listener)
Class for commands Commands are arbitrary events e.g.
Definition: ec_command.h:44
std::map< int32_t, bool > m_keystatemap
Definition: eventmanager.h:170
void fillMouseEvent(const SDL_Event &sdlevt, MouseEvent &mouseevt)
Controller provides a way to receive events from the system Using this interface, clients can subscri...
EventSourceType getEventSourceType()
Gets the source type of this event.
void addListener(std::deque< T > &vec, T &listener)
std::deque< IMouseListener * > m_pending_mouselisteners_front
Definition: eventmanager.h:162
Represents a key or a character.
Definition: ec_key.h:41
unsigned short uint16_t
Definition: core.h:39
T y
The Y Coordinate.
Definition: rect.h:87
std::iterator_traits< octet_iterator >::difference_type distance(octet_iterator first, octet_iterator last)
Definition: checked.h:187
void setKeyFilter(IKeyFilter *keyFilter)
std::deque< IMouseListener * > m_mouselisteners
Definition: eventmanager.h:160
void setX(int32_t x)
void setNumericPad(bool ispad)
Definition: ec_keyevent.h:69
void setButton(MouseButtonType type)
Definition: ec_mouseevent.h:92
void removeKeyListener(IKeyListener *listener)
Removes an added listener from the controller.
EventManager()
Constructor.
bool isFunctionKey() const
Definition: ec_key.h:299
virtual bool isConsumed() const
Checks if the event is consumed.
void setCommandType(CommandType type)
Definition: ec_command.h:61
void fillKeyEvent(const SDL_Event &sdlevt, KeyEvent &keyevt)
std::deque< IMouseListener * > m_pending_mldeletions
Definition: eventmanager.h:163
void setType(KeyEventType type)
Definition: ec_keyevent.h:66
MouseEvent::MouseButtonType m_mostrecentbtn
Definition: eventmanager.h:174
std::deque< IKeyListener * > m_pending_keylisteners_front
Definition: eventmanager.h:157
bool isMouseAccelerationEnabled() const
Returns if mouse acceleration is enabled or not.
Class for key events.
Definition: ec_keyevent.h:45
void addMouseListener(IMouseListener *listener)
Adds a listener to the back of the listener deque Listener will be notified via the corresponding eve...
std::deque< ISdlEventListener * > m_sdleventlisteners
Definition: eventmanager.h:165
void processKeyEvent(SDL_Event event)
virtual ~EventManager()
Destructor.
bool dispatchSdlEvent(SDL_Event &evt)
Listener of key events.
EventSourceType
Types for different event sources.
void processMouseEvent(SDL_Event event)
void setType(MouseEventType type)
Definition: ec_mouseevent.h:99
void fillModifiers(InputEvent &evt)
void addSdlEventListenerFront(ISdlEventListener *listener)
Adds a listener to the front of the listener deque Listener will be notified via the corresponding ev...
void setMouseSensitivity(float sensitivity)
Sets mouse sensitivity The sensitivity is limited to the range -0.99 - 10.0.
unsigned int uint32_t
Definition: core.h:40
std::deque< ICommandListener * > m_commandlisteners
Definition: eventmanager.h:150
void processEvents()
Process the SDL event queue.
virtual void setMetaPressed(bool pressed)
Definition: ec_inputevent.h:71
virtual bool isFiltered(const MouseEvent &event)=0
Check whether a mouseevent should be filtered out.
void addMouseListenerFront(IMouseListener *listener)
Adds a listener to the front of the listener deque Listener will be notified via the corresponding ev...
std::deque< ICommandListener * > m_pending_commandlisteners_front
Definition: eventmanager.h:152
T w
Width of the rectangle.
Definition: rect.h:90
std::deque< ISdlEventListener * > m_pending_sdldeletions
Definition: eventmanager.h:168
virtual void setAltPressed(bool pressed)
Definition: ec_keyevent.h:75
virtual bool isFiltered(const KeyEvent &event)=0
Check whether a keyevent should be filtered out.
std::deque< ICommandListener * > m_pending_commandlisteners
Definition: eventmanager.h:151
void addKeyListener(IKeyListener *listener)
Adds a listener to the back of the listener deque Listener will be notified via the corresponding eve...
void dispatchKeyEvent(KeyEvent &evt)
void processActiveEvent(SDL_Event event)
const Rect & getArea() const
void removeSdlEventListener(ISdlEventListener *listener)
Removes an added listener from the controller.