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 Templier, 14 years ago)

1 - Add support for numlocks & capslocks sticky modifiers

  • backends/events/default/default-events.cpp

     
    103103                        _keyRepeatTime = time + kKeyRepeatInitialDelay;
    104104#endif
    105105                        // 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) {
    107107                                if (g_engine && !g_engine->isPaused()) {
    108108                                        Common::Event menuEvent;
    109109                                        menuEvent.type = Common::EVENT_MAINMENU;
     
    135135                                }
    136136                        }
    137137#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)) {
    139139                                if (_vk->isDisplaying()) {
    140140                                        _vk->close(true);
    141141                                } else {
     
    149149                        }
    150150#endif
    151151#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)) {
    153153                                if (!_remap) {
    154154                                        _remap = true;
    155155                                        Common::RemapDialog _remapDialog;
  • backends/platform/sdl/events.cpp

     
    152152        }
    153153}
    154154
    155 static byte SDLModToOSystemKeyFlags(SDLMod mod) {
    156         byte b = 0;
     155static void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) {
     156
     157        event.kbd.flags = 0;
     158
    157159#ifdef LINUPY
    158160        // Yopy has no ALT key, steal the SHIFT key
    159161        // (which isn't used much anyway)
    160162        if (mod & KMOD_SHIFT)
    161                 b |= Common::KBD_ALT;
     163                event.kbd.flags |= Common::KBD_ALT;
    162164#else
    163165        if (mod & KMOD_SHIFT)
    164                 b |= Common::KBD_SHIFT;
     166                event.kbd.flags |= Common::KBD_SHIFT;
    165167        if (mod & KMOD_ALT)
    166                 b |= Common::KBD_ALT;
     168                event.kbd.flags |= Common::KBD_ALT;
    167169#endif
    168170        if (mod & KMOD_CTRL)
    169                 b |= Common::KBD_CTRL;
     171                event.kbd.flags |= Common::KBD_CTRL;
    170172
    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;
    172178}
    173179
    174180bool OSystem_SDL::pollEvent(Common::Event &event) {
     
    225231
    226232
    227233bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) {
    228         byte b = 0;
    229         b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
    230234
     235        SDLModToOSystemKeyFlags(SDL_GetModState(), event);
     236
    231237        // 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)) {
    234239                beginGFXTransaction();
    235240                        setFullscreenMode(!_videoMode.fullscreen);
    236241                endGFXTransaction();
     
    245250        }
    246251
    247252        // 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') {
    249254                char filename[20];
    250255
    251256                for (int n = 0;; n++) {
     
    265270        }
    266271
    267272        // 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') {
    269274                toggleMouseGrab();
    270275                return false;
    271276        }
     
    284289        }
    285290#else
    286291        // 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')) {
    288293                event.type = Common::EVENT_QUIT;
    289294                return true;
    290295        }
     
    296301        }
    297302
    298303        // 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)) {
    300305                if (handleScalerHotkeys(ev.key))
    301306                        return false;
    302307        }
     
    320325        event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
    321326
    322327        // 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)) {
    325330                // Swallow these key up events
    326331                return false;
    327332        }
  • common/keyboard.h

     
    4040        KEYCODE_PAUSE       = 19,
    4141        KEYCODE_ESCAPE      = 27,
    4242        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,      // '
    4949        KEYCODE_LEFTPAREN   = 40,
    5050        KEYCODE_RIGHTPAREN  = 41,
    51         KEYCODE_ASTERISK    = 42,
     51        KEYCODE_ASTERISK    = 42,      // *
    5252        KEYCODE_PLUS        = 43,
    5353        KEYCODE_COMMA       = 44,
    5454        KEYCODE_MINUS       = 45,
     
    105105        KEYCODE_y           = 121,
    106106        KEYCODE_z           = 122,
    107107        KEYCODE_DELETE      = 127,
     108        KEYCODE_TILDE       = 176,      // ~
    108109
    109110        // Numeric keypad
    110111        KEYCODE_KP0         = 256,
     
    215216enum {
    216217        KBD_CTRL  = 1 << 0,
    217218        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
    219223};
    220224
    221225/**
     
    245249        /**
    246250         * Status of the modifier keys. Bits are set in this for each
    247251         * pressed modifier
    248          * @see KBD_CTRL, KBD_ALT, KBD_SHIFT
     252         * @see KBD_CTRL, KBD_ALT, KBD_SHIFT, KBD_NUM, KBD_CAPS, KBD_SCRL
    249253         */
    250254        byte flags;
    251255
     
    266270                ascii = flags = 0;
    267271        }
    268272
     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
    269280        bool operator ==(const KeyState &x) const {
    270281                return keycode == x.keycode && ascii == x.ascii && flags == x.flags;
    271282        }