Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

input_keyboard.cpp

Go to the documentation of this file.
00001 /*
00002         $Id: input_keyboard.cpp,v 1.1 2001/03/06 15:09:22 mbn Exp $
00003 
00004         ------------------------------------------------------------------------
00005         ClanLib, the platform independent game SDK.
00006 
00007         This library is distributed under the GNU LIBRARY GENERAL PUBLIC LICENSE
00008         version 2. See COPYING for details.
00009 
00010         For a total list of contributers see CREDITS.
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                 CL_Keyboard_Win32
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         // Since left/right ctrl and shift are not reported by GetKeyboardState,
00048         // We need to set them "manually":
00049 
00050         // Update 18/02/01 Sphair: Is this really used ?
00051 
00052 /*      if (keys_down[VK_CONTROL]&128)
00053         {
00054                 if (GetKeyState(VK_RCONTROL))
00055                 {
00056                         keys_down[VK_RCONTROL] |= 128;
00057                 }   
00058                 if (GetKeyState(VK_LCONTROL))
00059                 {
00060                         keys_down[VK_LCONTROL] |= 128;
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 //                      if (!lctrl_down && GetKeyState(VK_LCONTROL)) 
00156                         {
00157                                 key = CL_KEY_LCTRL;
00158                                 lctrl_down = true;
00159                         }
00160                         else if (!rctrl_down && scancode == 29 && extended_key) 
00161 //                      else if (!rctrl_down && GetKeyState(VK_RCONTROL))
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 //                      if (lctrl_down && !(GetKeyState(VK_LCONTROL)&128)) 
00174                         {
00175                                 key = CL_KEY_LCTRL;
00176                                 lctrl_down = false;
00177                         }
00178                         else if (rctrl_down && scancode == 29 && extended_key) 
00179 //                      else if (rctrl_down && !(GetKeyState(VK_RCONTROL)&128))
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 //                      if (!lshift_down && GetKeyState(VK_LSHIFT))
00193                         {
00194                                 key = CL_KEY_LSHIFT;
00195                                 lshift_down = true;
00196                         }
00197                         else if (!rshift_down && scancode == 54)
00198 //                      else if (!rshift_down && GetKeyState(VK_RSHIFT))
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 //                      if (lshift_down && !(GetKeyState(VK_LSHIFT) & 128)) 
00210                         {
00211                                 key = CL_KEY_LSHIFT;
00212                                 lshift_down = false;
00213                         }
00214                         else if (rshift_down && scancode == 54)
00215 //                      else if (rshift_down && !(GetKeyState(VK_RSHIFT) & 128))
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                 CL_InputButton_Keyboard_Win32
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 }

Generated at Wed Apr 4 19:54:00 2001 for ClanLib by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001