From 488c3d6922b141cdf2d1a00da5b0d65886849676 Mon Sep 17 00:00:00 2001
From: johns <>
Date: Mon, 22 Jan 2001 15:52:34 +0000
Subject: [PATCH] Parameter documented, Keypad support added, Modifier macros
 changed.

---
 src/video/sdl.cpp | 122 ++++++++++++++++++++++++++++------------------
 1 file changed, 75 insertions(+), 47 deletions(-)

diff --git a/src/video/sdl.cpp b/src/video/sdl.cpp
index 16450561d..71671dd18 100644
--- a/src/video/sdl.cpp
+++ b/src/video/sdl.cpp
@@ -10,7 +10,7 @@
 //
 /**@name sdl.c		-	SDL video support. */
 //
-//	(c) Copyright 1999-2000 by Lutz Sammer
+//	(c) Copyright 1999-2001 by Lutz Sammer
 //
 //	$Id$
 
@@ -158,11 +158,11 @@ global void InitVideoSdl(void)
 	exit(1);
     }
 
-    if( SDL_MUSTLOCK(Screen) ) {
-	DebugLevel0Fn("Must locksurface!\n");
-	fflush(stdout);
-	fflush(stderr);
-    }
+    IfDebug(
+	if( SDL_MUSTLOCK(Screen) ) {
+	    DebugLevel0Fn("Must locksurface!\n");
+	}
+    );
 
     // Turn cursor off, we use our own.
     SDL_ShowCursor(0);
@@ -189,11 +189,13 @@ global void InitVideoSdl(void)
 
 	    for( i=0; j&(1<<i); ++i ) {
 	    }
+
 #ifdef USE_BEOS
 	    if( i==24 ) {	// beos compatibility hack
 		i=32;
 	    }
 #endif
