Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
302 changes: 254 additions & 48 deletions code/client/cl_keys.cpp

Large diffs are not rendered by default.

15 changes: 8 additions & 7 deletions code/client/cl_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,26 +96,27 @@ Key_KeynumToStringBuf
// only ever called by binding-display code, therefore returns non-technical "friendly" names
// in any language that don't necessarily match those in the config file...
//
void Key_KeynumToStringBuf( int keynum, char *buf, int buflen )
void Key_KeynumToStringBuf( int keynum, int modifiers, char *buf, int buflen )
{
const char *psKeyName = Key_KeynumToString( keynum/*, qtrue */);

// see if there's a more friendly (or localised) name...
//
const char *psKeyNameFriendly = SE_GetString( va("KEYNAMES_KEYNAME_%s",psKeyName) );

Q_strncpyz( buf, (psKeyNameFriendly && psKeyNameFriendly[0]) ? psKeyNameFriendly : psKeyName, buflen );
Q_strncpyz( buf, Key_ModifiersStringFromModifiers(modifiers), buflen );
Q_strcat( buf, buflen, (psKeyNameFriendly && psKeyNameFriendly[0]) ? psKeyNameFriendly : psKeyName );
}

/*
====================
Key_GetBindingBuf
====================
*/
void Key_GetBindingBuf( int keynum, char *buf, int buflen ) {
void Key_GetBindingBuf( int keynum, int modifiers, char *buf, int buflen ) {
const char *value;

value = Key_GetBinding( keynum );
value = Key_GetBinding( keynum, modifiers );
if ( value ) {
Q_strncpyz( buf, value, buflen );
}
Expand Down Expand Up @@ -482,19 +483,19 @@ intptr_t CL_UISystemCalls( intptr_t *args )
return 0;

case UI_KEY_SETBINDING:
Key_SetBinding( args[1], (const char *) VMA(2) );
Key_SetBinding( args[1], args[2], (const char *) VMA(3) );
return 0;

case UI_KEY_KEYNUMTOSTRINGBUF:
Key_KeynumToStringBuf( args[1],(char *) VMA(2), args[3] );
Key_KeynumToStringBuf( args[1], args[2],(char *) VMA(3), args[4] );
return 0;

case UI_CIN_SETEXTENTS:
CIN_SetExtents(args[1], args[2], args[3], args[4], args[5]);
return 0;

case UI_KEY_GETBINDINGBUF:
Key_GetBindingBuf( args[1], (char *) VMA(2), args[3] );
Key_GetBindingBuf( args[1], args[2], (char *) VMA(3), args[4] );
return 0;


Expand Down
2 changes: 1 addition & 1 deletion code/client/client_ui.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.

#include "../ui/ui_public.h"

void _UI_KeyEvent( int key, qboolean down );
void _UI_KeyEvent( int key, int modifiers, qboolean down );
void UI_SetActiveMenu( const char* menuname,const char *menuID );
void UI_UpdateConnectionMessageString( char *string );
qboolean UI_ConsoleCommand( void ) ;
Expand Down
13 changes: 13 additions & 0 deletions code/client/keycodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -367,4 +367,17 @@ typedef enum
// distinguished by or'ing in K_CHAR_FLAG (ugly)
#define K_CHAR_FLAG 1024

// Supported modifiers
#define KEYMOD_LSHIFT (1)
#define KEYMOD_RSHIFT (1 << 1)
#define KEYMOD_LCTRL (1 << 2)
#define KEYMOD_RCTRL (1 << 3)
#define KEYMOD_LALT (1 << 4)
#define KEYMOD_RALT (1 << 5)
#define KEYMOD_LSUPER (1 << 6)
#define KEYMOD_RSUPER (1 << 7)
#define KEYMOD_NUMLOCK (1 << 8)
#define KEYMOD_CAPSLOCK (1 << 9)
#define KEYMOD_COMBINATIONS ((1 << 10)-1) // NOTE: This must be the last entry

#endif
16 changes: 11 additions & 5 deletions code/client/keys.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,17 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.

typedef struct qkey_s {
qboolean down;
int downModifiers;
int repeats; // if > 1, it is autorepeating
char *binding;
char *binding[KEYMOD_COMBINATIONS];
} qkey_t;

typedef struct keyGlobals_s {
qboolean anykeydown;
qboolean key_overstrikeMode;
int keyDownCount;
int modifiers;
int modifiersReal; // Unfiltered

qkey_t keys[MAX_KEYS];
} keyGlobals_t;
Expand All @@ -58,11 +61,14 @@ void Field_CharEvent ( field_t *edit, int ch );
void Field_Draw ( field_t *edit, int x, int y, qboolean showCursor, qboolean noColorEscape );
void Field_BigDraw ( field_t *edit, int x, int y, qboolean showCursor, qboolean noColorEscape );

void Key_SetBinding ( int keynum, const char *binding );
const char *Key_GetBinding ( int keynum );
int Key_ModifiersFromString ( const char *str );
const char *Key_SkipModifiers ( const char *str );
char * Key_ModifiersStringFromModifiers( int modifiers );
void Key_SetBinding ( int keynum, int modifiers, const char *binding );
const char *Key_GetBinding ( int keynum, int modifiers );
qboolean Key_IsDown ( int keynum );
int Key_StringToKeynum ( char *str );
int Key_StringToKeynum ( const char *str );
qboolean Key_GetOverstrikeMode ( void );
void Key_SetOverstrikeMode ( qboolean state );
void Key_ClearStates ( void );
int Key_GetKey ( const char *binding );
int Key_GetKey ( const char *binding, int modifiers );
7 changes: 5 additions & 2 deletions code/qcommon/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -911,6 +911,9 @@ int Com_EventLoop( void ) {
Cbuf_AddText( (char *)ev.evPtr );
Cbuf_AddText( "\n" );
break;
case SE_MODIFIER:
CL_ModifierEvent( ev.evValue );
break;
}

// free any block data
Expand Down Expand Up @@ -1798,10 +1801,10 @@ void Field_CompleteKeyname( void )
matchCount = 0;
shortestMatch[ 0 ] = 0;

Key_KeynameCompletion( FindMatches );
Key_Completion( FindMatches, completionString );

if( !Field_Complete( ) )
Key_KeynameCompletion( PrintKeyMatches );
Key_Completion( PrintKeyMatches, completionString );
}

/*
Expand Down
3 changes: 2 additions & 1 deletion code/qcommon/qcommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,7 @@ void CL_Shutdown( void );
void CL_Frame( int msec,float fractionMsec );
qboolean CL_GameCommand( void );
void CL_KeyEvent (int key, qboolean down, unsigned time);
void CL_ModifierEvent( int modifiers );

void CL_CharEvent( int key );
// char events are for field typing, not game control
Expand Down Expand Up @@ -759,7 +760,7 @@ void CL_FlushMemory( void );

void CL_StartHunkUsers( void );

void Key_KeynameCompletion ( callbackFunc_t callback );
void Key_Completion( void(*callback)( const char *s ), const char *input );
// for keyname autocompletion

void Key_WriteBindings( fileHandle_t f );
Expand Down
4 changes: 2 additions & 2 deletions code/ui/ui_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ extern uiInfo_t uiInfo;
void _UI_Init( qboolean inGameLoad );
void _UI_DrawRect( float x, float y, float width, float height, float size, const float *color );
void _UI_MouseEvent( int dx, int dy );
void _UI_KeyEvent( int key, qboolean down );
void _UI_KeyEvent( int key, int modifiers, qboolean down );
void UI_Report(void);

extern char GoToMenu[];
Expand All @@ -229,7 +229,7 @@ void trap_GetGlconfig( glconfig_t *glconfig );
void trap_Key_ClearStates( void );
int trap_Key_GetCatcher( void );
qboolean trap_Key_GetOverstrikeMode( void );
void trap_Key_SetBinding( int keynum, const char *binding );
void trap_Key_SetBinding( int keynum, int modifiers, const char *binding );
void trap_Key_SetCatcher( int catcher );
void trap_Key_SetOverstrikeMode( qboolean state );
void trap_R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader );
Expand Down
8 changes: 4 additions & 4 deletions code/ui/ui_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2050,8 +2050,8 @@ extern void Item_RunScript(itemDef_t *item, const char *s); //from ui_shared;
*/
}

