Preliminary work for keyboard layouts

This commit is contained in:
Lephenixnoir 2021-09-30 10:09:13 +02:00
parent 341392e364
commit 9f9083ed8f
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
2 changed files with 156 additions and 39 deletions

View File

@ -74,15 +74,15 @@ extern CGD_DelayedFileWrite CGD_DelayedSaves[6];
// Keyboard interface.
// Special key names for cheats, debugs, etc (completes doomdef.h).
#define SKEY_CHEAT 0x10001
#define SKEY_DECVP 0x10002
#define SKEY_INCVP 0x10003
#define SKEY_NOCLIP 0x10004
#define SKEY_GAMMA 0x10005
#define SKEY_FREEMEM 0x10006
#define SKEY_FPSCOUNTER 0x10007
#define SKEY_FRAMESKIP 0x10008
#define SKEY_PROFILER 0x10009
#define SKEY_CHEAT 0x101
#define SKEY_DECVP 0x102
#define SKEY_INCVP 0x103
#define SKEY_NOCLIP 0x104
#define SKEY_GAMMA 0x105
#define SKEY_FREEMEM 0x106
#define SKEY_FPSCOUNTER 0x107
#define SKEY_FRAMESKIP 0x108
#define SKEY_PROFILER 0x109
// Scan keyboard (the previous state is also retained).
void UpdateKeyboardState(void);

View File

