mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-24 21:31:46 +00:00
Merge branch 'fix-us-intl-console-key' into 'next'
Fix keyboard input when certain keys overlap with dead keys Closes #1174 See merge request STJr/SRB2!2443
This commit is contained in:
commit
418671863c
8 changed files with 85 additions and 13 deletions
|
@ -922,8 +922,6 @@ static void CON_InputDelChar(void)
|
||||||
//
|
//
|
||||||
boolean CON_Responder(event_t *ev)
|
boolean CON_Responder(event_t *ev)
|
||||||
{
|
{
|
||||||
static UINT8 consdown = false; // console is treated differently due to rare usage
|
|
||||||
|
|
||||||
// sequential completions a la 4dos
|
// sequential completions a la 4dos
|
||||||
static char completioncmd[80 + sizeof("find ")] = "find ";
|
static char completioncmd[80 + sizeof("find ")] = "find ";
|
||||||
static char *completion = &completioncmd[sizeof("find ")-1];
|
static char *completion = &completioncmd[sizeof("find ")-1];
|
||||||
|
@ -943,32 +941,28 @@ boolean CON_Responder(event_t *ev)
|
||||||
// let go keyup events, don't eat them
|
// let go keyup events, don't eat them
|
||||||
if (ev->type != ev_keydown && ev->type != ev_text && ev->type != ev_console)
|
if (ev->type != ev_keydown && ev->type != ev_text && ev->type != ev_console)
|
||||||
{
|
{
|
||||||
if (ev->key == gamecontrol[GC_CONSOLE][0] || ev->key == gamecontrol[GC_CONSOLE][1])
|
|
||||||
consdown = false;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
key = ev->key;
|
key = ev->key;
|
||||||
|
|
||||||
// check for console toggle key
|
// check for console toggle key
|
||||||
if (ev->type != ev_console)
|
if (ev->type == ev_keydown)
|
||||||
{
|
{
|
||||||
if (modeattacking || metalrecording || marathonmode)
|
if (modeattacking || metalrecording || marathonmode)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (ev->type == ev_keydown && ((key == gamecontrol[GC_CONSOLE][0] || key == gamecontrol[GC_CONSOLE][1]) && !shiftdown))
|
if ((key == gamecontrol[GC_CONSOLE][0] || key == gamecontrol[GC_CONSOLE][1]) && !shiftdown)
|
||||||
{
|
{
|
||||||
if (consdown) // ignore repeat
|
I_SetTextInputMode(con_destlines == 0); // inverse, since this is changed next tic.
|
||||||
return true;
|
|
||||||
consoletoggle = true;
|
consoletoggle = true;
|
||||||
consdown = true;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check other keys only if console prompt is active
|
// check other keys only if console prompt is active
|
||||||
if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!!
|
if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!!
|
||||||
{
|
{
|
||||||
if (ev->type == ev_keydown && !menuactive && bindtable[key])
|
if (!menuactive && bindtable[key])
|
||||||
{
|
{
|
||||||
COM_BufAddText(bindtable[key]);
|
COM_BufAddText(bindtable[key]);
|
||||||
COM_BufAddText("\n");
|
COM_BufAddText("\n");
|
||||||
|
@ -980,14 +974,14 @@ boolean CON_Responder(event_t *ev)
|
||||||
// escape key toggle off console
|
// escape key toggle off console
|
||||||
if (key == KEY_ESCAPE)
|
if (key == KEY_ESCAPE)
|
||||||
{
|
{
|
||||||
|
I_SetTextInputMode(false);
|
||||||
consoletoggle = true;
|
consoletoggle = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (ev->type == ev_text)
|
||||||
if (ev->type == ev_text)
|
|
||||||
{
|
{
|
||||||
if (!consoletoggle)
|
if (!consoletoggle && consoleready)
|
||||||
CON_InputAddChar(key);
|
CON_InputAddChar(key);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1585,5 +1585,15 @@ void I_GetCursorPosition(INT32 *x, INT32 *y)
|
||||||
(void)y;
|
(void)y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void I_SetTextInputMode(boolean active)
|
||||||
|
{
|
||||||
|
(void)active;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean I_GetTextInputMode(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#include "../sdl/dosstr.c"
|
#include "../sdl/dosstr.c"
|
||||||
|
|
||||||
|
|
|
@ -211,5 +211,15 @@ const char *I_GetSysName(void)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void I_SetTextInputMode(boolean active)
|
||||||
|
{
|
||||||
|
(void)active;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean I_GetTextInputMode(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#include "../sdl/dosstr.c"
|
#include "../sdl/dosstr.c"
|
||||||
|
|
||||||
|
|
|
@ -999,6 +999,7 @@ static void HU_sendChatMessage(void)
|
||||||
void HU_clearChatChars(void)
|
void HU_clearChatChars(void)
|
||||||
{
|
{
|
||||||
memset(w_chat, '\0', sizeof(w_chat));
|
memset(w_chat, '\0', sizeof(w_chat));
|
||||||
|
I_SetTextInputMode(false);
|
||||||
chat_on = false;
|
chat_on = false;
|
||||||
c_input = 0;
|
c_input = 0;
|
||||||
|
|
||||||
|
@ -1048,6 +1049,7 @@ boolean HU_Responder(event_t *ev)
|
||||||
if ((ev->key == gamecontrol[GC_TALKKEY][0] || ev->key == gamecontrol[GC_TALKKEY][1])
|
if ((ev->key == gamecontrol[GC_TALKKEY][0] || ev->key == gamecontrol[GC_TALKKEY][1])
|
||||||
&& netgame && !OLD_MUTE) // check for old chat mute, still let the players open the chat incase they want to scroll otherwise.
|
&& netgame && !OLD_MUTE) // check for old chat mute, still let the players open the chat incase they want to scroll otherwise.
|
||||||
{
|
{
|
||||||
|
I_SetTextInputMode(true);
|
||||||
chat_on = true;
|
chat_on = true;
|
||||||
chat_on_first_event = false;
|
chat_on_first_event = false;
|
||||||
w_chat[0] = 0;
|
w_chat[0] = 0;
|
||||||
|
@ -1059,6 +1061,7 @@ boolean HU_Responder(event_t *ev)
|
||||||
if ((ev->key == gamecontrol[GC_TEAMKEY][0] || ev->key == gamecontrol[GC_TEAMKEY][1])
|
if ((ev->key == gamecontrol[GC_TEAMKEY][0] || ev->key == gamecontrol[GC_TEAMKEY][1])
|
||||||
&& netgame && !OLD_MUTE)
|
&& netgame && !OLD_MUTE)
|
||||||
{
|
{
|
||||||
|
I_SetTextInputMode(true);
|
||||||
chat_on = true;
|
chat_on = true;
|
||||||
chat_on_first_event = false;
|
chat_on_first_event = false;
|
||||||
w_chat[0] = 0;
|
w_chat[0] = 0;
|
||||||
|
@ -1133,6 +1136,7 @@ boolean HU_Responder(event_t *ev)
|
||||||
if (!CHAT_MUTE)
|
if (!CHAT_MUTE)
|
||||||
HU_sendChatMessage();
|
HU_sendChatMessage();
|
||||||
|
|
||||||
|
I_SetTextInputMode(false);
|
||||||
chat_on = false;
|
chat_on = false;
|
||||||
c_input = 0; // reset input cursor
|
c_input = 0; // reset input cursor
|
||||||
chat_scrollmedown = true; // you hit enter, so you might wanna autoscroll to see what you just sent. :)
|
chat_scrollmedown = true; // you hit enter, so you might wanna autoscroll to see what you just sent. :)
|
||||||
|
@ -1143,6 +1147,7 @@ boolean HU_Responder(event_t *ev)
|
||||||
|| c == gamecontrol[GC_TEAMKEY][0] || c == gamecontrol[GC_TEAMKEY][1])
|
|| c == gamecontrol[GC_TEAMKEY][0] || c == gamecontrol[GC_TEAMKEY][1])
|
||||||
&& c >= KEY_MOUSE1)) // If it's not a keyboard key, then the chat button is used as a toggle.
|
&& c >= KEY_MOUSE1)) // If it's not a keyboard key, then the chat button is used as a toggle.
|
||||||
{
|
{
|
||||||
|
I_SetTextInputMode(false);
|
||||||
chat_on = false;
|
chat_on = false;
|
||||||
c_input = 0; // reset input cursor
|
c_input = 0; // reset input cursor
|
||||||
I_UpdateMouseGrab();
|
I_UpdateMouseGrab();
|
||||||
|
|
|
@ -339,4 +339,12 @@ void I_SetMouseGrab(boolean grab);
|
||||||
*/
|
*/
|
||||||
const char *I_GetSysName(void);
|
const char *I_GetSysName(void);
|
||||||
|
|
||||||
|
/** \brief Sets text input mode. When enabled, keyboard inputs will respect dead keys.
|
||||||
|
*/
|
||||||
|
void I_SetTextInputMode(boolean active);
|
||||||
|
|
||||||
|
/** \brief Retrieves current text input mode.
|
||||||
|
*/
|
||||||
|
boolean I_GetTextInputMode(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
28
src/m_menu.c
28
src/m_menu.c
|
@ -2102,6 +2102,12 @@ menu_t OP_PlaystyleDef = {
|
||||||
0, 0, 0, NULL
|
0, 0, 0, NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void M_UpdateItemOn(void)
|
||||||
|
{
|
||||||
|
I_SetTextInputMode((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_STRING ||
|
||||||
|
(currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_KEYHANDLER);
|
||||||
|
}
|
||||||
|
|
||||||
static void M_VideoOptions(INT32 choice)
|
static void M_VideoOptions(INT32 choice)
|
||||||
{
|
{
|
||||||
(void)choice;
|
(void)choice;
|
||||||
|
@ -2329,6 +2335,7 @@ void Nextmap_OnChange(void)
|
||||||
{
|
{
|
||||||
currentMenu->lastOn = itemOn;
|
currentMenu->lastOn = itemOn;
|
||||||
itemOn = nastart;
|
itemOn = nastart;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (currentMenu == &SP_TimeAttackDef)
|
else if (currentMenu == &SP_TimeAttackDef)
|
||||||
|
@ -2378,6 +2385,7 @@ void Nextmap_OnChange(void)
|
||||||
{
|
{
|
||||||
currentMenu->lastOn = itemOn;
|
currentMenu->lastOn = itemOn;
|
||||||
itemOn = tastart;
|
itemOn = tastart;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mapheaderinfo[cv_nextmap.value-1] && mapheaderinfo[cv_nextmap.value-1]->forcecharacter[0] != '\0')
|
if (mapheaderinfo[cv_nextmap.value-1] && mapheaderinfo[cv_nextmap.value-1]->forcecharacter[0] != '\0')
|
||||||
|
@ -3128,6 +3136,7 @@ static void M_NextOpt(void)
|
||||||
else
|
else
|
||||||
itemOn++;
|
itemOn++;
|
||||||
} while (oldItemOn != itemOn && ( (currentMenu->menuitems[itemOn].status & IT_TYPE) & IT_SPACE ));
|
} while (oldItemOn != itemOn && ( (currentMenu->menuitems[itemOn].status & IT_TYPE) & IT_SPACE ));
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void M_PrevOpt(void)
|
static void M_PrevOpt(void)
|
||||||
|
@ -3140,6 +3149,7 @@ static void M_PrevOpt(void)
|
||||||
else
|
else
|
||||||
itemOn--;
|
itemOn--;
|
||||||
} while (oldItemOn != itemOn && ( (currentMenu->menuitems[itemOn].status & IT_TYPE) & IT_SPACE ));
|
} while (oldItemOn != itemOn && ( (currentMenu->menuitems[itemOn].status & IT_TYPE) & IT_SPACE ));
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
// lock out further input in a tic when important buttons are pressed
|
// lock out further input in a tic when important buttons are pressed
|
||||||
|
@ -3651,12 +3661,14 @@ void M_StartControlPanel(void)
|
||||||
|
|
||||||
currentMenu = &MainDef;
|
currentMenu = &MainDef;
|
||||||
itemOn = singleplr;
|
itemOn = singleplr;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
else if (modeattacking)
|
else if (modeattacking)
|
||||||
{
|
{
|
||||||
currentMenu = &MAPauseDef;
|
currentMenu = &MAPauseDef;
|
||||||
MAPauseMenu[mapause_hints].status = (M_SecretUnlocked(SECRET_EMBLEMHINTS, clientGamedata)) ? (IT_STRING | IT_CALL) : (IT_DISABLED);
|
MAPauseMenu[mapause_hints].status = (M_SecretUnlocked(SECRET_EMBLEMHINTS, clientGamedata)) ? (IT_STRING | IT_CALL) : (IT_DISABLED);
|
||||||
itemOn = mapause_continue;
|
itemOn = mapause_continue;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
else if (!(netgame || multiplayer)) // Single Player
|
else if (!(netgame || multiplayer)) // Single Player
|
||||||
{
|
{
|
||||||
|
@ -3703,6 +3715,7 @@ void M_StartControlPanel(void)
|
||||||
|
|
||||||
currentMenu = &SPauseDef;
|
currentMenu = &SPauseDef;
|
||||||
itemOn = spause_continue;
|
itemOn = spause_continue;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
else // multiplayer
|
else // multiplayer
|
||||||
{
|
{
|
||||||
|
@ -3744,6 +3757,7 @@ void M_StartControlPanel(void)
|
||||||
|
|
||||||
currentMenu = &MPauseDef;
|
currentMenu = &MPauseDef;
|
||||||
itemOn = mpause_continue;
|
itemOn = mpause_continue;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
CON_ToggleOff(); // move away console
|
CON_ToggleOff(); // move away console
|
||||||
|
@ -3837,6 +3851,7 @@ void M_SetupNextMenu(menu_t *menudef)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
M_UpdateItemOn();
|
||||||
|
|
||||||
hidetitlemap = false;
|
hidetitlemap = false;
|
||||||
}
|
}
|
||||||
|
@ -6109,6 +6124,7 @@ void M_StartMessage(const char *string, void *routine, menumessagetype_t itemtyp
|
||||||
|
|
||||||
currentMenu = &MessageDef;
|
currentMenu = &MessageDef;
|
||||||
itemOn = 0;
|
itemOn = 0;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void M_DrawMessageMenu(void)
|
static void M_DrawMessageMenu(void)
|
||||||
|
@ -6183,6 +6199,7 @@ static void M_HandleImageDef(INT32 choice)
|
||||||
if (itemOn >= (INT16)(currentMenu->numitems-1))
|
if (itemOn >= (INT16)(currentMenu->numitems-1))
|
||||||
itemOn = 0;
|
itemOn = 0;
|
||||||
else itemOn++;
|
else itemOn++;
|
||||||
|
M_UpdateItemOn();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_LEFTARROW:
|
case KEY_LEFTARROW:
|
||||||
|
@ -6193,6 +6210,7 @@ static void M_HandleImageDef(INT32 choice)
|
||||||
if (!itemOn)
|
if (!itemOn)
|
||||||
itemOn = currentMenu->numitems - 1;
|
itemOn = currentMenu->numitems - 1;
|
||||||
else itemOn--;
|
else itemOn--;
|
||||||
|
M_UpdateItemOn();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_ESCAPE:
|
case KEY_ESCAPE:
|
||||||
|
@ -7389,6 +7407,7 @@ static void M_EmblemHints(INT32 choice)
|
||||||
SR_EmblemHintDef.prevMenu = currentMenu;
|
SR_EmblemHintDef.prevMenu = currentMenu;
|
||||||
M_SetupNextMenu(&SR_EmblemHintDef);
|
M_SetupNextMenu(&SR_EmblemHintDef);
|
||||||
itemOn = 2; // always start on back.
|
itemOn = 2; // always start on back.
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void M_DrawEmblemHints(void)
|
static void M_DrawEmblemHints(void)
|
||||||
|
@ -10050,6 +10069,7 @@ static void M_TimeAttack(INT32 choice)
|
||||||
Nextmap_OnChange();
|
Nextmap_OnChange();
|
||||||
|
|
||||||
itemOn = tastart; // "Start" is selected.
|
itemOn = tastart; // "Start" is selected.
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drawing function for Nights Attack
|
// Drawing function for Nights Attack
|
||||||
|
@ -10288,6 +10308,7 @@ static void M_NightsAttack(INT32 choice)
|
||||||
Nextmap_OnChange();
|
Nextmap_OnChange();
|
||||||
|
|
||||||
itemOn = nastart; // "Start" is selected.
|
itemOn = nastart; // "Start" is selected.
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player has selected the "START" from the nights attack screen
|
// Player has selected the "START" from the nights attack screen
|
||||||
|
@ -10607,6 +10628,7 @@ static void M_ModeAttackEndGame(INT32 choice)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
itemOn = currentMenu->lastOn;
|
itemOn = currentMenu->lastOn;
|
||||||
|
M_UpdateItemOn();
|
||||||
G_SetGamestate(GS_TIMEATTACK);
|
G_SetGamestate(GS_TIMEATTACK);
|
||||||
modeattacking = ATTACKING_NONE;
|
modeattacking = ATTACKING_NONE;
|
||||||
M_ChangeMenuMusic("_title", true);
|
M_ChangeMenuMusic("_title", true);
|
||||||
|
@ -10688,6 +10710,7 @@ static void M_Marathon(INT32 choice)
|
||||||
titlemapinaction = TITLEMAP_OFF; // Nope don't give us HOMs please
|
titlemapinaction = TITLEMAP_OFF; // Nope don't give us HOMs please
|
||||||
M_SetupNextMenu(&SP_MarathonDef);
|
M_SetupNextMenu(&SP_MarathonDef);
|
||||||
itemOn = marathonstart; // "Start" is selected.
|
itemOn = marathonstart; // "Start" is selected.
|
||||||
|
M_UpdateItemOn();
|
||||||
recatkdrawtimer = (50-8) * FRACUNIT;
|
recatkdrawtimer = (50-8) * FRACUNIT;
|
||||||
char_scroll = 0;
|
char_scroll = 0;
|
||||||
}
|
}
|
||||||
|
@ -11401,6 +11424,7 @@ static void M_ConnectMenu(INT32 choice)
|
||||||
else
|
else
|
||||||
M_SetupNextMenu(&MP_ConnectDef);
|
M_SetupNextMenu(&MP_ConnectDef);
|
||||||
itemOn = 0;
|
itemOn = 0;
|
||||||
|
M_UpdateItemOn();
|
||||||
M_Refresh(0);
|
M_Refresh(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11660,6 +11684,7 @@ static void M_StartServerMenu(INT32 choice)
|
||||||
Newgametype_OnChange();
|
Newgametype_OnChange();
|
||||||
M_SetupNextMenu(&MP_ServerDef);
|
M_SetupNextMenu(&MP_ServerDef);
|
||||||
itemOn = 1;
|
itemOn = 1;
|
||||||
|
M_UpdateItemOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==============
|
// ==============
|
||||||
|
@ -13071,7 +13096,10 @@ static void M_SetupScreenshotMenu(void)
|
||||||
{
|
{
|
||||||
item->status = IT_GRAYEDOUT;
|
item->status = IT_GRAYEDOUT;
|
||||||
if ((currentMenu == &OP_ScreenshotOptionsDef) && (itemOn == op_screenshot_colorprofile)) // Can't select that
|
if ((currentMenu == &OP_ScreenshotOptionsDef) && (itemOn == op_screenshot_colorprofile)) // Can't select that
|
||||||
|
{
|
||||||
itemOn = op_screenshot_storagelocation;
|
itemOn = op_screenshot_storagelocation;
|
||||||
|
M_UpdateItemOn();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -186,6 +186,9 @@ int main(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// disable text input right off the bat, since we don't need it at the start.
|
||||||
|
I_SetTextInputMode(false);
|
||||||
|
|
||||||
#ifdef LOGMESSAGES
|
#ifdef LOGMESSAGES
|
||||||
if (!M_CheckParm("-nolog"))
|
if (!M_CheckParm("-nolog"))
|
||||||
InitLogging();
|
InitLogging();
|
||||||
|
|
|
@ -3275,4 +3275,18 @@ const char *I_GetSysName(void)
|
||||||
return SDL_GetPlatform();
|
return SDL_GetPlatform();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void I_SetTextInputMode(boolean active)
|
||||||
|
{
|
||||||
|
if (active)
|
||||||
|
SDL_StartTextInput();
|
||||||
|
else
|
||||||
|
SDL_StopTextInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean I_GetTextInputMode(void)
|
||||||
|
{
|
||||||
|
return SDL_IsTextInputActive();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue