Commit d19e81db authored by Sam Lantinga's avatar Sam Lantinga

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
parent dec971d6
...@@ -670,6 +670,21 @@ CLASS="LITERAL" ...@@ -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 { ...@@ -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) ...@@ -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), ...@@ -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), ...@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment