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 --HG-- branch : SDL-1.2 extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/branches/SDL-1.2%402732
This commit is contained in:
parent
dec971d685
commit
d19e81db37
2 changed files with 51 additions and 0 deletions
|
@ -670,6 +670,21 @@ CLASS="LITERAL"
|
|||
><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
|
||||
|
|
|
@ -48,9 +48,16 @@ struct {
|
|||
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 @@ int SDL_KeyboardInit(void)
|
|||
|
||||
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 @@ printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym),
|
|||
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 @@ printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym),
|
|||
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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue