r1470 - in trunk: . code/client code/qcommon code/sdl
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Sep 5 19:38:36 EDT 2008
Author: tma
Date: 2008-09-05 19:38:35 -0400 (Fri, 05 Sep 2008)
New Revision: 1470
Modified:
trunk/README
trunk/code/client/cl_keys.c
trunk/code/client/cl_main.c
trunk/code/qcommon/q_shared.c
trunk/code/qcommon/q_shared.h
trunk/code/sdl/sdl_input.c
Log:
* Add Com_HexStrToInt
* Fixed some whacky indentation in q_shared.c
* Allow single character keys e.g. 'c' to be used in cl_consoleKeys in addition
to ASCII characters
* Experimental code to ignore dead keys
Modified: trunk/README
===================================================================
--- trunk/README 2008-09-01 21:22:41 UTC (rev 1469)
+++ trunk/README 2008-09-05 23:38:35 UTC (rev 1470)
@@ -399,15 +399,14 @@
If you use such a keyboard layout, you can set the cvar cl_consoleKeys. This
is a space delimited list of key names that will toggle the console. The key
- names are the usual Q3 names e.g. "BACKSPACE", "PAUSE", "WINDOWS" etc. It's
- also possible to use ASCII characters, either by hexadecimal number e.g.
- "0x7e" (equivalent to ~) or directly by character. Some example values for
- cl_consoleKeys:
+ names are the usual Q3 names e.g. "~", "`", "c", "BACKSPACE", "PAUSE",
+ "WINDOWS" etc. It's also possible to use ASCII characters, by hexadecimal
+ number. Some example values for cl_consoleKeys:
- "0x7e 0x60" Toggle on ~ or ` (the default)
+ "~ ` 0x7e 0x60" Toggle on ~ or ` (the default)
"WINDOWS" Toggle on the Windows key
- "c" Toggle on the c character
- "C" Toggle on the C character (Shift-c)
+ "c" Toggle on the c key
+ "0x43" Toggle on the C character (Shift-c)
"PAUSE F1 PGUP" Toggle on the Pause, F1 or Page Up keys
Note that when you elect a set of console keys or characters, they cannot
Modified: trunk/code/client/cl_keys.c
===================================================================
--- trunk/code/client/cl_keys.c 2008-09-01 21:22:41 UTC (rev 1469)
+++ trunk/code/client/cl_keys.c 2008-09-05 23:38:35 UTC (rev 1470)
@@ -776,7 +776,6 @@
return keys[keynum].down;
}
-
/*
===================
Key_StringToKeynum
@@ -801,28 +800,12 @@
}
// check for hex code
- if ( str[0] == '0' && str[1] == 'x' && strlen( str ) == 4) {
- int n1, n2;
-
- n1 = str[2];
- if ( n1 >= '0' && n1 <= '9' ) {
- n1 -= '0';
- } else if ( n1 >= 'a' && n1 <= 'f' ) {
- n1 = n1 - 'a' + 10;
- } else {
- n1 = 0;
- }
+ if ( strlen( str ) == 4 ) {
+ int n = Com_HexStrToInt( str );
- n2 = str[3];
- if ( n2 >= '0' && n2 <= '9' ) {
- n2 -= '0';
- } else if ( n2 >= 'a' && n2 <= 'f' ) {
- n2 = n2 - 'a' + 10;
- } else {
- n2 = 0;
+ if ( n >= 0 ) {
+ return n;
}
-
- return n1 * 16 + n2;
}
// scan for a text match
Modified: trunk/code/client/cl_main.c
===================================================================
--- trunk/code/client/cl_main.c 2008-09-01 21:22:41 UTC (rev 1469)
+++ trunk/code/client/cl_main.c 2008-09-05 23:38:35 UTC (rev 1470)
@@ -3079,8 +3079,8 @@
cl_guidServerUniq = Cvar_Get ("cl_guidServerUniq", "1", CVAR_ARCHIVE);
- // 0x7e = ~ and 0x60 = `
- cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "0x7e 0x60", CVAR_ARCHIVE);
+ // ~ and `, as keys and characters
+ cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE);
// userinfo
Cvar_Get ("name", "UnnamedPlayer", CVAR_USERINFO | CVAR_ARCHIVE );
Modified: trunk/code/qcommon/q_shared.c
===================================================================
--- trunk/code/qcommon/q_shared.c 2008-09-01 21:22:41 UTC (rev 1469)
+++ trunk/code/qcommon/q_shared.c 2008-09-05 23:38:35 UTC (rev 1470)
@@ -361,48 +361,48 @@
in++;
if ( *in )
in += 2;
- // record when we hit a newline
- } else if ( c == '\n' || c == '\r' ) {
- newline = qtrue;
- in++;
- // record when we hit whitespace
- } else if ( c == ' ' || c == '\t') {
- whitespace = qtrue;
- in++;
- // an actual token
+ // record when we hit a newline
+ } else if ( c == '\n' || c == '\r' ) {
+ newline = qtrue;
+ in++;
+ // record when we hit whitespace
+ } else if ( c == ' ' || c == '\t') {
+ whitespace = qtrue;
+ in++;
+ // an actual token
} else {
- // if we have a pending newline, emit it (and it counts as whitespace)
- if (newline) {
- *out++ = '\n';
- newline = qfalse;
- whitespace = qfalse;
- } if (whitespace) {
- *out++ = ' ';
- whitespace = qfalse;
- }
-
- // copy quoted strings unmolested
- if (c == '"') {
- *out++ = c;
- in++;
- while (1) {
- c = *in;
- if (c && c != '"') {
- *out++ = c;
- in++;
- } else {
- break;
- }
- }
- if (c == '"') {
- *out++ = c;
- in++;
- }
- } else {
- *out = c;
- out++;
- in++;
- }
+ // if we have a pending newline, emit it (and it counts as whitespace)
+ if (newline) {
+ *out++ = '\n';
+ newline = qfalse;
+ whitespace = qfalse;
+ } if (whitespace) {
+ *out++ = ' ';
+ whitespace = qfalse;
+ }
+
+ // copy quoted strings unmolested
+ if (c == '"') {
+ *out++ = c;
+ in++;
+ while (1) {
+ c = *in;
+ if (c && c != '"') {
+ *out++ = c;
+ in++;
+ } else {
+ break;
+ }
+ }
+ if (c == '"') {
+ *out++ = c;
+ in++;
+ }
+ } else {
+ *out = c;
+ out++;
+ in++;
+ }
}
}
}
@@ -512,63 +512,7 @@
return com_token;
}
-
-#if 0
-// no longer used
/*
-===============
-COM_ParseInfos
-===============
-*/
-int COM_ParseInfos( char *buf, int max, char infos[][MAX_INFO_STRING] ) {
- char *token;
- int count;
- char key[MAX_TOKEN_CHARS];
-
- count = 0;
-
- while ( 1 ) {
- token = COM_Parse( &buf );
- if ( !token[0] ) {
- break;
- }
- if ( strcmp( token, "{" ) ) {
- Com_Printf( "Missing { in info file\n" );
- break;
- }
-
- if ( count == max ) {
- Com_Printf( "Max infos exceeded\n" );
- break;
- }
-
- infos[count][0] = 0;
- while ( 1 ) {
- token = COM_ParseExt( &buf, qtrue );
- if ( !token[0] ) {
- Com_Printf( "Unexpected end of info file\n" );
- break;
- }
- if ( !strcmp( token, "}" ) ) {
- break;
- }
- Q_strncpyz( key, token, sizeof( key ) );
-
- token = COM_ParseExt( &buf, qfalse );
- if ( !token[0] ) {
- strcpy( token, "<NULL>" );
- }
- Info_SetValueForKey( infos[count], key, token );
- }
- count++;
- }
-
- return count;
-}
-#endif
-
-
-/*
==================
COM_MatchToken
==================
@@ -669,7 +613,45 @@
COM_MatchToken( buf_p, ")" );
}
+/*
+===================
+Com_HexStrToInt
+===================
+*/
+int Com_HexStrToInt( const char *str )
+{
+ if ( !str || !str[ 0 ] )
+ return -1;
+ // check for hex code
+ if( str[ 0 ] == '0' && str[ 1 ] == 'x' )
+ {
+ int i, n = 0;
+
+ for( i = 2; i < strlen( str ); i++ )
+ {
+ char digit;
+
+ n *= 16;
+
+ digit = tolower( str[ i ] );
+
+ if( digit >= '0' && digit <= '9' )
+ digit -= '0';
+ else if( digit >= 'a' && digit <= 'f' )
+ digit = digit - 'a' + 10;
+ else
+ return -1;
+
+ n += digit;
+ }
+
+ return n;
+ }
+
+ return -1;
+}
+
/*
============================================================================
Modified: trunk/code/qcommon/q_shared.h
===================================================================
--- trunk/code/qcommon/q_shared.h 2008-09-01 21:22:41 UTC (rev 1469)
+++ trunk/code/qcommon/q_shared.h 2008-09-05 23:38:35 UTC (rev 1470)
@@ -652,6 +652,7 @@
void Parse1DMatrix (char **buf_p, int x, float *m);
void Parse2DMatrix (char **buf_p, int y, int x, float *m);
void Parse3DMatrix (char **buf_p, int z, int y, int x, float *m);
+int Com_HexStrToInt( const char *str );
void QDECL Com_sprintf (char *dest, int size, const char *fmt, ...) __attribute__ ((format (printf, 3, 4)));
Modified: trunk/code/sdl/sdl_input.c
===================================================================
--- trunk/code/sdl/sdl_input.c 2008-09-01 21:22:41 UTC (rev 1469)
+++ trunk/code/sdl/sdl_input.c 2008-09-05 23:38:35 UTC (rev 1470)
@@ -84,7 +84,7 @@
else
Com_Printf( " " );
- Com_Printf( "0x%hx \"%s\"", keysym->scancode,
+ Com_Printf( "0x%02x \"%s\"", keysym->scancode,
SDL_GetKeyName( keysym->sym ) );
if( keysym->mod & KMOD_LSHIFT ) Com_Printf( " KMOD_LSHIFT" );
@@ -100,11 +100,11 @@
if( keysym->mod & KMOD_MODE ) Com_Printf( " KMOD_MODE" );
if( keysym->mod & KMOD_RESERVED ) Com_Printf( " KMOD_RESERVED" );
- Com_Printf( " Q:%d(%s)", key, Key_KeynumToString( key ) );
+ Com_Printf( " Q:0x%02x(%s)", key, Key_KeynumToString( key ) );
if( keysym->unicode )
{
- Com_Printf( " U:%d", keysym->unicode );
+ Com_Printf( " U:0x%02x", keysym->unicode );
if( keysym->unicode > ' ' && keysym->unicode < '~' )
Com_Printf( "(%c)", (char)keysym->unicode );
@@ -120,7 +120,7 @@
IN_IsConsoleKey
===============
*/
-static qboolean IN_IsConsoleKey( keyNum_t key, const char character )
+static qboolean IN_IsConsoleKey( keyNum_t key, const unsigned char character )
{
typedef struct consoleKey_s
{
@@ -133,7 +133,7 @@
union
{
keyNum_t key;
- char character;
+ unsigned char character;
} u;
} consoleKey_t;
@@ -153,34 +153,36 @@
while( numConsoleKeys < MAX_CONSOLE_KEYS )
{
consoleKey_t *c = &consoleKeys[ numConsoleKeys ];
- char *keyName;
+ int charCode = 0;
token = COM_Parse( &text_p );
if( !token[ 0 ] )
break;
- c->u.key = Key_StringToKeynum( token );
+ if( strlen( token ) == 4 )
+ charCode = Com_HexStrToInt( token );
- // 0 isn't a key
- if( c->u.key == 0 )
- continue;
-
- keyName = Key_KeynumToString( c->u.key );
-
- if( strlen( keyName ) == 1 )
+ if( charCode > 0 )
{
c->type = CHARACTER;
- c->u.character = *keyName;
+ c->u.character = (unsigned char)charCode;
}
else
+ {
c->type = KEY;
+ c->u.key = Key_StringToKeynum( token );
+ // 0 isn't a key
+ if( c->u.key <= 0 )
+ continue;
+ }
+
numConsoleKeys++;
}
}
- // Use the character in preference to the key name
- if( character != '\0' )
+ // If the character is the same as the key, prefer the character
+ if( key == character )
key = 0;
for( i = 0; i < numConsoleKeys; i++ )
@@ -212,7 +214,7 @@
static const char *IN_TranslateSDLToQ3Key( SDL_keysym *keysym,
keyNum_t *key, qboolean down )
{
- static char buf[ 2 ] = { '\0', '\0' };
+ static unsigned char buf[ 2 ] = { '\0', '\0' };
*buf = '\0';
*key = 0;
@@ -311,9 +313,9 @@
}
}
- if( down && keysym->unicode && !( keysym->unicode & 0xFF80 ) )
+ if( down && keysym->unicode && !( keysym->unicode & 0xFF00 ) )
{
- char ch = (char)keysym->unicode & 0x7F;
+ unsigned char ch = (unsigned char)keysym->unicode & 0xFF;
switch( ch )
{
@@ -333,6 +335,17 @@
if( in_keyboardDebug->integer )
IN_PrintKey( keysym, *key, down );
+ // Keys that have ASCII names but produce no character are probably
+ // dead keys -- ignore them
+ if( down && strlen( Key_KeynumToString( *key ) ) == 1 &&
+ keysym->unicode == 0 )
+ {
+ if( in_keyboardDebug->integer )
+ Com_Printf( " Ignored dead key '%c'\n", *key );
+
+ *key = 0;
+ }
+
if( IN_IsConsoleKey( *key, *buf ) )
{
// Console keys can't be bound or generate characters
@@ -340,7 +353,11 @@
*buf = '\0';
}
- return buf;
+ // Don't allow extended ASCII to generate characters
+ if( *buf & 0x80 )
+ *buf = '\0';
+
+ return (char *)buf;
}
#ifdef MACOS_X_ACCELERATION_HACK
@@ -817,7 +834,7 @@
static void IN_ProcessEvents( void )
{
SDL_Event e;
- const char *p = NULL;
+ const char *character = NULL;
keyNum_t key = 0;
if( !SDL_WasInit( SDL_INIT_VIDEO ) )
@@ -840,20 +857,19 @@
switch( e.type )
{
case SDL_KEYDOWN:
- p = IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qtrue );
+ character = IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qtrue );
if( key )
Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL );
- if( p )
- {
- while( *p )
- Com_QueueEvent( 0, SE_CHAR, *p++, 0, 0, NULL );
- }
+ if( character )
+ Com_QueueEvent( 0, SE_CHAR, *character, 0, 0, NULL );
break;
case SDL_KEYUP:
IN_TranslateSDLToQ3Key( &e.key.keysym, &key, qfalse );
- Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL );
+
+ if( key )
+ Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL );
break;
case SDL_MOUSEMOTION:
More information about the quake3-commits
mailing list