mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-27 04:41:23 +00:00
I_GetConsoleEvents: Split KEY_EVENT code into a function of its own, like with I_GetEvent's event types
One benefit of this is that event_t data need only be created if KEY_EVENT is found, since the other event types never do anything anyway
This commit is contained in:
parent
87085f2475
commit
17a06dd6c4
1 changed files with 60 additions and 52 deletions
|
@ -590,70 +590,78 @@ static BOOL I_ReadyConsole(HANDLE ci)
|
||||||
|
|
||||||
static boolean entering_con_command = false;
|
static boolean entering_con_command = false;
|
||||||
|
|
||||||
|
static void Impl_HandleKeyboardConsoleEvent(KEY_EVENT_RECORD evt, HANDLE co)
|
||||||
|
{
|
||||||
|
event_t event;
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO CSBI;
|
||||||
|
DWORD t;
|
||||||
|
|
||||||
|
memset(&event,0x00,sizeof (event));
|
||||||
|
|
||||||
|
if (evt.bKeyDown)
|
||||||
|
{
|
||||||
|
event.type = ev_console;
|
||||||
|
entering_con_command = true;
|
||||||
|
switch (evt.wVirtualKeyCode)
|
||||||
|
{
|
||||||
|
case VK_ESCAPE:
|
||||||
|
case VK_TAB:
|
||||||
|
event.data1 = KEY_NULL;
|
||||||
|
break;
|
||||||
|
case VK_SHIFT:
|
||||||
|
event.data1 = KEY_LSHIFT;
|
||||||
|
break;
|
||||||
|
case VK_RETURN:
|
||||||
|
entering_con_command = false;
|
||||||
|
// Fall through.
|
||||||
|
default:
|
||||||
|
event.data1 = MapVirtualKey(evt.wVirtualKeyCode,2); // convert in to char
|
||||||
|
}
|
||||||
|
if (co != INVALID_HANDLE_VALUE && GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &t))
|
||||||
|
{
|
||||||
|
if (event.data1 && event.data1 != KEY_LSHIFT && event.data1 != KEY_RSHIFT)
|
||||||
|
{
|
||||||
|
#ifdef _UNICODE
|
||||||
|
WriteConsole(co, &evt.uChar.UnicodeChar, 1, &t, NULL);
|
||||||
|
#else
|
||||||
|
WriteConsole(co, &evt.uChar.AsciiChar, 1 , &t, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (evt.wVirtualKeyCode == VK_BACK
|
||||||
|
&& GetConsoleScreenBufferInfo(co,&CSBI))
|
||||||
|
{
|
||||||
|
WriteConsoleOutputCharacterA(co, " ",1, CSBI.dwCursorPosition, &t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event.type = ev_keyup;
|
||||||
|
switch (evt.wVirtualKeyCode)
|
||||||
|
{
|
||||||
|
case VK_SHIFT:
|
||||||
|
event.data1 = KEY_LSHIFT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (event.data1) D_PostEvent(&event);
|
||||||
|
}
|
||||||
|
|
||||||
void I_GetConsoleEvents(void)
|
void I_GetConsoleEvents(void)
|
||||||
{
|
{
|
||||||
event_t ev = {0,0,0,0};
|
|
||||||
HANDLE ci = GetStdHandle(STD_INPUT_HANDLE);
|
HANDLE ci = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE);
|
HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
CONSOLE_SCREEN_BUFFER_INFO CSBI;
|
|
||||||
INPUT_RECORD input;
|
INPUT_RECORD input;
|
||||||
DWORD t;
|
DWORD t;
|
||||||
|
|
||||||
while (I_ReadyConsole(ci) && ReadConsoleInput(ci, &input, 1, &t) && t)
|
while (I_ReadyConsole(ci) && ReadConsoleInput(ci, &input, 1, &t) && t)
|
||||||
{
|
{
|
||||||
memset(&ev,0x00,sizeof (ev));
|
|
||||||
switch (input.EventType)
|
switch (input.EventType)
|
||||||
{
|
{
|
||||||
case KEY_EVENT:
|
case KEY_EVENT:
|
||||||
if (input.Event.KeyEvent.bKeyDown)
|
Impl_HandleKeyboardConsoleEvent(input.Event.KeyEvent, co);
|
||||||
{
|
|
||||||
ev.type = ev_console;
|
|
||||||
entering_con_command = true;
|
|
||||||
switch (input.Event.KeyEvent.wVirtualKeyCode)
|
|
||||||
{
|
|
||||||
case VK_ESCAPE:
|
|
||||||
case VK_TAB:
|
|
||||||
ev.data1 = KEY_NULL;
|
|
||||||
break;
|
|
||||||
case VK_SHIFT:
|
|
||||||
ev.data1 = KEY_LSHIFT;
|
|
||||||
break;
|
|
||||||
case VK_RETURN:
|
|
||||||
entering_con_command = false;
|
|
||||||
// Fall through.
|
|
||||||
default:
|
|
||||||
ev.data1 = MapVirtualKey(input.Event.KeyEvent.wVirtualKeyCode,2); // convert in to char
|
|
||||||
}
|
|
||||||
if (co != INVALID_HANDLE_VALUE && GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &t))
|
|
||||||
{
|
|
||||||
if (ev.data1 && ev.data1 != KEY_LSHIFT && ev.data1 != KEY_RSHIFT)
|
|
||||||
{
|
|
||||||
#ifdef _UNICODE
|
|
||||||
WriteConsole(co, &input.Event.KeyEvent.uChar.UnicodeChar, 1, &t, NULL);
|
|
||||||
#else
|
|
||||||
WriteConsole(co, &input.Event.KeyEvent.uChar.AsciiChar, 1 , &t, NULL);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (input.Event.KeyEvent.wVirtualKeyCode == VK_BACK
|
|
||||||
&& GetConsoleScreenBufferInfo(co,&CSBI))
|
|
||||||
{
|
|
||||||
WriteConsoleOutputCharacterA(co, " ",1, CSBI.dwCursorPosition, &t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ev.type = ev_keyup;
|
|
||||||
switch (input.Event.KeyEvent.wVirtualKeyCode)
|
|
||||||
{
|
|
||||||
case VK_SHIFT:
|
|
||||||
ev.data1 = KEY_LSHIFT;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ev.data1) D_PostEvent(&ev);
|
|
||||||
break;
|
break;
|
||||||
case MOUSE_EVENT:
|
case MOUSE_EVENT:
|
||||||
case WINDOW_BUFFER_SIZE_EVENT:
|
case WINDOW_BUFFER_SIZE_EVENT:
|
||||||
|
|
Loading…
Reference in a new issue