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
|
><P
|
||||||
>If set, the linux fbcon driver will not use a mouse at all.</P
|
>If set, the linux fbcon driver will not use a mouse at all.</P
|
||||||
></DD
|
></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
|
></DL
|
||||||
></DIV
|
></DIV
|
||||||
></DIV
|
></DIV
|
||||||
|
|
|
@ -48,9 +48,16 @@ struct {
|
||||||
SDL_Event evt; /* the event we are supposed to repeat */
|
SDL_Event evt; /* the event we are supposed to repeat */
|
||||||
} SDL_KeyRepeat;
|
} SDL_KeyRepeat;
|
||||||
|
|
||||||
|
/* Global no-lock-keys support */
|
||||||
|
static Uint8 SDL_NoLockKeys;
|
||||||
|
|
||||||
|
#define SDL_NLK_CAPS 0x01
|
||||||
|
#define SDL_NLK_NUM 0x02
|
||||||
|
|
||||||
/* Public functions */
|
/* Public functions */
|
||||||
int SDL_KeyboardInit(void)
|
int SDL_KeyboardInit(void)
|
||||||
{
|
{
|
||||||
|
const char* env;
|
||||||
SDL_VideoDevice *video = current_video;
|
SDL_VideoDevice *video = current_video;
|
||||||
SDL_VideoDevice *this = current_video;
|
SDL_VideoDevice *this = current_video;
|
||||||
|
|
||||||
|
@ -65,6 +72,25 @@ int SDL_KeyboardInit(void)
|
||||||
|
|
||||||
SDL_EnableKeyRepeat(0, 0);
|
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 */
|
/* Fill in the blanks in keynames */
|
||||||
keynames[SDLK_BACKSPACE] = "backspace";
|
keynames[SDLK_BACKSPACE] = "backspace";
|
||||||
keynames[SDLK_TAB] = "tab";
|
keynames[SDLK_TAB] = "tab";
|
||||||
|
@ -394,12 +420,16 @@ printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym),
|
||||||
break;
|
break;
|
||||||
case SDLK_NUMLOCK:
|
case SDLK_NUMLOCK:
|
||||||
modstate ^= KMOD_NUM;
|
modstate ^= KMOD_NUM;
|
||||||
|
if ( SDL_NoLockKeys & SDL_NLK_NUM )
|
||||||
|
break;
|
||||||
if ( ! (modstate&KMOD_NUM) )
|
if ( ! (modstate&KMOD_NUM) )
|
||||||
state = SDL_RELEASED;
|
state = SDL_RELEASED;
|
||||||
keysym->mod = (SDLMod)modstate;
|
keysym->mod = (SDLMod)modstate;
|
||||||
break;
|
break;
|
||||||
case SDLK_CAPSLOCK:
|
case SDLK_CAPSLOCK:
|
||||||
modstate ^= KMOD_CAPS;
|
modstate ^= KMOD_CAPS;
|
||||||
|
if ( SDL_NoLockKeys & SDL_NLK_CAPS )
|
||||||
|
break;
|
||||||
if ( ! (modstate&KMOD_CAPS) )
|
if ( ! (modstate&KMOD_CAPS) )
|
||||||
state = SDL_RELEASED;
|
state = SDL_RELEASED;
|
||||||
keysym->mod = (SDLMod)modstate;
|
keysym->mod = (SDLMod)modstate;
|
||||||
|
@ -440,7 +470,13 @@ printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym),
|
||||||
case SDLK_UNKNOWN:
|
case SDLK_UNKNOWN:
|
||||||
break;
|
break;
|
||||||
case SDLK_NUMLOCK:
|
case SDLK_NUMLOCK:
|
||||||
|
if ( SDL_NoLockKeys & SDL_NLK_NUM )
|
||||||
|
break;
|
||||||
|
/* Only send keydown events */
|
||||||
|
return(0);
|
||||||
case SDLK_CAPSLOCK:
|
case SDLK_CAPSLOCK:
|
||||||
|
if ( SDL_NoLockKeys & SDL_NLK_CAPS )
|
||||||
|
break;
|
||||||
/* Only send keydown events */
|
/* Only send keydown events */
|
||||||
return(0);
|
return(0);
|
||||||
case SDLK_LCTRL:
|
case SDLK_LCTRL:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue