Date: Tue, 05 Feb 2008 01:41:08 -0500 SDL-1.2
authorSam Lantinga <slouken@libsdl.org>
Tue, 26 Feb 2008 10:50:28 +0000
branchSDL-1.2
changeset 4138 b1fd24d62e55
parent 4137 be12463f31ea
child 4139 568c9b3c0167
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
docs/html/sdlenvvars.html
src/events/SDL_keyboard.c
--- 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: