Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
5.4 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef KEYBOARD_H
#define KEYBOARD_H
#ifdef _WIN32
#pragma once
#endif
#define KEY_MOD_SHIFT 0x0001
#define KEY_MOD_CONTROL 0x0002
#define KEY_MOD_ALT 0x0004
//
// Defines the maximum number of physical keys. These physical keys correspond to
// the windows virtual key codes shown below. Missing key codes may be up for grabs,
// but it is probably safer to add to the end of the list.
//
#define MAX_PHYSICAL_KEYS 256
//
// VK_LBUTTON 0x01
// VK_RBUTTON 0x02
// VK_CANCEL 0x03
// VK_MBUTTON 0x04
// ? 0x04
// ? 0x05
// ? 0x06
// ? 0x07
// VK_BACK 0x08
// VK_TAB 0x09
// ? 0x0A
// ? 0x0B
// VK_CLEAR 0x0C
// VK_RETURN 0x0D
// ? 0x0E
// ? 0x0F
// VK_SHIFT 0x10
// VK_CONTROL 0x11
// VK_MENU 0x12
// VK_PAUSE 0x13
// VK_CAPITAL 0x14
// VK_KANA 0x15
// VK_HANGUL 0x15
// VK_JUNJA 0x17
// VK_FINAL 0x18
// VK_KANJI 0x19
// ? 0x1A
// VK_ESCAPE 0x1B
// VK_CONVERT 0x1C
// VK_NONCONVERT 0x1D
// VK_ACCEPT 0x1E
// VK_MODECHANGE 0x1F
// VK_SPACE 0x20
// VK_PRIOR 0x21
// VK_NEXT 0x22
// VK_END 0x23
// VK_HOME 0x24
// VK_LEFT 0x25
// VK_UP 0x26
// VK_RIGHT 0x27
// VK_DOWN 0x28
// VK_SELECT 0x29
// VK_PRINT 0x2A
// VK_EXECUTE 0x2B
// VK_SNAPSHOT 0x2C
// VK_INSERT 0x2D
// VK_DELETE 0x2E
// VK_HELP 0x2F
//
// VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
//
// VK_0 0x30
// VK_1 0x31
// VK_2 0x32
// VK_3 0x33
// VK_4 0x34
// VK_5 0x35
// VK_6 0x36
// VK_7 0x37
// VK_8 0x38
// VK_9 0x39
// ? 0x40
//
// VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
//
// VK_A 0X41
// VK_B 0X42
// VK_C 0X43
// VK_D 0X44
// VK_E 0X45
// VK_F 0X46
// VK_G 0X47
// VK_H 0X48
// VK_I 0X49
// VK_J 0X4A
// VK_K 0X4B
// VK_L 0X4C
// VK_M 0X4D
// VK_N 0X4E
// VK_O 0X4F
// VK_P 0X50
// VK_Q 0X51
// VK_R 0X52
// VK_S 0X53
// VK_T 0X54
// VK_U 0X55
// VK_V 0X56
// VK_W 0X57
// VK_X 0X58
// VK_Y 0X59
// VK_Z 0X5A
// VK_LWIN 0x5B
// VK_RWIN 0x5C
// VK_APPS 0x5D
// ? 0x5E
// ? 0x5F
// VK_NUMPAD0 0x60
// VK_NUMPAD1 0x61
// VK_NUMPAD2 0x62
// VK_NUMPAD3 0x63
// VK_NUMPAD4 0x64
// VK_NUMPAD5 0x65
// VK_NUMPAD6 0x66
// VK_NUMPAD7 0x67
// VK_NUMPAD8 0x68
// VK_NUMPAD9 0x69
// VK_MULTIPLY 0x6A
// VK_ADD 0x6B
// VK_SEPARATOR 0x6C
// VK_SUBTRACT 0x6D
// VK_DECIMAL 0x6E
// VK_DIVIDE 0x6F
//
// Function keys
//
// VK_F1 0x70
// VK_F2 0x71
// VK_F3 0x72
// VK_F4 0x73
// VK_F5 0x74
// VK_F6 0x75
// VK_F7 0x76
// VK_F8 0x77
// VK_F9 0x78
// VK_F10 0x79
// VK_F11 0x7A
// VK_F12 0x7B
// VK_F13 0x7C
// VK_F14 0x7D
// VK_F15 0x7E
// VK_F16 0x7F
// VK_F17 0x80
// VK_F18 0x81
// VK_F19 0x82
// VK_F20 0x83
// VK_F21 0x84
// VK_F22 0x85
// VK_F23 0x86
// VK_F24 0x87
// ? 0x88
// ? 0x89
// ? 0x8A
// ? 0x8B
// ? 0x8C
// ? 0x8D
// ? 0x8E
// ? 0x8F
// VK_NUMLOCK 0x90
// VK_SCROLL 0x91
// ? 0x92
// ? 0x93
// ? 0x94
// ? 0x95
// ? 0x96
// ? 0x97
// ? 0x98
// ? 0x99
// ? 0x9A
// ? 0x9B
// ? 0x9C
// ? 0x9D
// ? 0x9E
// ? 0x9F
//
// VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
// Used only as parameters to GetAsyncKeyState() and GetKeyState().
// No other API or message will distinguish left and right keys in this way.
//
// VK_LSHIFT 0xA0
// VK_RSHIFT 0xA1
// VK_LCONTROL 0xA2
// VK_RCONTROL 0xA3
// VK_LMENU 0xA4
// VK_RMENU 0xA5
// VK_PROCESSKEY 0xE5
// VK_ATTN 0xF6
// VK_CRSEL 0xF7
// VK_EXSEL 0xF8
// VK_EREOF 0xF9
// VK_PLAY 0xFA
// VK_ZOOM 0xFB
// VK_NONAME 0xFC
// VK_PA1 0xFD
// VK_OEM_CLEAR 0xFE
//
//
// Defines the maximum number of logical keys. Logical keys are application-specific
// values that are associated with physical keys via AddKeyMap.
//
#define MAX_LOGICAL_KEYS 256
//
// Defines the maximum number of unique key bindings.
//
#define MAX_KEYMAPS 256
typedef struct
{
unsigned int uChar;
unsigned int uModifierKeys;
unsigned int uLogicalKey;
} KeyMap_t;
class CKeyboard
{
public:
CKeyboard(void);
~CKeyboard(void);
void AddKeyMap(unsigned int uChar, unsigned int uModifierKeys, unsigned int uLogicalKey);
void ClearImpulseFlags(void);
void ClearKeyStates(void);
float GetKeyScale(unsigned int uLogicalKey);
void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
void RemoveAllKeyMaps(void);
protected:
bool IsKeyPressed(unsigned int uChar, unsigned int uModifierKeys);
bool IsModifierKey(unsigned int uChar);
unsigned int GetModifierKeyBit(unsigned int uChar);
void UpdateLogicalKeys(unsigned int uChar, bool bPressed);
unsigned int g_uPhysicalKeyState[MAX_PHYSICAL_KEYS];
unsigned int g_uLogicalKeyState[MAX_LOGICAL_KEYS];
KeyMap_t g_uKeyMap[MAX_KEYMAPS];
unsigned int g_uKeyMaps;
};
#endif // KEYBOARD_H