Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/util/event/event_handler.cc @ 4406

Last change on this file since 4406 was 4406, checked in by patrick, 19 years ago

orxonox/trunk: the mouse buttons now should be identified correctly

File size: 4.5 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Patrick Boenzli
13   co-programmer:
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
17
18#include "event_handler.h"
19
20#include "event_listener.h"
21#include "event.h"
22#include "key_mapper.h"
23
24#include "compiler.h"
25#include "debug.h"
26
27using namespace std;
28
29
30/**
31   \brief standard constructor
32*/
33EventHandler::EventHandler () 
34{
35  this->setClassID(CL_EVENT_HANDLER, "EventHandler"); 
36
37  this->listeners = new EventListener**[ES_NUMBER];
38  for(int i = 0; i < ES_NUMBER; ++i)
39    this->listeners[i] = new EventListener*[EV_NUMBER];
40
41  /* now initialize them all to zero */
42  for(int i = 0; i < ES_NUMBER; ++i)
43    {
44      for(int j = 0; j < SDLK_LAST; ++j)
45        {
46          this->listeners[i][j] = NULL;
47        }
48    }
49}
50
51/**
52   \brief the singleton reference to this class
53*/
54EventHandler* EventHandler::singletonRef = NULL;
55
56/**
57   \returns a Pointer to this Class
58*/
59EventHandler* EventHandler::getInstance(void)
60{
61  if (!EventHandler::singletonRef)
62    EventHandler::singletonRef = new EventHandler();
63  return EventHandler::singletonRef;
64}
65
66/**
67   \brief standard deconstructor
68
69*/
70EventHandler::~EventHandler () 
71{
72  EventHandler::singletonRef = NULL;
73}
74
75
76
77void EventHandler::setState(elState state)
78{
79  this->state = state;
80}
81
82void EventHandler::subscribe(EventListener* el, elState state, int eventType)
83{
84  PRINTF(0)("Subscribing event type: %i\n", eventType);
85  if( likely(this->listeners[state][eventType] == NULL))
86    this->listeners[state][eventType] = el;
87  else
88    PRINTF(0)("Someone tried to subscribe to event %i @ state %i but this event has already been subscribed\n", eventType, state);
89}
90
91
92void EventHandler::unsubscribe(int eventType, elState state)
93{
94  PRINTF(0)("Unsubscribing event type nr: %i\n", eventType);
95  this->listeners[state][eventType] = NULL;
96}
97
98void EventHandler::flush(elState state)
99{
100  if( state == ES_ALL)
101    {
102      for(int i = 0; i < ES_NUMBER; ++i)
103        {
104          for(int j = 0; j < SDLK_LAST; ++j)
105            {
106              this->listeners[i][j] = NULL;
107            }
108        }
109    }
110  else
111    {
112      for(int j = 0; j < SDLK_LAST; ++j)
113        {
114          this->listeners[state][j] = NULL;
115        }
116    }
117}
118
119
120
121void EventHandler::process()
122{
123  SDL_Event event;
124  Event ev;
125  EventListener* listener;
126  while( SDL_PollEvent (&event))
127    {
128      switch( event.type)
129        {
130        case SDL_KEYDOWN:
131          ev.bPressed = true;
132          ev.type = event.key.keysym.sym;
133          break;
134        case SDL_KEYUP:
135          ev.bPressed = false;
136          ev.type = event.key.keysym.sym;
137          break;
138        case SDL_MOUSEMOTION:
139          ev.bPressed = false;
140          ev.type = EV_MOUSE_MOTION;
141          ev.x = event.motion.x;
142          ev.y = event.motion.y;
143          ev.xRel = event.motion.xrel;
144          ev.yRel = event.motion.yrel;
145          break;
146        case SDL_MOUSEBUTTONUP:
147          ev.bPressed = false;
148          ev.type = event.button.button + SDLK_LAST;
149          break;
150        case SDL_MOUSEBUTTONDOWN:
151          ev.bPressed = true;
152          ev.type = event.button.button + SDLK_LAST;
153          break;
154        case SDL_JOYAXISMOTION:
155          ev.bPressed = false;
156          ev.type = EV_JOY_AXIS_MOTION;
157          break;
158        case SDL_JOYBALLMOTION:
159          ev.bPressed = false;
160          ev.type = EV_JOY_BALL_MOTION;
161          break;
162        case SDL_JOYHATMOTION:
163          ev.bPressed = false;
164          ev.type = EV_JOY_HAT_MOTION;
165          break;
166        case SDL_JOYBUTTONDOWN:
167          ev.bPressed = true;
168          ev.type = EV_JOY_BUTTON;
169          break;
170        case SDL_JOYBUTTONUP:
171          ev.bPressed = true;
172          ev.type = EV_JOY_BUTTON;
173          break;
174        default:
175          break;
176        }
177
178      /* small debug routine: shows alle events dispatched by the event handler */
179      PRINT(0)("\n==========================| EventHandler::process () |===\n");
180      PRINT(0)("=  Got Event nr%i\n, for state %i", event.type, this->state); 
181     
182      listener = this->listeners[this->state][event.key.keysym.sym];
183      if( listener != NULL)
184        {
185          listener->process(ev);
186          PRINTF(0)("=  Event dispatcher msg: This event has been consumed\n");
187        }
188      else
189        {
190          PRINTF(0)("=  Event dispatcher msg: This event has NOT been consumed\n");
191        }
192
193      PRINT(0)("=======================================================\n");     
194    }
195}
196
197
198void EventHandler::test()
199{
200  PRINT(0)("\n==========================| EventHandler::test () |===\n"); 
201  PRINT(0)("Eventhandler init successfuly\n");
202  KeyMapper km;
203  PRINT(0)("KeyMapper loaded\n");
204  km.loadKeyBindings();
205  km.debug();
206
207  PRINT(0)("=======================================================\n");     
208}
Note: See TracBrowser for help on using the repository browser.