etqw-sdk/source/framework/KeyInput.h

201 lines
6.2 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#ifndef __KEYINPUT_H__
#define __KEYINPUT_H__
#include "UsercmdGen.h"
#include "../decllib/declLocStr.h"
/*
===============================================================================
Key Input
===============================================================================
*/
class sdKeyCommand {
public:
sdKeyCommand( void );
void Set( const char* _binding );
int GetAction( void ) const { return action; }
const char* GetBinding( void ) const { return binding.c_str(); }
usercmdbuttonType_t GetType( void ) const { return type; }
void FixupBind( void );
private:
idStr binding;
int action;
usercmdbuttonType_t type;
};
class sdKeyBind {
public:
static const int MAX_MODIFIERS = 8;
typedef sdPair< int, sdKeyCommand > pair_t;
void ClearCommand( int modifier );
void SetCommand( int modifier, const char* command );
sdKeyCommand& GetCommand( void );
sdKeyCommand& GetCommand( int modifier );
void Write( idFile* f, const char* context, const char* keyName );
void UnBindBinding( const char* binding );
void SetupBinds( void );
private:
sdKeyCommand defaultCommand;
idStaticList< pair_t, MAX_MODIFIERS > modifierCommands;
};
class sdBindContext {
public:
typedef sdPair< int, sdKeyBind* > pair_t;
sdBindContext( const char* _name ) { name = _name; }
~sdBindContext( void ) { UnBindAll(); }
sdKeyBind* AllocBind( int key );
sdKeyBind* GetBind( int key );
const char* GetName( void ) const { return name.c_str(); }
sdKeyCommand* GetCommand( int key );
void WriteBindings( idFile* f );
void Bind( int key, int modifierKey, const char* binding );
void UnBind( int key, int modifierKey );
void UnBindAll( void );
void UnBindBinding( const char* binding );
void SetupBinds( void );
private:
idList< pair_t > keys;
idHashIndex keyHash;
idStr name;
};
class idKey {
public:
idKey( int _id, const char* _name, const char* _locName, const wchar_t* _fixedText ) : down( false ), id( _id ), activeCommand( NULL ) {
name = _name;
if ( _locName != NULL ) {
locName = _locName;
}
if ( _fixedText != NULL ) {
fixedText = _fixedText;
}
}
void SetDown( bool _down );
bool IsDown( void ) const { return down; }
int GetId( void ) const { return id; }
void GetLocalizedText( idWStr& text ) {
if ( locName.Length() > 0 ) {
text = common->LocalizeText( locName.c_str() );
return;
}
text = fixedText;
}
void SetActiveCommand( sdKeyCommand* cmd ) { activeCommand = cmd; }
sdKeyCommand* GetActiveCommand( void ) const { return activeCommand; }
const char* GetName( void ) const { return name.c_str(); }
protected:
bool down;
int id;
idStr name;
idStr locName;
idWStr fixedText;
sdKeyCommand* activeCommand;
};
class sdController;
class idKeyInput {
public:
static void Init( void );
static void Shutdown( void );
static int GetContextIndex( const char* name );
static sdBindContext* GetContext( const char* name );
static sdBindContext* AllocContext( const char* name );
static void ArgCompletion_KeyName( const idCmdArgs &args, void( *callback )( const char *s ) );
static bool IsDown( keyNum_e keyNum );
static bool GetOverstrikeMode( void );
static void SetOverstrikeMode( bool state );
static void ClearStates( void );
static void SetBinding( idKey& key, const char* binding, idKey* modifier, sdBindContext* context, bool doPrint );
static const char* GetBinding( sdBindContext* context, idKey& key, idKey* modifier );
static void KeysFromBinding( sdBindContext* context, const char* bind, bool useBindStrWhenEmpty, idWStr& keyName );
static void KeysFromBinding( sdBindContext* context, const char* binding, int& numKeys, idKey** keys );
static void UnbindKey( sdBindContext* context, idKey& key, idKey* modifier = NULL );
static void ListBinds( sdBindContext* context );
static void ExecKeyBinding( const sdKeyCommand* cmd );
static void WriteBindings( idFile *f );
static void SetupBinds( void );
static void UnbindAll( void );
static int AllocKey( const char* name, const char* locName, const wchar_t* fixedText );
static idKey& GetKeyByIndex( int index ) { return *keys[ index ]; }
static idKey* GetKey( const char* name );
static int GetKeyIndex( const char* name );
static bool AnyKeysDown( void );
private:
static idHashIndex keysHash;
static idList< idKey* > keys;
static idList< sdBindContext* > bindContexts;
static idHashIndex bindContextsHash;
static bool overStrikeMode;
// static idBlockAlloc< idKey, 128 > keyAllocator;
};
class sdKeyInputManager {
public:
virtual ~sdKeyInputManager() {}
virtual void SetBinding( sdBindContext* context, idKey& key, const char* binding, idKey* modifierKey ) = 0;
virtual const char* GetBinding( sdBindContext* context, idKey& key, idKey* modifierKey ) = 0;
virtual void UnbindBinding( sdBindContext* context, const char *bind ) = 0;
virtual void KeysFromBinding( sdBindContext* context, const char* binding, bool useBindStrWhenEmpty, idWStr& keyName ) = 0;
// pass NULL for keys to find the number of keys to allocate
virtual void KeysFromBinding( sdBindContext* context, const char* binding, int& numKeys, idKey** keys ) = 0;
virtual bool IsDown( const idKey& key ) = 0;
virtual bool IsDown( keyNum_e key ) = 0;
virtual idKey* GetKey( const char* name ) = 0;
virtual idKey* GetKeyForEvent( const sdSysEvent& evt, bool& down ) = 0;
virtual void ProcessUserCmdEvent( const sdSysEvent& event ) = 0;
virtual sdKeyCommand* GetCommand( sdBindContext* context, const idKey& key ) = 0;
virtual sdBindContext* AllocBindContext( const char* context ) = 0;
virtual void UnbindKey( sdBindContext* context, idKey& key, idKey* modifier = NULL ) = 0;
virtual bool AnyKeysDown( void ) = 0;
};
extern sdKeyInputManager* keyInputManager;
#endif /* !__KEYINPUT_H__ */