void Key_KeynumToStringBuf( int keynum, char *buf, int buflen );
void Key_GetBindingBuf( int keynum, char *buf, int buflen );
void Key_KeynumToStringBuf( int keynum, int modifiers, char *buf, int buflen );
void Key_GetBindingBuf( int keynum, int modifiers, char *buf, int buflen );

static qboolean UI_Crosshair_HandleKey(int flags, float *special, int key)
{
Expand Down Expand Up @@ -4042,7 +4042,7 @@ void _UI_MouseEvent( int dx, int dy )
UI_KeyEvent
=================
*/
void _UI_KeyEvent( int key, qboolean down )
void _UI_KeyEvent( int key, int modifiers, qboolean down )
{
/* extern qboolean SwallowBadNumLockedKPKey( int iKey );
if (SwallowBadNumLockedKPKey(key)){
Expand All @@ -4062,7 +4062,7 @@ void _UI_KeyEvent( int key, qboolean down )
}
else
{
Menu_HandleKey(menu, key, down );
Menu_HandleKey(menu, key, modifiers, down );
}
}
else
Expand Down
6 changes: 3 additions & 3 deletions code/ui/ui_public.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,9 @@ typedef struct {
// =========== data shared with the client system =============

// keyboard and key binding interaction
void (*Key_KeynumToStringBuf)( int keynum, char *buf, int buflen );
void (*Key_GetBindingBuf)( int keynum, char *buf, int buflen );
void (*Key_SetBinding)( int keynum, const char *binding );
void (*Key_KeynumToStringBuf)( int keynum, int modifiers, char *buf, int buflen );
void (*Key_GetBindingBuf)( int keynum, int modifiers, char *buf, int buflen );
void (*Key_SetBinding)( int keynum, int modifiers, const char *binding );
qboolean (*Key_IsDown)( int keynum );
qboolean (*Key_GetOverstrikeMode)( void );
void (*Key_SetOverstrikeMode)( qboolean state );
Expand Down
Loading