Ticket #4759: 1 - osystem_add_support_for_sticky_key_modifiers.patch
File 1 - osystem_add_support_for_sticky_key_modifiers.patch, 6.4 KB (added by , 15 years ago) |
---|
-
backends/events/default/default-events.cpp
103 103 _keyRepeatTime = time + kKeyRepeatInitialDelay; 104 104 #endif 105 105 // Global Main Menu 106 if (event.kbd. flags == Common::KBD_CTRL&& event.kbd.keycode == Common::KEYCODE_F5) {106 if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_F5) { 107 107 if (g_engine && !g_engine->isPaused()) { 108 108 Common::Event menuEvent; 109 109 menuEvent.type = Common::EVENT_MAINMENU; … … 135 135 } 136 136 } 137 137 #ifdef ENABLE_VKEYBD 138 else if (event.kbd.keycode == Common::KEYCODE_F7 && event.kbd. flags == 0) {138 else if (event.kbd.keycode == Common::KEYCODE_F7 && event.kbd.hasFlags(0)) { 139 139 if (_vk->isDisplaying()) { 140 140 _vk->close(true); 141 141 } else { … … 149 149 } 150 150 #endif 151 151 #ifdef ENABLE_KEYMAPPER 152 else if (event.kbd.keycode == Common::KEYCODE_F8 && event.kbd. flags == 0) {152 else if (event.kbd.keycode == Common::KEYCODE_F8 && event.kbd.hasFlags(0)) { 153 153 if (!_remap) { 154 154 _remap = true; 155 155 Common::RemapDialog _remapDialog; -
backends/platform/sdl/events.cpp
152 152 } 153 153 } 154 154 155 static byte SDLModToOSystemKeyFlags(SDLMod mod) { 156 byte b = 0; 155 static void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { 156 157 event.kbd.flags = 0; 158 157 159 #ifdef LINUPY 158 160 // Yopy has no ALT key, steal the SHIFT key 159 161 // (which isn't used much anyway) 160 162 if (mod & KMOD_SHIFT) 161 b|= Common::KBD_ALT;163 event.kbd.flags |= Common::KBD_ALT; 162 164 #else 163 165 if (mod & KMOD_SHIFT) 164 b|= Common::KBD_SHIFT;166 event.kbd.flags |= Common::KBD_SHIFT; 165 167 if (mod & KMOD_ALT) 166 b|= Common::KBD_ALT;168 event.kbd.flags |= Common::KBD_ALT; 167 169 #endif 168 170 if (mod & KMOD_CTRL) 169 b|= Common::KBD_CTRL;171 event.kbd.flags |= Common::KBD_CTRL; 170 172 171 return b; 173 // Sticky flags 174 if (mod & KMOD_NUM) 175 event.kbd.flags |= Common::KBD_NUM; 176 if (mod & KMOD_CAPS) 177 event.kbd.flags |= Common::KBD_CAPS; 172 178 } 173 179 174 180 bool OSystem_SDL::pollEvent(Common::Event &event) { … … 225 231 226 232 227 233 bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) { 228 byte b = 0;229 b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());230 234 235 SDLModToOSystemKeyFlags(SDL_GetModState(), event); 236 231 237 // Alt-Return and Alt-Enter toggle full screen mode 232 if (b == Common::KBD_ALT && (ev.key.keysym.sym == SDLK_RETURN 233 || ev.key.keysym.sym == SDLK_KP_ENTER)) { 238 if (event.kbd.hasFlags(Common::KBD_ALT) && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER)) { 234 239 beginGFXTransaction(); 235 240 setFullscreenMode(!_videoMode.fullscreen); 236 241 endGFXTransaction(); … … 245 250 } 246 251 247 252 // Alt-S: Create a screenshot 248 if ( b == Common::KBD_ALT&& ev.key.keysym.sym == 's') {253 if (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 's') { 249 254 char filename[20]; 250 255 251 256 for (int n = 0;; n++) { … … 265 270 } 266 271 267 272 // Ctrl-m toggles mouse capture 268 if ( b == Common::KBD_CTRL&& ev.key.keysym.sym == 'm') {273 if (event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'm') { 269 274 toggleMouseGrab(); 270 275 return false; 271 276 } … … 284 289 } 285 290 #else 286 291 // Ctrl-z and Alt-X quit 287 if (( b == Common::KBD_CTRL && ev.key.keysym.sym == 'z') || (b == Common::KBD_ALT&& ev.key.keysym.sym == 'x')) {292 if ((event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'z') || (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 'x')) { 288 293 event.type = Common::EVENT_QUIT; 289 294 return true; 290 295 } … … 296 301 } 297 302 298 303 // Ctrl-Alt-<key> will change the GFX mode 299 if (( b& (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {304 if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { 300 305 if (handleScalerHotkeys(ev.key)) 301 306 return false; 302 307 } … … 320 325 event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); 321 326 322 327 // Ctrl-Alt-<key> will change the GFX mode 323 byte b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());324 if (( b& (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {328 SDLModToOSystemKeyFlags(SDL_GetModState(), event); 329 if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { 325 330 // Swallow these key up events 326 331 return false; 327 332 } -
common/keyboard.h
40 40 KEYCODE_PAUSE = 19, 41 41 KEYCODE_ESCAPE = 27, 42 42 KEYCODE_SPACE = 32, 43 KEYCODE_EXCLAIM = 33, 44 KEYCODE_QUOTEDBL = 34, 45 KEYCODE_HASH = 35, 46 KEYCODE_DOLLAR = 36, 47 KEYCODE_AMPERSAND = 38, 48 KEYCODE_QUOTE = 39, 43 KEYCODE_EXCLAIM = 33, // ! 44 KEYCODE_QUOTEDBL = 34, // " 45 KEYCODE_HASH = 35, // # 46 KEYCODE_DOLLAR = 36, // $ 47 KEYCODE_AMPERSAND = 38, // & 48 KEYCODE_QUOTE = 39, // ' 49 49 KEYCODE_LEFTPAREN = 40, 50 50 KEYCODE_RIGHTPAREN = 41, 51 KEYCODE_ASTERISK = 42, 51 KEYCODE_ASTERISK = 42, // * 52 52 KEYCODE_PLUS = 43, 53 53 KEYCODE_COMMA = 44, 54 54 KEYCODE_MINUS = 45, … … 105 105 KEYCODE_y = 121, 106 106 KEYCODE_z = 122, 107 107 KEYCODE_DELETE = 127, 108 KEYCODE_TILDE = 176, // ~ 108 109 109 110 // Numeric keypad 110 111 KEYCODE_KP0 = 256, … … 215 216 enum { 216 217 KBD_CTRL = 1 << 0, 217 218 KBD_ALT = 1 << 1, 218 KBD_SHIFT = 1 << 2 219 KBD_SHIFT = 1 << 2, 220 KBD_NUM = 1 << 3, 221 KBD_CAPS = 1 << 4, 222 KBD_SCRL = 1 << 5 219 223 }; 220 224 221 225 /** … … 245 249 /** 246 250 * Status of the modifier keys. Bits are set in this for each 247 251 * pressed modifier 248 * @see KBD_CTRL, KBD_ALT, KBD_SHIFT 252 * @see KBD_CTRL, KBD_ALT, KBD_SHIFT, KBD_NUM, KBD_CAPS, KBD_SCRL 249 253 */ 250 254 byte flags; 251 255 … … 266 270 ascii = flags = 0; 267 271 } 268 272 273 /** 274 * Check for flags, ignoring the sticky flags (KBD_NUM, KBD_CAPS, KBD_SCRL) 275 */ 276 bool hasFlags(byte f) { 277 return f == (flags & ~(KBD_NUM|KBD_CAPS|KBD_SCRL)); 278 } 279 269 280 bool operator ==(const KeyState &x) const { 270 281 return keycode == x.keycode && ascii == x.ascii && flags == x.flags; 271 282 }