00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #include "guichan/sdl/sdlinput.hpp"
00062
00063 #include "guichan/exception.hpp"
00064
00065 namespace gcn
00066 {
00067 SDLInput::SDLInput()
00068 {
00069 mMouseInWindow = true;
00070 mMouseDown = false;
00071 }
00072
00073 bool SDLInput::isKeyQueueEmpty()
00074 {
00075 return mKeyInputQueue.empty();
00076 }
00077
00078 KeyInput SDLInput::dequeueKeyInput()
00079 {
00080 KeyInput keyInput;
00081
00082 if (mKeyInputQueue.empty())
00083 {
00084 throw GCN_EXCEPTION("The queue is empty.");
00085 }
00086
00087 keyInput = mKeyInputQueue.front();
00088 mKeyInputQueue.pop();
00089
00090 return keyInput;
00091 }
00092
00093 bool SDLInput::isMouseQueueEmpty()
00094 {
00095 return mMouseInputQueue.empty();
00096 }
00097
00098 MouseInput SDLInput::dequeueMouseInput()
00099 {
00100 MouseInput mouseInput;
00101
00102 if (mMouseInputQueue.empty())
00103 {
00104 throw GCN_EXCEPTION("The queue is empty.");
00105 }
00106
00107 mouseInput = mMouseInputQueue.front();
00108 mMouseInputQueue.pop();
00109
00110 return mouseInput;
00111 }
00112
00113 void SDLInput::pushInput(SDL_Event event)
00114 {
00115 KeyInput keyInput;
00116 MouseInput mouseInput;
00117
00118 switch (event.type)
00119 {
00120 case SDL_KEYDOWN:
00121 keyInput.setKey(convertKeyCharacter(event.key.keysym));
00122 keyInput.setType(KeyInput::PRESS);
00123 mKeyInputQueue.push(keyInput);
00124 break;
00125
00126 case SDL_KEYUP:
00127 keyInput.setKey(convertKeyCharacter(event.key.keysym));
00128 keyInput.setType(KeyInput::RELEASE);
00129 mKeyInputQueue.push(keyInput);
00130 break;
00131
00132 case SDL_MOUSEBUTTONDOWN:
00133 mMouseDown = true;
00134 mouseInput.x = event.button.x;
00135 mouseInput.y = event.button.y;
00136 mouseInput.setButton(convertMouseButton(event.button.button));
00137 mouseInput.setType(MouseInput::PRESS);
00138 mouseInput.setTimeStamp(SDL_GetTicks());
00139 mMouseInputQueue.push(mouseInput);
00140 break;
00141
00142 case SDL_MOUSEBUTTONUP:
00143 mMouseDown = false;
00144 mouseInput.x = event.button.x;
00145 mouseInput.y = event.button.y;
00146 mouseInput.setButton(convertMouseButton(event.button.button));
00147 mouseInput.setType(MouseInput::RELEASE);
00148 mouseInput.setTimeStamp(SDL_GetTicks());
00149 mMouseInputQueue.push(mouseInput);
00150 break;
00151
00152 case SDL_MOUSEMOTION:
00153 mouseInput.x = event.button.x;
00154 mouseInput.y = event.button.y;
00155 mouseInput.setButton(MouseInput::EMPTY);
00156 mouseInput.setType(MouseInput::MOTION);
00157 mouseInput.setTimeStamp(SDL_GetTicks());
00158 mMouseInputQueue.push(mouseInput);
00159 break;
00160
00161 case SDL_ACTIVEEVENT:
00162
00163
00164
00165
00166 if ((event.active.state & SDL_APPMOUSEFOCUS)
00167 && !event.active.gain)
00168 {
00169 mMouseInWindow = false;
00170
00171 if (!mMouseDown)
00172 {
00173 mouseInput.x = -1;
00174 mouseInput.y = -1;
00175 mouseInput.setButton(MouseInput::EMPTY);
00176 mouseInput.setType(MouseInput::MOTION);
00177 mMouseInputQueue.push(mouseInput);
00178 }
00179 }
00180
00181 if ((event.active.state & SDL_APPMOUSEFOCUS)
00182 && event.active.gain)
00183 {
00184 mMouseInWindow = true;
00185 }
00186 break;
00187
00188 }
00189 }
00190
00191 int SDLInput::convertMouseButton(int button)
00192 {
00193 switch (button)
00194 {
00195 case SDL_BUTTON_LEFT:
00196 return MouseInput::LEFT;
00197 break;
00198 case SDL_BUTTON_RIGHT:
00199 return MouseInput::RIGHT;
00200 break;
00201 case SDL_BUTTON_MIDDLE:
00202 return MouseInput::MIDDLE;
00203 break;
00204 case SDL_BUTTON_WHEELUP:
00205 return MouseInput::WHEEL_UP;
00206 break;
00207 case SDL_BUTTON_WHEELDOWN:
00208 return MouseInput::WHEEL_DOWN;
00209 break;
00210 }
00211
00212 throw GCN_EXCEPTION("Unknown SDL mouse type.");
00213
00214 return 0;
00215 }
00216
00217 Key SDLInput::convertKeyCharacter(SDL_keysym keysym)
00218 {
00219 int value = 0;
00220 Key key;
00221
00222 if (keysym.unicode < 255)
00223 {
00224 value = (int)keysym.unicode;
00225 }
00226
00227 switch (keysym.sym)
00228 {
00229 case SDLK_TAB:
00230 value = Key::TAB;
00231 break;
00232 case SDLK_LALT:
00233 value = Key::LEFT_ALT;
00234 break;
00235 case SDLK_RALT:
00236 value = Key::RIGHT_ALT;
00237 break;
00238 case SDLK_LSHIFT:
00239 value = Key::LEFT_SHIFT;
00240 break;
00241 case SDLK_RSHIFT:
00242 value = Key::RIGHT_SHIFT;
00243 break;
00244 case SDLK_LCTRL:
00245 value = Key::LEFT_CONTROL;
00246 break;
00247 case SDLK_RCTRL:
00248 value = Key::RIGHT_CONTROL;
00249 break;
00250 case SDLK_BACKSPACE:
00251 value = Key::BACKSPACE;
00252 break;
00253 case SDLK_PAUSE:
00254 value = Key::PAUSE;
00255 break;
00256 case SDLK_SPACE:
00257 value = Key::SPACE;
00258 break;
00259 case SDLK_ESCAPE:
00260 value = Key::ESCAPE;
00261 break;
00262 case SDLK_DELETE:
00263 value = Key::DELETE;
00264 break;
00265 case SDLK_INSERT:
00266 value = Key::INSERT;
00267 break;
00268 case SDLK_HOME:
00269 value = Key::HOME;
00270 break;
00271 case SDLK_END:
00272 value = Key::END;
00273 break;
00274 case SDLK_PAGEUP:
00275 value = Key::PAGE_UP;
00276 break;
00277 case SDLK_PRINT:
00278 value = Key::PRINT_SCREEN;
00279 break;
00280 case SDLK_PAGEDOWN:
00281 value = Key::PAGE_DOWN;
00282 break;
00283 case SDLK_F1:
00284 value = Key::F1;
00285 break;
00286 case SDLK_F2:
00287 value = Key::F2;
00288 break;
00289 case SDLK_F3:
00290 value = Key::F3;
00291 break;
00292 case SDLK_F4:
00293 value = Key::F4;
00294 break;
00295 case SDLK_F5:
00296 value = Key::F5;
00297 break;
00298 case SDLK_F6:
00299 value = Key::F6;
00300 break;
00301 case SDLK_F7:
00302 value = Key::F7;
00303 break;
00304 case SDLK_F8:
00305 value = Key::F8;
00306 break;
00307 case SDLK_F9:
00308 value = Key::F9;
00309 break;
00310 case SDLK_F10:
00311 value = Key::F10;
00312 break;
00313 case SDLK_F11:
00314 value = Key::F11;
00315 break;
00316 case SDLK_F12:
00317 value = Key::F12;
00318 break;
00319 case SDLK_F13:
00320 value = Key::F13;
00321 break;
00322 case SDLK_F14:
00323 value = Key::F14;
00324 break;
00325 case SDLK_F15:
00326 value = Key::F15;
00327 break;
00328 case SDLK_NUMLOCK:
00329 value = Key::NUM_LOCK;
00330 break;
00331 case SDLK_CAPSLOCK:
00332 value = Key::CAPS_LOCK;
00333 break;
00334 case SDLK_SCROLLOCK:
00335 value = Key::SCROLL_LOCK;
00336 break;
00337 case SDLK_RMETA:
00338 value = Key::RIGHT_META;
00339 break;
00340 case SDLK_LMETA:
00341 value = Key::LEFT_META;
00342 break;
00343 case SDLK_LSUPER:
00344 value = Key::LEFT_SUPER;
00345 break;
00346 case SDLK_RSUPER:
00347 value = Key::RIGHT_SUPER;
00348 break;
00349 case SDLK_MODE:
00350 value = Key::ALT_GR;
00351 break;
00352 case SDLK_UP:
00353 value = Key::UP;
00354 break;
00355 case SDLK_DOWN:
00356 value = Key::DOWN;
00357 break;
00358 case SDLK_LEFT:
00359 value = Key::LEFT;
00360 break;
00361 case SDLK_RIGHT:
00362 value = Key::RIGHT;
00363 break;
00364 case SDLK_RETURN:
00365 value = Key::ENTER;
00366 break;
00367 case SDLK_KP_ENTER:
00368 value = Key::ENTER;
00369 break;
00370
00371 default:
00372 break;
00373 }
00374
00375 if (!(keysym.mod & KMOD_NUM))
00376 {
00377 switch (keysym.sym)
00378 {
00379 case SDLK_KP0:
00380 value = Key::INSERT;
00381 break;
00382 case SDLK_KP1:
00383 value = Key::END;
00384 break;
00385 case SDLK_KP2:
00386 value = Key::DOWN;
00387 break;
00388 case SDLK_KP3:
00389 value = Key::PAGE_DOWN;
00390 break;
00391 case SDLK_KP4:
00392 value = Key::LEFT;
00393 break;
00394 case SDLK_KP5:
00395 value = 0;
00396 break;
00397 case SDLK_KP6:
00398 value = Key::RIGHT;
00399 break;
00400 case SDLK_KP7:
00401 value = Key::HOME;
00402 break;
00403 case SDLK_KP8:
00404 value = Key::UP;
00405 break;
00406 case SDLK_KP9:
00407 value = Key::PAGE_UP;
00408 break;
00409 default:
00410 break;
00411 }
00412 }
00413
00414 key.setValue(value);
00415 key.setShiftPressed(keysym.mod & KMOD_SHIFT);
00416 key.setControlPressed(keysym.mod & KMOD_CTRL);
00417 key.setAltPressed(keysym.mod & KMOD_ALT);
00418 key.setMetaPressed(keysym.mod & KMOD_META);
00419
00420 if (keysym.sym >= SDLK_KP0 && keysym.sym <= SDLK_KP_EQUALS)
00421 {
00422 key.setNumericPad(true);
00423 }
00424
00425 return key;
00426 }
00427 }