Skip to content
Permalink
Browse files

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
  • Loading branch information
slouken committed Feb 26, 2008
1 parent 89d4105 commit c719fda49e8c8eb496a9f46a48297f09a43a560b
Showing with 51 additions and 0 deletions.
  1. +15 −0 docs/html/sdlenvvars.html
  2. +36 −0 src/events/SDL_keyboard.c
@@ -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
@@ -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:

0 comments on commit c719fda

Please sign in to comment.