@ -74,6 +74,132 @@
/* Copy of the keyboard state, one byte per row */
typedef uint8_t KeyboardState[12] __attribute__((aligned(2)));
/* Keymap */
static uint16_t Keymap[] = {
KEY_LEFTARROW, 0,
KEY_RIGHTARROW, 0,
KEY_UPARROW, 0,
KEY_DOWNARROW, 0,
' ', 0, /* Open doors etc */
KEY_RCTRL, 0, /* Shoot */
'1', 0,
'2', 0,
'3', 0,
'4', 0,
'5', 0,
'6', 0,
'7', 0,
KEY_TAB, 0,
KEY_PAUSE, 0,
KEY_SLEFTARROW, 0,
KEY_SRIGHTARROW, 0,
KEY_RSHIFT, 0, /* Speed toggle */
/* Special CGDoom keys */
SKEY_DECVP, 0,
SKEY_INCVP, 0,
SKEY_CHEAT, 0,
SKEY_NOCLIP, 0,
SKEY_GAMMA, 0,
SKEY_FREEMEM, 0,
SKEY_FPSCOUNTER, 0,
SKEY_FRAMESKIP, 0,
SKEY_PROFILER, 0,
0,
};
/* Default keymap: CGDoom 0.3 */
static const uint16_t KeyMap_CGDoom_0_3[] = {
KEYCODE_LEFT,
KEYCODE_RIGHT,
KEYCODE_UP,
KEYCODE_DOWN,
KEYCODE_EXE,
KEYCODE_ALPHA,
KEYCODE_F1,
KEYCODE_F2,
KEYCODE_F3,
KEYCODE_F4,
KEYCODE_F5,
KEYCODE_F6,
KEYCODE_SHIFT,
KEYCODE_EXIT,
KEYCODE_OPTN,
KEYCODE_0,
KEYCODE_DOT,
KEYCODE_MINUS,
KEYCODE_PLUS,
KEYCODE_POWER,
KEYCODE_ARROW,
KEYCODE_FRAC,
KEYCODE_FD,
KEYCODE_LEFTP,
KEYCODE_VARS,
KEYCODE_RIGHTP,
0,
};
/* Default keymap: thumbs only */
static const uint16_t KeyMap_ThumbsOnly[] = {
KEYCODE_LEFT,
KEYCODE_RIGHT,
KEYCODE_UP,
KEYCODE_DOWN,
KEYCODE_SQUARE,
KEYCODE_ALPHA,
KEYCODE_F1,
KEYCODE_F2,
KEYCODE_F3,
KEYCODE_F4,
KEYCODE_F5,
KEYCODE_F6,
KEYCODE_SHIFT,
KEYCODE_EXIT,
KEYCODE_OPTN,
KEYCODE_LOG,
KEYCODE_LN,
KEYCODE_XOT,
KEYCODE_MINUS,
KEYCODE_PLUS,
KEYCODE_COMMA,
KEYCODE_ARROW,
KEYCODE_FRAC,
KEYCODE_FD,
KEYCODE_LEFTP,
KEYCODE_VARS,
KEYCODE_RIGHTP,
0,
};
/* Default keymap: full-hands */
static const uint16_t KeyMap_FullHands[] = {
KEYCODE_F5,
KEYCODE_F6,
KEYCODE_OPTN,
KEYCODE_SQUARE,
KEYCODE_MUL,
KEYCODE_DEL,
KEYCODE_1,
KEYCODE_2,
KEYCODE_3,
KEYCODE_4,
KEYCODE_5,
KEYCODE_6,
KEYCODE_7,
KEYCODE_TAN,
KEYCODE_ACON,
KEYCODE_ALPHA,
KEYCODE_POWER,
KEYCODE_COS,
KEYCODE_MINUS,
KEYCODE_PLUS,
KEYCODE_COMMA,
KEYCODE_ARROW,
KEYCODE_FRAC,
KEYCODE_FD,
KEYCODE_LEFTP,
KEYCODE_SIN,
KEYCODE_RIGHTP,
0,
};
/* Current keyboard state. */
static KeyboardState st_prev={0}, st_now={0};
@ -84,42 +210,33 @@ static void ScanKeyboard(KeyboardState state)
for(int i = 0; i < 6; i++) array[i] = KEYSC[i];
}
static void LoadKeymap(uint16_t *map, uint16_t *template)
{
for(int i = 0; map[2*i] != 0; i++) {
map[2*i+1] = template[i];
}
}
static int DecodeKeymap(uint16_t *map, int key)
{
for(int i = 0; map[2*i] != 0; i++) {
if(map[2*i] == key)
return map[2*i+1];
}
return -1;
}
static int DoomKeyToKeycode(int key)
{
int code = DecodeKeymap(Keymap, key);
if(code != -1)
return code;
switch(key)
{
/* Normal Doom keys */
case KEY_LEFTARROW: return KEYCODE_LEFT;
case KEY_RIGHTARROW: return KEYCODE_RIGHT;
case KEY_UPARROW: return KEYCODE_UP;
case KEY_DOWNARROW: return KEYCODE_DOWN;
case ' ': return KEYCODE_SQUARE;
case KEY_RCTRL: return KEYCODE_ALPHA;
case '1': return KEYCODE_F1;
case '2': return KEYCODE_F2;
case '3': return KEYCODE_F3;
case '4': return KEYCODE_F4;
case '5': return KEYCODE_F5;
case '6': return KEYCODE_F6;
case '7': return KEYCODE_SHIFT;
case KEY_TAB: return KEYCODE_EXIT;
case KEY_PAUSE: return KEYCODE_OPTN;
case KEY_SLEFTARROW: return KEYCODE_LOG;
case KEY_SRIGHTARROW: return KEYCODE_LN;
/* Interface constants */
case KEY_ESCAPE: return KEYCODE_MENU;
case KEY_ENTER: return KEYCODE_EXE;
case KEY_RSHIFT: return KEYCODE_XOT;
/* Special CGDoom keys */
case SKEY_CHEAT: return KEYCODE_POWER;
case SKEY_DECVP: return KEYCODE_MINUS;
case SKEY_INCVP: return KEYCODE_PLUS;
case SKEY_NOCLIP: return KEYCODE_ARROW;
case SKEY_GAMMA: return KEYCODE_FRAC;
case SKEY_FREEMEM: return KEYCODE_FD;
case SKEY_FPSCOUNTER: return KEYCODE_LEFTP;
case SKEY_FRAMESKIP: return KEYCODE_VARS;
case SKEY_PROFILER: return KEYCODE_RIGHTP;
/* Alphabetic keys */
case 'A': return KEYCODE_XOT;