Changeset 1494 for code/branches/network/src/ois/linux
- Timestamp:
- May 31, 2008, 11:24:44 PM (17 years ago)
- Location:
- code/branches/network/src/ois/linux
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/network/src/ois/linux/EventHelpers.cpp
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/EventHelpers.h
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxForceFeedback.cpp
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxForceFeedback.h
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxInputManager.cpp
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxInputManager.h
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxJoyStickEvents.cpp
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxJoyStickEvents.h
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxKeyboard.cpp
- Property svn:eol-style set to native
r1349 r1494 1 /* 2 The zlib/libpng License 3 4 Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com) 5 6 This software is provided 'as-is', without any express or implied warranty. In no event will 7 the authors be held liable for any damages arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, including commercial 10 applications, and to alter it and redistribute it freely, subject to the following 11 restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not claim that 14 you wrote the original software. If you use this software in a product, 15 an acknowledgment in the product documentation would be appreciated but is 16 not required. 17 18 2. Altered source versions must be plainly marked as such, and must not be 19 misrepresented as being the original software. 20 21 3. This notice may not be removed or altered from any source distribution. 22 */ 23 #include "linux/LinuxInputManager.h" 24 #include "linux/LinuxKeyboard.h" 25 #include "OISException.h" 26 #include "OISEvents.h" 27 28 #include <X11/keysym.h> 29 #include <X11/Xutil.h> 30 #include <cstring> 31 32 using namespace OIS; 33 #include <iostream> 34 //-------------------------------------------------------------------// 35 LinuxKeyboard::LinuxKeyboard(InputManager* creator, bool buffered, bool grab, bool useXRepeat) 36 : Keyboard(creator->inputSystemName(), buffered, 0, creator) 37 { 38 setlocale(LC_CTYPE, ""); //Set the locale to (hopefully) the users LANG UTF-8 Env var 39 40 display = 0; 41 window = 0; 42 43 grabKeyboard = grab; 44 keyFocusLost = false; 45 46 xAutoRepeat = useXRepeat; 47 oldXAutoRepeat = false; 48 49 //X Key Map to KeyCode 50 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_1, KC_1)); 51 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_2, KC_2)); 52 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_3, KC_3)); 53 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_4, KC_4)); 54 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_5, KC_5)); 55 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_6, KC_6)); 56 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_7, KC_7)); 57 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_8, KC_8)); 58 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_9, KC_9)); 59 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_0, KC_0)); 60 61 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_BackSpace, KC_BACK)); 62 63 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_minus, KC_MINUS)); 64 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_equal, KC_EQUALS)); 65 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_space, KC_SPACE)); 66 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_comma, KC_COMMA)); 67 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_period, KC_PERIOD)); 68 69 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_backslash, KC_BACKSLASH)); 70 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_slash, KC_SLASH)); 71 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_bracketleft, KC_LBRACKET)); 72 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_bracketright, KC_RBRACKET)); 73 74 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Escape,KC_ESCAPE)); 75 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Caps_Lock, KC_CAPITAL)); 76 77 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Tab, KC_TAB)); 78 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Return, KC_RETURN)); 79 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Control_L, KC_LCONTROL)); 80 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Control_R, KC_RCONTROL)); 81 82 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_colon, KC_COLON)); 83 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_semicolon, KC_SEMICOLON)); 84 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_apostrophe, KC_APOSTROPHE)); 85 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_grave, KC_GRAVE)); 86 87 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_b, KC_B)); 88 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_a, KC_A)); 89 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_c, KC_C)); 90 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_d, KC_D)); 91 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_e, KC_E)); 92 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_f, KC_F)); 93 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_g, KC_G)); 94 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_h, KC_H)); 95 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_i, KC_I)); 96 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_j, KC_J)); 97 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_k, KC_K)); 98 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_l, KC_L)); 99 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_m, KC_M)); 100 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_n, KC_N)); 101 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_o, KC_O)); 102 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_p, KC_P)); 103 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_q, KC_Q)); 104 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_r, KC_R)); 105 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_s, KC_S)); 106 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_t, KC_T)); 107 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_u, KC_U)); 108 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_v, KC_V)); 109 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_w, KC_W)); 110 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_x, KC_X)); 111 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_y, KC_Y)); 112 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_z, KC_Z)); 113 114 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F1, KC_F1)); 115 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F2, KC_F2)); 116 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F3, KC_F3)); 117 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F4, KC_F4)); 118 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F5, KC_F5)); 119 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F6, KC_F6)); 120 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F7, KC_F7)); 121 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F8, KC_F8)); 122 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F9, KC_F9)); 123 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F10, KC_F10)); 124 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F11, KC_F11)); 125 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F12, KC_F12)); 126 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F13, KC_F13)); 127 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F14, KC_F14)); 128 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F15, KC_F15)); 129 130 //Keypad 131 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_0, KC_NUMPAD0)); 132 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_1, KC_NUMPAD1)); 133 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_2, KC_NUMPAD2)); 134 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_3, KC_NUMPAD3)); 135 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_4, KC_NUMPAD4)); 136 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_5, KC_NUMPAD5)); 137 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_6, KC_NUMPAD6)); 138 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_7, KC_NUMPAD7)); 139 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_8, KC_NUMPAD8)); 140 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_9, KC_NUMPAD9)); 141 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Add, KC_ADD)); 142 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Subtract, KC_SUBTRACT)); 143 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Decimal, KC_DECIMAL)); 144 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Equal, KC_NUMPADEQUALS)); 145 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Divide, KC_DIVIDE)); 146 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Multiply, KC_MULTIPLY)); 147 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Enter, KC_NUMPADENTER)); 148 149 //Keypad with numlock off 150 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Home, KC_NUMPAD7)); 151 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Up, KC_NUMPAD8)); 152 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Page_Up, KC_NUMPAD9)); 153 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Left, KC_NUMPAD4)); 154 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Begin, KC_NUMPAD5)); 155 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Right, KC_NUMPAD6)); 156 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_End, KC_NUMPAD1)); 157 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Down, KC_NUMPAD2)); 158 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Page_Down, KC_NUMPAD3)); 159 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Insert, KC_NUMPAD0)); 160 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Delete, KC_DECIMAL)); 161 162 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Up, KC_UP)); 163 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Down, KC_DOWN)); 164 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Left, KC_LEFT)); 165 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Right, KC_RIGHT)); 166 167 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Page_Up, KC_PGUP)); 168 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Page_Down, KC_PGDOWN)); 169 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Home, KC_HOME)); 170 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_End, KC_END)); 171 172 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Num_Lock, KC_NUMLOCK)); 173 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Print, KC_SYSRQ)); 174 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Scroll_Lock, KC_SCROLL)); 175 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Pause, KC_PAUSE)); 176 177 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Shift_R, KC_RSHIFT)); 178 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Shift_L, KC_LSHIFT)); 179 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Alt_R, KC_RMENU)); 180 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Alt_L, KC_LMENU)); 181 182 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Insert, KC_INSERT)); 183 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Delete, KC_DELETE)); 184 185 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Super_L, KC_LWIN)); 186 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Super_R, KC_RWIN)); 187 keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Menu, KC_APPS)); 188 189 static_cast<LinuxInputManager*>(mCreator)->_setKeyboardUsed(true); 190 } 191 192 //-------------------------------------------------------------------// 193 void LinuxKeyboard::_initialize() 194 { 195 //Clear our keyboard state buffer 196 memset( &KeyBuffer, 0, 256 ); 197 mModifiers = 0; 198 199 if( display ) XCloseDisplay(display); 200 display = 0; 201 window = static_cast<LinuxInputManager*>(mCreator)->_getWindow(); 202 203 //Create our local X mListener connection 204 if( !(display = XOpenDisplay(0)) ) 205 OIS_EXCEPT(E_General, "LinuxKeyboard::_initialize >> Error opening X!"); 206 207 //Set it to recieve Input events 208 if( XSelectInput(display, window, KeyPressMask | KeyReleaseMask) == BadWindow ) 209 OIS_EXCEPT(E_General, "LinuxKeyboard::_initialize: X error!"); 210 211 if( grabKeyboard ) 212 XGrabKeyboard(display,window,True,GrabModeAsync,GrabModeAsync,CurrentTime); 213 214 keyFocusLost = false; 215 216 if( xAutoRepeat == false ) 217 { 218 //We do not want to blindly turn on autorepeat later when quiting if 219 //it was not on to begin with.. So, let us check and see first 220 XKeyboardState old; 221 XGetKeyboardControl( display, &old ); 222 oldXAutoRepeat = false; 223 224 if( old.global_auto_repeat == AutoRepeatModeOn ) 225 oldXAutoRepeat = true; 226 227 XAutoRepeatOff( display ); 228 } 229 } 230 231 //-------------------------------------------------------------------// 232 LinuxKeyboard::~LinuxKeyboard() 233 { 234 if( display ) 235 { 236 if( oldXAutoRepeat ) 237 XAutoRepeatOn(display); 238 239 if( grabKeyboard ) 240 XUngrabKeyboard(display, CurrentTime); 241 242 XCloseDisplay(display); 243 } 244 245 static_cast<LinuxInputManager*>(mCreator)->_setKeyboardUsed(true); 246 } 247 248 //-------------------------------------------------------------------// 249 unsigned int UTF8ToUTF32(unsigned char* buf) 250 { 251 unsigned char &FirstChar = buf[0]; 252 253 if(FirstChar < 128) 254 return FirstChar; 255 256 unsigned int val = 0; 257 unsigned int len = 0; 258 259 if((FirstChar & 0xE0) == 0xC0) //2 Chars 260 { 261 len = 2; 262 val = FirstChar & 0x1F; 263 } 264 else if((FirstChar & 0xF0) == 0xE0) //3 Chars 265 { 266 len = 3; 267 val = FirstChar & 0x0F; 268 } 269 else if((FirstChar & 0xF8) == 0xF0) //4 Chars 270 { 271 len = 4; 272 val = FirstChar & 0x07; 273 } 274 else if((FirstChar & 0xFC) == 0xF8) //5 Chars 275 { 276 len = 5; 277 val = FirstChar & 0x03; 278 } 279 else // if((FirstChar & 0xFE) == 0xFC) //6 Chars 280 { 281 len = 6; 282 val = FirstChar & 0x01; 283 } 284 285 for(int i = 1; i < len; i++) 286 val = (val << 6) | (buf[i] & 0x3F); 287 288 return val; 289 } 290 291 //-------------------------------------------------------------------// 292 bool LinuxKeyboard::isKeyDown( KeyCode key ) const 293 { 294 return (KeyBuffer[key]); 295 } 296 297 //-------------------------------------------------------------------// 298 void LinuxKeyboard::capture() 299 { 300 KeySym key; 301 XEvent event; 302 LinuxInputManager* linMan = static_cast<LinuxInputManager*>(mCreator); 303 304 while( XPending(display) > 0 ) 305 { 306 1 /*The zlib/libpng LicenseCopyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)This software is provided 'as-is', without any express or implied warranty. In no event willthe authors be held liable for any damages arising from the use of this software.Permission is granted to anyone to use this software for any purpose, including commercialapplications, and to alter it and redistribute it freely, subject to the followingrestrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.*/#include "linux/LinuxInputManager.h"#include "linux/LinuxKeyboard.h"#include "OISException.h"#include "OISEvents.h"#include <X11/keysym.h>#include <X11/Xutil.h>#include <cstring>using namespace OIS;#include <iostream>//-------------------------------------------------------------------//LinuxKeyboard::LinuxKeyboard(InputManager* creator, bool buffered, bool grab, bool useXRepeat) : Keyboard(creator->inputSystemName(), buffered, 0, creator){ setlocale(LC_CTYPE, ""); //Set the locale to (hopefully) the users LANG UTF-8 Env var display = 0; window = 0; grabKeyboard = grab; keyFocusLost = false; xAutoRepeat = useXRepeat; oldXAutoRepeat = false; //X Key Map to KeyCode keyConversion.insert(XtoOIS_KeyMap::value_type(XK_1, KC_1)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_2, KC_2)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_3, KC_3)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_4, KC_4)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_5, KC_5)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_6, KC_6)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_7, KC_7)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_8, KC_8)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_9, KC_9)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_0, KC_0)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_BackSpace, KC_BACK)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_minus, KC_MINUS)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_equal, KC_EQUALS)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_space, KC_SPACE)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_comma, KC_COMMA)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_period, KC_PERIOD)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_backslash, KC_BACKSLASH)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_slash, KC_SLASH)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_bracketleft, KC_LBRACKET)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_bracketright, KC_RBRACKET)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Escape,KC_ESCAPE)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Caps_Lock, KC_CAPITAL)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Tab, KC_TAB)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Return, KC_RETURN)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Control_L, KC_LCONTROL)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Control_R, KC_RCONTROL)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_colon, KC_COLON)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_semicolon, KC_SEMICOLON)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_apostrophe, KC_APOSTROPHE)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_grave, KC_GRAVE)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_b, KC_B)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_a, KC_A)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_c, KC_C)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_d, KC_D)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_e, KC_E)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_f, KC_F)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_g, KC_G)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_h, KC_H)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_i, KC_I)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_j, KC_J)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_k, KC_K)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_l, KC_L)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_m, KC_M)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_n, KC_N)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_o, KC_O)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_p, KC_P)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_q, KC_Q)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_r, KC_R)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_s, KC_S)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_t, KC_T)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_u, KC_U)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_v, KC_V)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_w, KC_W)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_x, KC_X)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_y, KC_Y)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_z, KC_Z)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F1, KC_F1)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F2, KC_F2)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F3, KC_F3)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F4, KC_F4)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F5, KC_F5)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F6, KC_F6)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F7, KC_F7)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F8, KC_F8)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F9, KC_F9)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F10, KC_F10)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F11, KC_F11)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F12, KC_F12)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F13, KC_F13)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F14, KC_F14)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_F15, KC_F15)); //Keypad keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_0, KC_NUMPAD0)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_1, KC_NUMPAD1)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_2, KC_NUMPAD2)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_3, KC_NUMPAD3)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_4, KC_NUMPAD4)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_5, KC_NUMPAD5)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_6, KC_NUMPAD6)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_7, KC_NUMPAD7)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_8, KC_NUMPAD8)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_9, KC_NUMPAD9)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Add, KC_ADD)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Subtract, KC_SUBTRACT)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Decimal, KC_DECIMAL)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Equal, KC_NUMPADEQUALS)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Divide, KC_DIVIDE)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Multiply, KC_MULTIPLY)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Enter, KC_NUMPADENTER)); //Keypad with numlock off keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Home, KC_NUMPAD7)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Up, KC_NUMPAD8)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Page_Up, KC_NUMPAD9)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Left, KC_NUMPAD4)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Begin, KC_NUMPAD5)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Right, KC_NUMPAD6)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_End, KC_NUMPAD1)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Down, KC_NUMPAD2)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Page_Down, KC_NUMPAD3)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Insert, KC_NUMPAD0)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_KP_Delete, KC_DECIMAL)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Up, KC_UP)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Down, KC_DOWN)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Left, KC_LEFT)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Right, KC_RIGHT)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Page_Up, KC_PGUP)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Page_Down, KC_PGDOWN)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Home, KC_HOME)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_End, KC_END)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Num_Lock, KC_NUMLOCK)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Print, KC_SYSRQ)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Scroll_Lock, KC_SCROLL)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Pause, KC_PAUSE)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Shift_R, KC_RSHIFT)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Shift_L, KC_LSHIFT)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Alt_R, KC_RMENU)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Alt_L, KC_LMENU)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Insert, KC_INSERT)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Delete, KC_DELETE)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Super_L, KC_LWIN)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Super_R, KC_RWIN)); keyConversion.insert(XtoOIS_KeyMap::value_type(XK_Menu, KC_APPS)); static_cast<LinuxInputManager*>(mCreator)->_setKeyboardUsed(true);}//-------------------------------------------------------------------//void LinuxKeyboard::_initialize(){ //Clear our keyboard state buffer memset( &KeyBuffer, 0, 256 ); mModifiers = 0; if( display ) XCloseDisplay(display); display = 0; window = static_cast<LinuxInputManager*>(mCreator)->_getWindow(); //Create our local X mListener connection if( !(display = XOpenDisplay(0)) ) OIS_EXCEPT(E_General, "LinuxKeyboard::_initialize >> Error opening X!"); //Set it to recieve Input events if( XSelectInput(display, window, KeyPressMask | KeyReleaseMask) == BadWindow ) OIS_EXCEPT(E_General, "LinuxKeyboard::_initialize: X error!"); if( grabKeyboard ) XGrabKeyboard(display,window,True,GrabModeAsync,GrabModeAsync,CurrentTime); keyFocusLost = false; if( xAutoRepeat == false ) { //We do not want to blindly turn on autorepeat later when quiting if //it was not on to begin with.. So, let us check and see first XKeyboardState old; XGetKeyboardControl( display, &old ); oldXAutoRepeat = false; if( old.global_auto_repeat == AutoRepeatModeOn ) oldXAutoRepeat = true; XAutoRepeatOff( display ); }}//-------------------------------------------------------------------//LinuxKeyboard::~LinuxKeyboard(){ if( display ) { if( oldXAutoRepeat ) XAutoRepeatOn(display); if( grabKeyboard ) XUngrabKeyboard(display, CurrentTime); XCloseDisplay(display); } static_cast<LinuxInputManager*>(mCreator)->_setKeyboardUsed(true);}//-------------------------------------------------------------------//unsigned int UTF8ToUTF32(unsigned char* buf){ unsigned char &FirstChar = buf[0]; if(FirstChar < 128) return FirstChar; unsigned int val = 0; unsigned int len = 0; if((FirstChar & 0xE0) == 0xC0) //2 Chars { len = 2; val = FirstChar & 0x1F; } else if((FirstChar & 0xF0) == 0xE0) //3 Chars { len = 3; val = FirstChar & 0x0F; } else if((FirstChar & 0xF8) == 0xF0) //4 Chars { len = 4; val = FirstChar & 0x07; } else if((FirstChar & 0xFC) == 0xF8) //5 Chars { len = 5; val = FirstChar & 0x03; } else // if((FirstChar & 0xFE) == 0xFC) //6 Chars { len = 6; val = FirstChar & 0x01; } for(int i = 1; i < len; i++) val = (val << 6) | (buf[i] & 0x3F); return val;}//-------------------------------------------------------------------//bool LinuxKeyboard::isKeyDown( KeyCode key ) const{ return (KeyBuffer[key]);}//-------------------------------------------------------------------//void LinuxKeyboard::capture(){ KeySym key; XEvent event; LinuxInputManager* linMan = static_cast<LinuxInputManager*>(mCreator); while( XPending(display) > 0 ) { 307 2 XNextEvent(display, &event); 308 3 309 310 311 if( KeyPress == event.type ) 312 { 313 unsigned int character = 0; 314 315 if( mTextMode != Off ) 316 { 317 unsigned char buffer[6] = {0,0,0,0,0,0}; 318 XLookupString(&event.xkey, (char*)buffer, 6, &key, 0); 319 320 if( mTextMode == Unicode ) 321 character = UTF8ToUTF32(buffer); 322 else if( mTextMode == Ascii) 323 character = buffer[0]; 324 } 325 326 //Mask out the modifier states X11 sets and read again 327 event.xkey.state &= ~ShiftMask; 328 event.xkey.state &= ~LockMask; 329 XLookupString(&event.xkey, 0, 0,&key, 0); 330 331 _injectKeyDown(key, character); 332 333 //Just printing out some debugging info.. to verify all chars are mapped 334 //std::cout << "KEY PRESSED X=" << event.xkey.keycode; 335 //std::cout << "\n KeySym=" << key << std::endl; 336 337 //Check for Alt-Tab 338 if( event.xkey.state & Mod1Mask && key == XK_Tab ) 339 linMan->_setGrabState(false); 340 } 341 342 else if( KeyRelease == event.type ) 343 { 344 //Mask out the modifier states X sets.. or we will get improper values 345 event.xkey.state &= ~ShiftMask; 346 event.xkey.state &= ~LockMask; 347 348 //Else, it is a valid key release 349 XLookupString(&event.xkey,NULL,0,&key,NULL); 350 _injectKeyUp(key); 351 352 } 353 } 354 355 //If grabbing mode is on.. Handle focus lost/gained via Alt-Tab and mouse clicks 356 if( grabKeyboard ) 357 { 358 if( linMan->_getGrabState() == false ) 359 { 360 // are no longer grabbing 361 if( keyFocusLost == false ) 362 { 363 //UnGrab KeyBoard 364 XUngrabKeyboard(display, CurrentTime); 365 keyFocusLost = true; 366 } 367 } 368 else 369 { 370 //We are grabbing - and regained focus 371 if( keyFocusLost == true ) 372 { 373 //ReGrab KeyBoard 374 XGrabKeyboard(display, window, True, GrabModeAsync, GrabModeAsync, CurrentTime); 375 keyFocusLost = false; 376 } 377 } 378 } 379 } 380 381 //-------------------------------------------------------------------// 382 void LinuxKeyboard::setBuffered(bool buffered) 383 { 384 mBuffered = buffered; 385 } 386 387 //-------------------------------------------------------------------// 388 bool LinuxKeyboard::_injectKeyDown( KeySym key, int text ) 389 { 390 KeyCode kc = keyConversion[key]; 391 KeyBuffer[kc] = 1; 392 393 //Turn on modifier flags 394 if( kc == KC_LCONTROL || kc == KC_RCONTROL) 395 mModifiers |= Ctrl; 396 else if( kc == KC_LSHIFT || kc == KC_RSHIFT ) 397 mModifiers |= Shift; 398 else if( kc == KC_LMENU || kc == KC_RMENU ) 399 mModifiers |= Alt; 400 401 if( mBuffered && mListener ) 402 return mListener->keyPressed(KeyEvent(this,kc,text)); 403 404 return true; 405 } 406 407 //-------------------------------------------------------------------// 408 bool LinuxKeyboard::_injectKeyUp( KeySym key ) 409 { 410 KeyCode kc = keyConversion[key]; 411 KeyBuffer[kc] = 0; 412 413 //Turn off modifier flags 414 if( kc == KC_LCONTROL || kc == KC_RCONTROL) 415 mModifiers &= ~Ctrl; 416 else if( kc == KC_LSHIFT || kc == KC_RSHIFT ) 417 mModifiers &= ~Shift; 418 else if( kc == KC_LMENU || kc == KC_RMENU ) 419 mModifiers &= ~Alt; 420 421 if( mBuffered && mListener ) 422 return mListener->keyReleased(KeyEvent(this, kc, 0)); 423 424 return true; 425 } 426 427 //-------------------------------------------------------------------// 428 const std::string& LinuxKeyboard::getAsString( KeyCode kc ) 429 { 430 mGetString = "Unknown"; 431 char *temp = 0; 432 433 XtoOIS_KeyMap::iterator i = keyConversion.begin(), 434 e = keyConversion.end(); 435 436 for( ; i != e; ++i ) 437 { 438 if( i->second == kc ) 439 { 440 temp = XKeysymToString(i->first); 441 if( temp ) 442 mGetString = temp; 443 break; 444 } 445 } 446 447 return mGetString; 448 } 449 450 //-------------------------------------------------------------------// 451 void LinuxKeyboard::copyKeyStates( char keys[256] ) const 452 { 453 memcpy( keys, KeyBuffer, 256 ); 454 } 4 if( KeyPress == event.type ) { unsigned int character = 0; if( mTextMode != Off ) { unsigned char buffer[6] = {0,0,0,0,0,0}; XLookupString(&event.xkey, (char*)buffer, 6, &key, 0); if( mTextMode == Unicode ) character = UTF8ToUTF32(buffer); else if( mTextMode == Ascii) character = buffer[0]; } //Mask out the modifier states X11 sets and read again event.xkey.state &= ~ShiftMask; event.xkey.state &= ~LockMask; XLookupString(&event.xkey, 0, 0,&key, 0); _injectKeyDown(key, character); //Just printing out some debugging info.. to verify all chars are mapped //std::cout << "KEY PRESSED X=" << event.xkey.keycode; //std::cout << "\n KeySym=" << key << std::endl; //Check for Alt-Tab if( event.xkey.state & Mod1Mask && key == XK_Tab ) linMan->_setGrabState(false); } 5 else if( KeyRelease == event.type ) { //Mask out the modifier states X sets.. or we will get improper values event.xkey.state &= ~ShiftMask; event.xkey.state &= ~LockMask; //Else, it is a valid key release XLookupString(&event.xkey,NULL,0,&key,NULL); _injectKeyUp(key); 6 } } //If grabbing mode is on.. Handle focus lost/gained via Alt-Tab and mouse clicks if( grabKeyboard ) { if( linMan->_getGrabState() == false ) { // are no longer grabbing if( keyFocusLost == false ) { //UnGrab KeyBoard XUngrabKeyboard(display, CurrentTime); keyFocusLost = true; } } else { //We are grabbing - and regained focus if( keyFocusLost == true ) { //ReGrab KeyBoard XGrabKeyboard(display, window, True, GrabModeAsync, GrabModeAsync, CurrentTime); keyFocusLost = false; } } }}//-------------------------------------------------------------------//void LinuxKeyboard::setBuffered(bool buffered){ mBuffered = buffered;}//-------------------------------------------------------------------//bool LinuxKeyboard::_injectKeyDown( KeySym key, int text ){ KeyCode kc = keyConversion[key]; KeyBuffer[kc] = 1; //Turn on modifier flags if( kc == KC_LCONTROL || kc == KC_RCONTROL) mModifiers |= Ctrl; else if( kc == KC_LSHIFT || kc == KC_RSHIFT ) mModifiers |= Shift; else if( kc == KC_LMENU || kc == KC_RMENU ) mModifiers |= Alt; if( mBuffered && mListener ) return mListener->keyPressed(KeyEvent(this,kc,text)); return true;}//-------------------------------------------------------------------//bool LinuxKeyboard::_injectKeyUp( KeySym key ){ KeyCode kc = keyConversion[key]; KeyBuffer[kc] = 0; //Turn off modifier flags if( kc == KC_LCONTROL || kc == KC_RCONTROL) mModifiers &= ~Ctrl; else if( kc == KC_LSHIFT || kc == KC_RSHIFT ) mModifiers &= ~Shift; else if( kc == KC_LMENU || kc == KC_RMENU ) mModifiers &= ~Alt; if( mBuffered && mListener ) return mListener->keyReleased(KeyEvent(this, kc, 0)); return true;}//-------------------------------------------------------------------//const std::string& LinuxKeyboard::getAsString( KeyCode kc ){ mGetString = "Unknown"; char *temp = 0; XtoOIS_KeyMap::iterator i = keyConversion.begin(), e = keyConversion.end(); for( ; i != e; ++i ) { if( i->second == kc ) { temp = XKeysymToString(i->first); if( temp ) mGetString = temp; break; } } return mGetString;}//-------------------------------------------------------------------//void LinuxKeyboard::copyKeyStates( char keys[256] ) const{ memcpy( keys, KeyBuffer, 256 );} -
code/branches/network/src/ois/linux/LinuxKeyboard.h
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxMouse.cpp
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxMouse.h
- Property svn:eol-style set to native
-
code/branches/network/src/ois/linux/LinuxPrereqs.h
- Property svn:eol-style set to native
Note: See TracChangeset
for help on using the changeset viewer.