+
 	    VideoDepth=i;
 	} else {
 	    VideoDepth=Screen->format->BitsPerPixel;
@@ -202,9 +204,14 @@ global void InitVideoSdl(void)
 
     // Make default character translation easier
     SDL_EnableUNICODE(1);
+
+#if 0
+    // FIXME: remove this, if it works everywhere, new freecraft didn't need
+    // FIXME: repeat, it works better without it.
     // Enable keyboard repeat (with autodetection of SDL version :)
 #ifdef SDL_DEFAULT_REPEAT_DELAY
     SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
+#endif
 #endif
 
     DebugLevel0Fn("Video init ready %d\n",VideoDepth);
@@ -212,10 +219,16 @@ global void InitVideoSdl(void)
 
 /**
 **	Invalidate some area
+**
+**	@param x	screen pixel X position.
+**	@param y	screen pixel Y position.
+**	@param w	width of rectangle in pixels.
+**	@param h	height of rectangle in pixels.
 */
 global void InvalidateArea(int x,int y,int w,int h)
 {
     // FIXME: This checks should be done at higher level
+    // FIXME: did SDL version >1.1, check this now also?
     if( x<0 ) {
 	w+=x;
 	x=0;
@@ -248,9 +261,13 @@ global void Invalidate(void)
 }
 
 /**
-**	Handle keyboard!
+**	Convert SDL keysym into internal keycode.
+**
+**	@param code	SDL keysym structure pointer.
+**
+**	@returns	ASCII code or internal keycode.
 */
-local void SdlHandleKey(const SDL_keysym* code)
+local int Sdl2InternalKeycode(const SDL_keysym* code)
 {
     int icode;
 
@@ -321,6 +338,36 @@ local void SdlHandleKey(const SDL_keysym* code)
 	case SDLK_F12:
 	    icode=KeyCodeF12;
 	    break;
+	case SDLK_KP0:
+	    icode=KeyCodeKP0;
+	    break;
+	case SDLK_KP1:
+	    icode=KeyCodeKP1;
+	    break;
+	case SDLK_KP2:
+	    icode=KeyCodeKP2;
+	    break;
+	case SDLK_KP3:
+	    icode=KeyCodeKP3;
+	    break;
+	case SDLK_KP4:
+	    icode=KeyCodeKP4;
+	    break;
+	case SDLK_KP5:
+	    icode=KeyCodeKP5;
+	    break;
+	case SDLK_KP6:
+	    icode=KeyCodeKP6;
+	    break;
+	case SDLK_KP7:
+	    icode=KeyCodeKP7;
+	    break;
+	case SDLK_KP8:
+	    icode=KeyCodeKP8;
+	    break;
+	case SDLK_KP9:
+	    icode=KeyCodeKP9;
+	    break;
 
         // We need these because if you only hit a modifier key,
         // the *ots from SDL don't report correct modifiers
@@ -348,7 +395,7 @@ local void SdlHandleKey(const SDL_keysym* code)
 	    // Use SDL 1.0.3 or higher, which works ok.
 	    if (1) {
 		if (icode >= '0' && icode <= '9') {
-		    if( code->mod&(KMOD_LCTRL|KMOD_RCTRL|KMOD_LALT|KMOD_RALT|KMOD_LMETA|KMOD_RMETA) ) {
+		    if( code->mod&(KMOD_CTRL|KMOD_ALT|KMOD_META) ) {
 			// Do not translate these to support grouping!
 			break;
 		    }
@@ -360,7 +407,7 @@ local void SdlHandleKey(const SDL_keysym* code)
 		    // let's asume latin 1 for now
 		    icode = code->unicode & 0xFF;
 		}
-	    } else if( code->mod&(KMOD_LSHIFT|KMOD_RSHIFT) ) {
+	    } else if( code->mod&(KMOD_SHIFT) ) {
 		// FIXME: only letters handled here - implement shift keymap (punctuation!)
 		if(icode <= 'z' && icode >= 'a') {
 		    icode -= 32;
@@ -369,56 +416,37 @@ local void SdlHandleKey(const SDL_keysym* code)
 	    break;
     }
 
+    return icode;
+}
+
+/**
+**	Handle keyboard!
+**
+**	@param code	SDL keysym structure pointer.
+*/
+local void SdlHandleKey(const SDL_keysym* code)
+{
+    int icode;
+
+    icode=Sdl2InternalKeycode(code);
+
     if( HandleKeyDown(icode) ) {
 	return;
     }
-    // FIXME: Should come first
+    // FIXME: Should come first, move this into low level!!!!
     DoButtonPanelKey(icode);
 }
 
 /**
 **	Handle keyboard!
+**
+**	@param code	SDL keysym structure pointer.
 */
 local void SdlHandleKeyUp(const SDL_keysym* code)
 {
     int icode;
 
-    switch( (icode=code->sym) ) {
-        // We need these because if you only hit a modifier key,
-        // the *ots from SDL don't report correct modifiers
-	case SDLK_LSHIFT:
-	case SDLK_RSHIFT:
-	    icode = KeyCodeShift;
-	    break;
-	case SDLK_LCTRL:
-	case SDLK_RCTRL:
-	    icode=KeyCodeControl;
-	    break;
-	case SDLK_LALT:
-	case SDLK_RALT:
-	case SDLK_LMETA:
-	case SDLK_RMETA:
-	    icode=KeyCodeAlt;
-	    break;
-	case SDLK_LSUPER:
-	case SDLK_RSUPER:
-	    icode=KeyCodeSuper;
-	    break;
-        case SDLK_UP:
-	    icode=KeyCodeUp;
-	    break;
-        case SDLK_DOWN:
-	    icode=KeyCodeDown;
-	    break;
-        case SDLK_LEFT:
-	    icode=KeyCodeLeft;
-	    break;
-        case SDLK_RIGHT:
-	    icode=KeyCodeRight;
-	    break;
-	default:
-	    break;
-    }
+    icode=Sdl2InternalKeycode(code);
 
     HandleKeyUp(icode);
 }