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