Mercurial > sdl-ios-xcode
diff src/events/SDL_keyboard.c @ 4138:b1fd24d62e55 SDL-1.2
Date: Tue, 05 Feb 2008 01:41:08 -0500
From: Mike Miscevic
Subject: SDL and capslock/numlock
Find attached a patch against SDL-1.2.13 for check of SDL_NO_LOCK_KEYS
environment variable. This differs slightly from other patches I've seen
in that it has 3 modes:
Disable CAPS-LOCK and NUM-LOCK supression of down+up key events,
suitable for games where the player needs these keys to do more than
just toggle. A value of 1 will effect both CAPS-LOCK and NUM-LOCK. A
value of 2 will effect only CAPS-LOCK. A value of 3 will effect only
NUM-LOCK. All other values have no effect.
This works for me and has been tested on:
- Fedora 8 64-bit
- SRCRPM SDL-1.2.13-1.fc8.src.rpm
- Emeny Territory Quake Wars (ETQW), native 32-bit commercial game
--Mike Miscevic
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 26 Feb 2008 10:50:28 +0000 |
parents | a9be6a3a51d1 |
children | a1b03ba2fcd0 |
line wrap: on
line diff
--- a/src/events/SDL_keyboard.c Mon Feb 04 17:22:56 2008 +0000 +++ b/src/events/SDL_keyboard.c Tue Feb 26 10:50:28 2008 +0000 @@ -48,9 +48,16 @@ SDL_Event evt; /* the event we are supposed to repeat */ } SDL_KeyRepeat; +/* Global no-lock-keys support */ +static Uint8 SDL_NoLockKeys; + +#define SDL_NLK_CAPS 0x01 +#define SDL_NLK_NUM 0x02 + /* Public functions */ int SDL_KeyboardInit(void) { + const char* env; SDL_VideoDevice *video = current_video; SDL_VideoDevice *this = current_video; @@ -65,6 +72,25 @@ SDL_EnableKeyRepeat(0, 0); + /* Allow environment override to disable special lock-key behavior */ + env = getenv("SDL_NO_LOCK_KEYS"); + SDL_NoLockKeys = 0; + if (env) { + switch (SDL_atoi(env)) { + case 1: + SDL_NoLockKeys = SDL_NLK_CAPS | SDL_NLK_NUM; + break; + case 2: + SDL_NoLockKeys = SDL_NLK_CAPS; + break; + case 3: + SDL_NoLockKeys = SDL_NLK_NUM; + break; + default: + break; + } + } + /* Fill in the blanks in keynames */ keynames[SDLK_BACKSPACE] = "backspace"; keynames[SDLK_TAB] = "tab"; @@ -394,12 +420,16 @@ break; case SDLK_NUMLOCK: modstate ^= KMOD_NUM; + if ( SDL_NoLockKeys & SDL_NLK_NUM ) + break; if ( ! (modstate&KMOD_NUM) ) state = SDL_RELEASED; keysym->mod = (SDLMod)modstate; break; case SDLK_CAPSLOCK: modstate ^= KMOD_CAPS; + if ( SDL_NoLockKeys & SDL_NLK_CAPS ) + break; if ( ! (modstate&KMOD_CAPS) ) state = SDL_RELEASED; keysym->mod = (SDLMod)modstate; @@ -440,7 +470,13 @@ case SDLK_UNKNOWN: break; case SDLK_NUMLOCK: + if ( SDL_NoLockKeys & SDL_NLK_NUM ) + break; + /* Only send keydown events */ + return(0); case SDLK_CAPSLOCK: + if ( SDL_NoLockKeys & SDL_NLK_CAPS ) + break; /* Only send keydown events */ return(0); case SDLK_LCTRL: