diff --git a/src/console.c b/src/console.c index 52f16ed467bf70d2608e0109973bc3e1a695c500..a51ff61f7c6033af6d5f3ab2773eb4deebb2cce4 100644 --- a/src/console.c +++ b/src/console.c @@ -783,7 +783,7 @@ boolean CON_Responder(event_t *ev) // check other keys only if console prompt is active if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!! { - if (bindtable[key]) + if (bindtable[key] && ev->type == ev_keydown) // ev_textinput crashes the game. Why? { COM_BufAddText(bindtable[key]); COM_BufAddText("\n"); diff --git a/src/g_input.c b/src/g_input.c index ca41cdb52ecd933d5dde353b4beb4ea593fe206c..27862e0c5177c26f378f14cf93b36bc6c951aba1 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -40,7 +40,7 @@ INT32 mouse2x, mouse2y, mlook2y; INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET]; // current state of the keys: true if pushed -UINT8 gamekeydown[NUMINPUTS]; +INT32 gamekeydown[NUMINPUTS]; // two key codes (or virtual key) per game control INT32 gamecontrol[num_gamecontrols][2]; @@ -117,7 +117,7 @@ void G_MapEventsToControls(event_t *ev) switch (ev->type) { case ev_keydown: - if (ev->data1 < NUMINPUTS) + if (ev->data1 < NUMINPUTS || (ev->data1 & KEY_XTMASK)) gamekeydown[ev->data1] = 1; #ifdef PARANOIA else @@ -129,7 +129,7 @@ void G_MapEventsToControls(event_t *ev) break; case ev_keyup: - if (ev->data1 < NUMINPUTS) + if (ev->data1 < NUMINPUTS || (ev->data1 & KEY_XTMASK)) gamekeydown[ev->data1] = 0; #ifdef PARANOIA else @@ -638,9 +638,9 @@ const char *G_KeynumToString(INT32 keynum) UINT32 j; // return a string with the ascii char if displayable - if (keynum > ' ' && keynum <= 'z' && keynum != KEY_CONSOLE) + if (keynum > ' ' && keynum <= 0xFF && keynum != KEY_CONSOLE) { - keynamestr[0] = (char)keynum; + keynamestr[0] = (UINT8)keynum; keynamestr[1] = '\0'; return keynamestr; } @@ -657,10 +657,12 @@ const char *G_KeynumToString(INT32 keynum) INT32 G_KeyStringtoNum(const char *keystr) { + const UINT8 *keystr_u = (const UINT8 *)keystr; UINT32 j; - if (!keystr[1] && keystr[0] > ' ' && keystr[0] <= 'z') - return keystr[0]; + // You can put � as your strafe left key but the game won't recognize it + if (!keystr_u[1] && keystr_u[0] > ' ' && keystr_u[0] <= 0xFF) + return (UINT8)keystr[0]; if (!strncmp(keystr, "KEY", 3) && keystr[3] >= '0' && keystr[3] <= '9') return atoi(&keystr[3]); diff --git a/src/g_input.h b/src/g_input.h index d089332c5355305ce5b350ed0ab5fc9d72a0302d..398d0428c47feec824999e48de0b88c58efbf891 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -20,7 +20,7 @@ // number of total 'button' inputs, include keyboard keys, plus virtual // keys (mousebuttons and joybuttons becomes keys) -#define NUMKEYS 256 +#define NUMKEYS 0x200 // Needs to be at least a single bit higher KEY_XTMASK!!!! #define MOUSEBUTTONS 8 #define JOYBUTTONS 32 // 32 buttons @@ -123,7 +123,7 @@ extern INT32 mouse2x, mouse2y, mlook2y; extern INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET]; // current state of the keys: true if pushed -extern UINT8 gamekeydown[NUMINPUTS]; +extern INT32 gamekeydown[NUMINPUTS]; // two key codes (or virtual key) per game control extern INT32 gamecontrol[num_gamecontrols][2]; diff --git a/src/keys.h b/src/keys.h index b4a6a7a309f62c068c7985457160285eb285c5d2..426f55f24f28f47547aa1f3e1e2093e708363524 100644 --- a/src/keys.h +++ b/src/keys.h @@ -16,7 +16,7 @@ // Lactozilla: Well, this is embarrassing // Those key codes conflict with even Latin-1 Supplement // At least events are 32-bits, so I can use 0x100 -// Which is one bit higher than 0x80 +#define KEY_XTMASK (0x100) #define KEY_NULL 0 // null key, triggers nothing #define KEY_BACKSPACE 8 @@ -28,66 +28,66 @@ #define KEY_EQUALS 61 // Num lock and scroll lock -#define KEY_NUMLOCK (0x100+1) -#define KEY_SCROLLLOCK (0x100+2) +#define KEY_NUMLOCK (KEY_XTMASK+1) +#define KEY_SCROLLLOCK (KEY_XTMASK+2) // Keypad -#define KEY_KEYPAD7 (0x100+3) -#define KEY_KEYPAD8 (0x100+4) -#define KEY_KEYPAD9 (0x100+5) -#define KEY_MINUSPAD (0x100+6) -#define KEY_KEYPAD4 (0x100+7) -#define KEY_KEYPAD5 (0x100+8) -#define KEY_KEYPAD6 (0x100+9) -#define KEY_PLUSPAD (0x100+10) -#define KEY_KEYPAD1 (0x100+11) -#define KEY_KEYPAD2 (0x100+12) -#define KEY_KEYPAD3 (0x100+13) -#define KEY_KEYPAD0 (0x100+14) -#define KEY_KPADDEL (0x100+15) +#define KEY_KEYPAD7 (KEY_XTMASK+3) +#define KEY_KEYPAD8 (KEY_XTMASK+4) +#define KEY_KEYPAD9 (KEY_XTMASK+5) +#define KEY_MINUSPAD (KEY_XTMASK+6) +#define KEY_KEYPAD4 (KEY_XTMASK+7) +#define KEY_KEYPAD5 (KEY_XTMASK+8) +#define KEY_KEYPAD6 (KEY_XTMASK+9) +#define KEY_PLUSPAD (KEY_XTMASK+10) +#define KEY_KEYPAD1 (KEY_XTMASK+11) +#define KEY_KEYPAD2 (KEY_XTMASK+12) +#define KEY_KEYPAD3 (KEY_XTMASK+13) +#define KEY_KEYPAD0 (KEY_XTMASK+14) +#define KEY_KPADDEL (KEY_XTMASK+15) // Bill Gates keys -#define KEY_LEFTWIN (0x100+16) -#define KEY_RIGHTWIN (0x100+17) -#define KEY_MENU (0x100+18) // Context Menu +#define KEY_LEFTWIN (KEY_XTMASK+16) +#define KEY_RIGHTWIN (KEY_XTMASK+17) +#define KEY_MENU (KEY_XTMASK+18) // Context Menu -#define KEY_KPADSLASH (0x100+19) -#define KEY_HOME (0x100+20) -#define KEY_UPARROW (0x100+21) -#define KEY_PGUP (0x100+22) -#define KEY_LEFTARROW (0x100+23) -#define KEY_RIGHTARROW (0x100+24) -#define KEY_END (0x100+25) -#define KEY_DOWNARROW (0x100+26) -#define KEY_PGDN (0x100+27) -#define KEY_INS (0x100+28) -#define KEY_DEL (0x100+29) +#define KEY_KPADSLASH (KEY_XTMASK+19) +#define KEY_HOME (KEY_XTMASK+20) +#define KEY_UPARROW (KEY_XTMASK+21) +#define KEY_PGUP (KEY_XTMASK+22) +#define KEY_LEFTARROW (KEY_XTMASK+23) +#define KEY_RIGHTARROW (KEY_XTMASK+24) +#define KEY_END (KEY_XTMASK+25) +#define KEY_DOWNARROW (KEY_XTMASK+26) +#define KEY_PGDN (KEY_XTMASK+27) +#define KEY_INS (KEY_XTMASK+28) +#define KEY_DEL (KEY_XTMASK+29) // Function keys -#define KEY_F1 (0x100+30) -#define KEY_F2 (0x100+31) -#define KEY_F3 (0x100+32) -#define KEY_F4 (0x100+33) -#define KEY_F5 (0x100+34) -#define KEY_F6 (0x100+35) -#define KEY_F7 (0x100+36) -#define KEY_F8 (0x100+37) -#define KEY_F9 (0x100+38) -#define KEY_F10 (0x100+39) -#define KEY_F11 (0x100+40) -#define KEY_F12 (0x100+41) +#define KEY_F1 (KEY_XTMASK+30) +#define KEY_F2 (KEY_XTMASK+31) +#define KEY_F3 (KEY_XTMASK+32) +#define KEY_F4 (KEY_XTMASK+33) +#define KEY_F5 (KEY_XTMASK+34) +#define KEY_F6 (KEY_XTMASK+35) +#define KEY_F7 (KEY_XTMASK+36) +#define KEY_F8 (KEY_XTMASK+37) +#define KEY_F9 (KEY_XTMASK+38) +#define KEY_F10 (KEY_XTMASK+39) +#define KEY_F11 (KEY_XTMASK+40) +#define KEY_F12 (KEY_XTMASK+41) -#define KEY_CAPSLOCK (0x100+42) -#define KEY_CONSOLE KEY_MENU // (0x100+43) -#define KEY_PAUSE (0x100+44) -#define KEY_PRTSC (0x100+45) +#define KEY_CAPSLOCK (KEY_XTMASK+42) +#define KEY_CONSOLE KEY_MENU // (KEY_XTMASK+43) +#define KEY_PAUSE (KEY_XTMASK+44) +#define KEY_PRTSC (KEY_XTMASK+45) -// these ones must be non-extended scancodes (rctrl, rshift, lalt) -#define KEY_LSHIFT (0x100+46) -#define KEY_RSHIFT (0x100+47) -#define KEY_LCTRL (0x100+48) -#define KEY_RCTRL (0x100+49) -#define KEY_LALT (0x100+50) -#define KEY_RALT (0x100+51) +// Modifiers +#define KEY_LSHIFT (KEY_XTMASK+46) +#define KEY_RSHIFT (KEY_XTMASK+47) +#define KEY_LCTRL (KEY_XTMASK+48) +#define KEY_RCTRL (KEY_XTMASK+49) +#define KEY_LALT (KEY_XTMASK+50) +#define KEY_RALT (KEY_XTMASK+51) #endif diff --git a/src/m_misc.c b/src/m_misc.c index d973833857a339c4aa61589348aa473c959c0d3d..5f5196ab406b9c63b645ef62e8cb85a06d55935c 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -1579,7 +1579,7 @@ boolean M_ScreenshotResponder(event_t *ev) ch = ev->data1; - if (ch >= KEY_MOUSE1 && menuactive) // If it's not a keyboard key, then don't allow it in the menus! + if (ch >= NUMKEYS && menuactive) // If it's not a keyboard key, then don't allow it in the menus! return false; if (ch == KEY_F8 || ch == gamecontrol[gc_screenshot][0] || ch == gamecontrol[gc_screenshot][1]) // remappable F8