00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "Core/precomp.h"
00016
00017 #include <windows.h>
00018 #include "API/Core/System/cl_assert.h"
00019 #include "input_keyboard.h"
00020
00021
00022
00023
00024
00025 CL_Keyboard_Win32::CL_Keyboard_Win32()
00026 {
00027 buttons = new CL_InputButton_Keyboard_Win32*[CL_NUM_KEYS];
00028 for (int i=0; i<CL_NUM_KEYS; i++) buttons[i] = NULL;
00029
00030 memset(keys_down, 0, 256);
00031
00032 CL_System_Win32::add_listener(this);
00033 }
00034
00035 CL_Keyboard_Win32::~CL_Keyboard_Win32()
00036 {
00037 CL_System_Win32::remove_listener(this);
00038
00039 for (int i=0; i<CL_NUM_KEYS; i++) delete buttons[i];
00040 delete[] buttons;
00041 }
00042
00043 void CL_Keyboard_Win32::keep_alive()
00044 {
00045 GetKeyboardState(keys_down);
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 }
00065
00066 bool CL_Keyboard_Win32::received_event(UINT uMsg, WPARAM wParam, LPARAM lParam)
00067 {
00068 bool keydown = false;
00069 switch (uMsg)
00070 {
00071 case WM_KEYDOWN:
00072 case WM_SYSKEYDOWN:
00073 keydown = true;
00074 break;
00075
00076 case WM_KEYUP:
00077 case WM_SYSKEYUP:
00078 keydown = false;
00079 break;
00080
00081 default:
00082 return false;
00083 }
00084
00085 static bool lctrl_down = false;
00086 static bool rctrl_down = false;
00087 static bool lshift_down = false;
00088 static bool rshift_down = false;
00089 static bool alt_down = false;
00090 static bool altgr_down = false;
00091
00092 int key = -1;
00093 switch ((int) wParam)
00094 {
00095 case 'A': key = CL_KEY_A; break;
00096 case 'B': key = CL_KEY_B; break;
00097 case 'C': key = CL_KEY_C; break;
00098 case 'D': key = CL_KEY_D; break;
00099 case 'E': key = CL_KEY_E; break;
00100 case 'F': key = CL_KEY_F; break;
00101 case 'G': key = CL_KEY_G; break;
00102 case 'H': key = CL_KEY_H; break;
00103 case 'I': key = CL_KEY_I; break;
00104 case 'J': key = CL_KEY_J; break;
00105 case 'K': key = CL_KEY_K; break;
00106 case 'L': key = CL_KEY_L; break;
00107 case 'M': key = CL_KEY_M; break;
00108 case 'N': key = CL_KEY_N; break;
00109 case 'O': key = CL_KEY_O; break;
00110 case 'P': key = CL_KEY_P; break;
00111 case 'Q': key = CL_KEY_Q; break;
00112 case 'R': key = CL_KEY_R; break;
00113 case 'S': key = CL_KEY_S; break;
00114 case 'T': key = CL_KEY_T; break;
00115 case 'U': key = CL_KEY_U; break;
00116 case 'V': key = CL_KEY_V; break;
00117 case 'W': key = CL_KEY_W; break;
00118 case 'X': key = CL_KEY_X; break;
00119 case 'Y': key = CL_KEY_Y; break;
00120 case 'Z': key = CL_KEY_Z; break;
00121 case '0': key = CL_KEY_0; break;
00122 case '1': key = CL_KEY_1; break;
00123 case '2': key = CL_KEY_2; break;
00124 case '3': key = CL_KEY_3; break;
00125 case '4': key = CL_KEY_4; break;
00126 case '5': key = CL_KEY_5; break;
00127 case '6': key = CL_KEY_6; break;
00128 case '7': key = CL_KEY_7; break;
00129 case '8': key = CL_KEY_8; break;
00130 case '9': key = CL_KEY_9; break;
00131 case VK_F1: key = CL_KEY_F1; break;
00132 case VK_F2: key = CL_KEY_F2; break;
00133 case VK_F3: key = CL_KEY_F3; break;
00134 case VK_F4: key = CL_KEY_F4; break;
00135 case VK_F5: key = CL_KEY_F5; break;
00136 case VK_F6: key = CL_KEY_F6; break;
00137 case VK_F7: key = CL_KEY_F7; break;
00138 case VK_F8: key = CL_KEY_F8; break;
00139 case VK_F9: key = CL_KEY_F9; break;
00140 case VK_F10: key = CL_KEY_F10; break;
00141 case VK_F11: key = CL_KEY_F11; break;
00142 case VK_F12: key = CL_KEY_F12; break;
00143 case VK_ESCAPE: key = CL_KEY_ESCAPE; break;
00144 case VK_LEFT: key = CL_KEY_LEFT; break;
00145 case VK_RIGHT: key = CL_KEY_RIGHT; break;
00146 case VK_UP: key = CL_KEY_UP; break;
00147 case VK_DOWN: key = CL_KEY_DOWN; break;
00148 case VK_CONTROL:
00149 if (keydown)
00150 {
00151 int scancode = (lParam & 0xff0000) >> 16;
00152 bool extended_key = (lParam & 0x1000000) != 0;
00153
00154 if (!lctrl_down && scancode == 29 && !extended_key)
00155
00156 {
00157 key = CL_KEY_LCTRL;
00158 lctrl_down = true;
00159 }
00160 else if (!rctrl_down && scancode == 29 && extended_key)
00161
00162 {
00163 key = CL_KEY_RCTRL;
00164 rctrl_down = true;
00165 }
00166 }
00167 else
00168 {
00169 int scancode = (lParam & 0xff0000) >> 16;
00170 bool extended_key = (lParam & 0x1000000) != 0;
00171
00172 if (lctrl_down && scancode == 29 && !extended_key)
00173
00174 {
00175 key = CL_KEY_LCTRL;
00176 lctrl_down = false;
00177 }
00178 else if (rctrl_down && scancode == 29 && extended_key)
00179
00180 {
00181 key = CL_KEY_RCTRL;
00182 rctrl_down = false;
00183 }
00184 }
00185 break;
00186 case VK_SHIFT:
00187 if (keydown)
00188 {
00189 int scancode = (lParam & 0xff0000) >> 16;
00190
00191 if (!lshift_down && scancode == 42)
00192
00193 {
00194 key = CL_KEY_LSHIFT;
00195 lshift_down = true;
00196 }
00197 else if (!rshift_down && scancode == 54)
00198
00199 {
00200 key = CL_KEY_RSHIFT;
00201 rshift_down = true;
00202 }
00203 }
00204 else
00205 {
00206 int scancode = (lParam & 0xff0000) >> 16;
00207
00208 if (lshift_down && scancode == 42)
00209
00210 {
00211 key = CL_KEY_LSHIFT;
00212 lshift_down = false;
00213 }
00214 else if (rshift_down && scancode == 54)
00215
00216 {
00217 key = CL_KEY_RSHIFT;
00218 rshift_down = false;
00219 }
00220 }
00221 break;
00222 case VK_MENU:
00223 if (keydown)
00224 {
00225 int scancode = (lParam & 0xff0000) >> 16;
00226 bool extended_key = (lParam & 0x1000000) != 0;
00227
00228 if (!alt_down && scancode == 56 && !extended_key)
00229 {
00230 key = CL_KEY_ALT;
00231 alt_down = true;
00232 }
00233 else if (!altgr_down && scancode == 56 && extended_key)
00234 {
00235 key = CL_KEY_ALTGR;
00236 altgr_down = true;
00237 }
00238 }
00239 else
00240 {
00241 int scancode = (lParam & 0xff0000) >> 16;
00242 bool extended_key = (lParam & 0x1000000) != 0;
00243
00244 if (alt_down && scancode == 56 && !extended_key)
00245 {
00246 key = CL_KEY_ALT;
00247 alt_down = false;
00248 }
00249 else if (altgr_down && scancode == 56 && extended_key)
00250 {
00251 key = CL_KEY_ALTGR;
00252 altgr_down = false;
00253 }
00254 }
00255 break;
00256 case VK_TAB: key = CL_KEY_TAB; break;
00257 case VK_RETURN: key = CL_KEY_ENTER; break;
00258 case VK_SPACE: key = CL_KEY_SPACE; break;
00259 case VK_BACK: key = CL_KEY_BACKSPACE; break;
00260 case VK_INSERT: key = CL_KEY_INSERT; break;
00261 case VK_DELETE: key = CL_KEY_DELETE; break;
00262 case VK_HOME: key = CL_KEY_HOME; break;
00263 case VK_END: key = CL_KEY_END; break;
00264 case VK_PRIOR: key = CL_KEY_PAGEUP; break;
00265 case VK_NEXT: key = CL_KEY_PAGEDOWN; break;
00266 case VK_CAPITAL: key = CL_KEY_CAPSLOCK; break;
00267 case VK_NUMLOCK: key = CL_KEY_NUMLOCK; break;
00268 case VK_SCROLL: key = CL_KEY_SCRLOCK; break;
00269 case VK_PRINT: key = CL_KEY_PRINT; break;
00270 case VK_PAUSE: key = CL_KEY_PAUSE; break;
00271 case VK_DIVIDE: key = CL_KEY_KP_DIV; break;
00272 case VK_MULTIPLY: key = CL_KEY_KP_MULT; break;
00273 case VK_SEPARATOR: key = CL_KEY_KP_MINUS; break;
00274 case VK_ADD: key = CL_KEY_KP_PLUS; break;
00275 }
00276
00277 CL_Key k;
00278 k.id = key;
00279 char buf[4];
00280 k.ascii = -1;
00281 int result = ToAscii((UINT) wParam, MapVirtualKey((UINT) wParam, 0), keys_down, (LPWORD) buf, 0);
00282 if (result > 0)
00283 {
00284 k.ascii = buf[result-1];
00285 }
00286 k.state = keydown ? CL_Key::Pressed : CL_Key::Released;
00287
00288 if (keydown) CL_Input::sig_button_press(this, k);
00289 else CL_Input::sig_button_release(this, k);
00290
00291 return true;
00292 }
00293
00294 CL_InputButton *CL_Keyboard_Win32::map_button(int button_num)
00295 {
00296 int key = -1;
00297 switch (button_num)
00298 {
00299 case CL_KEY_A: key = 'A'; break;
00300 case CL_KEY_B: key = 'B'; break;
00301 case CL_KEY_C: key = 'C'; break;
00302 case CL_KEY_D: key = 'D'; break;
00303 case CL_KEY_E: key = 'E'; break;
00304 case CL_KEY_F: key = 'F'; break;
00305 case CL_KEY_G: key = 'G'; break;
00306 case CL_KEY_H: key = 'H'; break;
00307 case CL_KEY_I: key = 'I'; break;
00308 case CL_KEY_J: key = 'J'; break;
00309 case CL_KEY_K: key = 'K'; break;
00310 case CL_KEY_L: key = 'L'; break;
00311 case CL_KEY_M: key = 'M'; break;
00312 case CL_KEY_N: key = 'N'; break;
00313 case CL_KEY_O: key = 'O'; break;
00314 case CL_KEY_P: key = 'P'; break;
00315 case CL_KEY_Q: key = 'Q'; break;
00316 case CL_KEY_R: key = 'R'; break;
00317 case CL_KEY_S: key = 'S'; break;
00318 case CL_KEY_T: key = 'T'; break;
00319 case CL_KEY_U: key = 'U'; break;
00320 case CL_KEY_V: key = 'V'; break;
00321 case CL_KEY_W: key = 'W'; break;
00322 case CL_KEY_X: key = 'X'; break;
00323 case CL_KEY_Y: key = 'Y'; break;
00324 case CL_KEY_Z: key = 'Z'; break;
00325 case CL_KEY_0: key = '0'; break;
00326 case CL_KEY_1: key = '1'; break;
00327 case CL_KEY_2: key = '2'; break;
00328 case CL_KEY_3: key = '3'; break;
00329 case CL_KEY_4: key = '4'; break;
00330 case CL_KEY_5: key = '5'; break;
00331 case CL_KEY_6: key = '6'; break;
00332 case CL_KEY_7: key = '7'; break;
00333 case CL_KEY_8: key = '8'; break;
00334 case CL_KEY_9: key = '9'; break;
00335 case CL_KEY_F1: key = VK_F1; break;
00336 case CL_KEY_F2: key = VK_F2; break;
00337 case CL_KEY_F3: key = VK_F3; break;
00338 case CL_KEY_F4: key = VK_F4; break;
00339 case CL_KEY_F5: key = VK_F5; break;
00340 case CL_KEY_F6: key = VK_F6; break;
00341 case CL_KEY_F7: key = VK_F7; break;
00342 case CL_KEY_F8: key = VK_F8; break;
00343 case CL_KEY_F9: key = VK_F9; break;
00344 case CL_KEY_F10: key = VK_F10; break;
00345 case CL_KEY_F11: key = VK_F11; break;
00346 case CL_KEY_F12: key = VK_F12; break;
00347 case CL_KEY_ESCAPE: key = VK_ESCAPE; break;
00348 case CL_KEY_LEFT: key = VK_LEFT; break;
00349 case CL_KEY_RIGHT: key = VK_RIGHT; break;
00350 case CL_KEY_UP: key = VK_UP; break;
00351 case CL_KEY_DOWN: key = VK_DOWN; break;
00352 case CL_KEY_LCTRL: key = VK_LCONTROL; break;
00353 case CL_KEY_RCTRL: key = VK_RCONTROL; break;
00354 case CL_KEY_LSHIFT: key = VK_LSHIFT; break;
00355 case CL_KEY_RSHIFT: key = VK_RSHIFT; break;
00356 case CL_KEY_ALT: key = VK_LMENU; break;
00357 case CL_KEY_ALTGR: key = VK_RMENU; break;
00358 case CL_KEY_TAB: key = VK_TAB; break;
00359 case CL_KEY_ENTER: key = VK_RETURN; break;
00360 case CL_KEY_SPACE: key = VK_SPACE; break;
00361 case CL_KEY_BACKSPACE: key = VK_BACK; break;
00362 case CL_KEY_INSERT: key = VK_INSERT; break;
00363 case CL_KEY_DELETE: key = VK_DELETE; break;
00364 case CL_KEY_HOME: key = VK_HOME; break;
00365 case CL_KEY_END: key = VK_END; break;
00366 case CL_KEY_PAGEUP: key = VK_PRIOR; break;
00367 case CL_KEY_PAGEDOWN: key = VK_NEXT; break;
00368 case CL_KEY_CAPSLOCK: key = VK_CAPITAL; break;
00369 case CL_KEY_NUMLOCK: key = VK_NUMLOCK; break;
00370 case CL_KEY_SCRLOCK: key = VK_SCROLL; break;
00371 case CL_KEY_PRINT: key = VK_PRINT; break;
00372 case CL_KEY_PAUSE: key = VK_PAUSE; break;
00373 case CL_KEY_KP_DIV: key = VK_DIVIDE; break;
00374 case CL_KEY_KP_MULT: key = VK_MULTIPLY; break;
00375 case CL_KEY_KP_MINUS: key = VK_SEPARATOR; break;
00376 case CL_KEY_KP_PLUS: key = VK_ADD; break;
00377 case CL_KEY_KP_ENTER: key = VK_RETURN; break;
00378 default:
00379 cl_assert(false);
00380 }
00381
00382 if (key != -1)
00383 buttons[button_num] =
00384 new CL_InputButton_Keyboard_Win32(key, keys_down);
00385
00386 return buttons[button_num];
00387 }
00388
00389 char *CL_Keyboard_Win32::get_name() const
00390 {
00391 return "Standard keyboard";
00392 }
00393
00394 int CL_Keyboard_Win32::get_num_buttons() const
00395 {
00396 return CL_NUM_KEYS;
00397 }
00398
00399 CL_InputButton *CL_Keyboard_Win32::get_button(int button_num)
00400 {
00401 if (buttons[button_num] != NULL) return buttons[button_num];
00402
00403 return map_button(button_num);
00404 }
00405
00406 int CL_Keyboard_Win32::get_num_axes() const
00407 {
00408 return 0;
00409 }
00410
00411 CL_InputAxis *CL_Keyboard_Win32::get_axis(int axis_num)
00412 {
00413 return NULL;
00414 }
00415
00416 int CL_Keyboard_Win32::get_num_hats() const
00417 {
00418 return 0;
00419 }
00420
00421 CL_InputHat *CL_Keyboard_Win32::get_hat(int hat_num)
00422 {
00423 return NULL;
00424 }
00425
00426 int CL_Keyboard_Win32::get_num_cursors() const
00427 {
00428 return 0;
00429 }
00430
00431 CL_InputCursor *CL_Keyboard_Win32::get_cursor(int cursor_num)
00432 {
00433 return NULL;
00434 }
00435
00436
00437
00438
00439
00440 CL_InputButton_Keyboard_Win32::CL_InputButton_Keyboard_Win32(
00441 int _key, unsigned char *_keys_down)
00442 {
00443 key = _key;
00444 keys_down = _keys_down;
00445 }
00446
00447 CL_InputButton_Keyboard_Win32::~CL_InputButton_Keyboard_Win32()
00448 {
00449 }
00450
00451 bool CL_InputButton_Keyboard_Win32::is_pressed()
00452 {
00453 if (keys_down[key]&128) return true;
00454 return false;
00455 }