Mercurial > sdl-ios-xcode
changeset 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 | be12463f31ea |
children | 568c9b3c0167 |
files | docs/html/sdlenvvars.html src/events/SDL_keyboard.c |
diffstat | 2 files changed, 51 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/docs/html/sdlenvvars.html Mon Feb 04 17:22:56 2008 +0000 +++ b/docs/html/sdlenvvars.html Tue Feb 26 10:50:28 2008 +0000 @@ -670,6 +670,21 @@ ><P >If set, the linux fbcon driver will not use a mouse at all.</P ></DD +><DT +><TT +CLASS="LITERAL" +>SDL_NO_LOCK_KEYS</TT +></DT +><DD +><P +>Disable CAPS-LOCK and NUM-LOCK suppression 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. +</P +></DD ></DL ></DIV ></DIV
--- 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: