[+] (NT only) Missing numpad and math keys input under ConsoleStd noncan APIs

[*] Refactor NoncanonicalInput
[*] Fix various keys resort in NUL getting added to ConsoleTTYs input field
[*] Fix multichar right key input (finish TODO note)

[*] Hex grammar: literals may end with 'h' now that i think about it. also added wiresharks seperator. let's continue to simply make sure we cover all forms of hex in a reasonably liberal fashion to account for user input from various human written and software form.

(Nonuniform style of non-hex illegal chars are fine so long as it looks and reads like a legal array of hex characters. Comas must come directly after literals, possible [0x] prefixes are fine, whitespaces too, copy/pasted '[', ']', '{', '}', 'reasonable' new line rejection, etc)
This commit is contained in:
Reece Wilson 2022-12-09 22:59:03 +00:00
parent 39ef196c0a
commit 6dfa806e3a
4 changed files with 99 additions and 34 deletions

View File

@ -13,9 +13,9 @@ namespace Aurora::Console::ConsoleStd
{
ENoncanonicalInput type;
AuString string;
int scrollDeltaY {};
bool isControlSequence {};
bool isAltSequence {};
bool isShiftSequence {};
int iScrollDeltaY {};
bool bIsControlSequence {};
bool bIsAltSequence {};
bool bIsShiftSequence {};
};
}

View File

@ -205,6 +205,10 @@ namespace Aurora::Console::ConsoleStd
NoncanonicalInput canInput {};
canInput.type = ENoncanonicalInput::eInput;
canInput.string = line;
if (auto uMax = ::strnlen(line.data(), line.size()))
{
canInput.string.resize(uMax);
}
SysAssert(AuTryInsert(gCanonicalBuffer, canInput));
canInput.type = ENoncanonicalInput::eEnter;
@ -217,6 +221,10 @@ namespace Aurora::Console::ConsoleStd
NoncanonicalInput canInput {};
canInput.type = ENoncanonicalInput::eInput;
canInput.string = remaining;
if (auto uMax = ::strnlen(remaining.data(), remaining.size()))
{
canInput.string.resize(uMax);
}
SysAssert(AuTryInsert(gCanonicalBuffer, canInput));
}
}
@ -282,7 +290,7 @@ namespace Aurora::Console::ConsoleStd
bool dBreak = false;
NoncanonicalInput canInput;
canInput.type = ENoncanonicalInput::eEnumInvalid;
canInput.scrollDeltaY = 0;
canInput.iScrollDeltaY = 0;
auto &record = records[i];
AuString key;
@ -374,13 +382,58 @@ namespace Aurora::Console::ConsoleStd
case VK_F12:
canInput.type = ENoncanonicalInput::eFunction12;
break;
case VK_NUMPAD0:
case VK_NUMPAD1:
case VK_NUMPAD2:
case VK_NUMPAD3:
case VK_NUMPAD4:
case VK_NUMPAD5:
case VK_NUMPAD6:
case VK_NUMPAD7:
case VK_NUMPAD8:
case VK_NUMPAD9:
{
canInput.type = ENoncanonicalInput::eInput;
canInput.string = '0' + (record.Event.KeyEvent.wVirtualKeyCode - VK_NUMPAD0);
break;
}
case VK_MULTIPLY:
{
canInput.type = ENoncanonicalInput::eInput;
canInput.string = '*';
break;
}
case VK_ADD:
{
canInput.type = ENoncanonicalInput::eInput;
canInput.string = '+';
break;
}
case VK_SUBTRACT:
{
canInput.type = ENoncanonicalInput::eInput;
canInput.string = '-';
break;
}
case VK_DIVIDE:
{
canInput.type = ENoncanonicalInput::eInput;
canInput.string = '/';
break;
}
case VK_DECIMAL:
{
canInput.type = ENoncanonicalInput::eInput;
canInput.string = '.';
break;
}
default:
dBreak = true;
}
canInput.isControlSequence = record.Event.KeyEvent.dwControlKeyState & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED);
canInput.isAltSequence = record.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED);
canInput.isShiftSequence = record.Event.KeyEvent.dwControlKeyState & (SHIFT_PRESSED);
canInput.bIsControlSequence = record.Event.KeyEvent.dwControlKeyState & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED);
canInput.bIsAltSequence = record.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED);
canInput.bIsShiftSequence = record.Event.KeyEvent.dwControlKeyState & (SHIFT_PRESSED);
// TODO: numpad
if (!dBreak || ((record.Event.KeyEvent.wVirtualKeyCode <= VK_HELP &&
@ -402,6 +455,8 @@ namespace Aurora::Console::ConsoleStd
for (z = 0; z < record.Event.KeyEvent.wRepeatCount; z++)
{
key.resize(::strnlen(key.data(), key.size()));
canInput.string += key;
if (key.size())
@ -419,12 +474,12 @@ namespace Aurora::Console::ConsoleStd
if (record.Event.MouseEvent.dwEventFlags == MOUSE_WHEELED)
{
canInput.type = ENoncanonicalInput::eScroll;
canInput.scrollDeltaY = AuStaticCast<AuInt16>(AuBitsToHigher((AuUInt32)record.Event.MouseEvent.dwButtonState));
canInput.iScrollDeltaY = AuStaticCast<AuInt16>(AuBitsToHigher((AuUInt32)record.Event.MouseEvent.dwButtonState));
if (canInput.scrollDeltaY > 1)
canInput.scrollDeltaY = 1;
else if (canInput.scrollDeltaY < -1)
canInput.scrollDeltaY = -1;
if (canInput.iScrollDeltaY > 1)
canInput.iScrollDeltaY = 1;
else if (canInput.iScrollDeltaY < -1)
canInput.iScrollDeltaY = -1;
dBreak = false;
}
else if ((record.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) != 0)
@ -525,6 +580,7 @@ namespace Aurora::Console::ConsoleStd
DWORD idc;
WriteConsoleInputW(gInputStream, niceWorkMicrosoft, 2, &idc);
WriteConsoleInputW(gInputStream, niceWorkMicrosoft, 2, &idc);
return true;
}
@ -1100,8 +1156,8 @@ namespace Aurora::Console::ConsoleStd
auto c = gLineEncodedBuffer[i];
NoncanonicalInput canInput {};
canInput.scrollDeltaY = 0;
canInput.isControlSequence = canInput.isShiftSequence = canInput.isAltSequence = false;
canInput.iScrollDeltaY = 0;
canInput.bIsControlSequence = canInput.bIsControlSequence = canInput.bIsControlSequence = false;
if (c == 127)
{
CanFlushLines();
@ -1138,7 +1194,7 @@ namespace Aurora::Console::ConsoleStd
CanFlushLines();
canInput.type = ENoncanonicalInput::eInput;
canInput.string = 'a' + c - 1;
canInput.isControlSequence = true;
canInput.bIsControlSequence = true;
SysAssert(AuTryInsert(gCanonicalBuffer, canInput));
}
@ -1192,7 +1248,7 @@ namespace Aurora::Console::ConsoleStd
if (next == nestedChar) \
{ \
canInput.type = ENoncanonicalInput::op; \
canInput.isControlSequence = true; \
canInput.bIsControlSequence = true; \
SysAssert(AuTryInsert(gCanonicalBuffer, canInput)); \
} \
} \
@ -1204,8 +1260,8 @@ namespace Aurora::Console::ConsoleStd
if (next == nestedChar) \
{ \
canInput.type = ENoncanonicalInput::op; \
canInput.isShiftSequence = true; \
canInput.isControlSequence = true; \
canInput.bIsShiftSequence = true; \
canInput.bIsControlSequence = true; \
SysAssert(AuTryInsert(gCanonicalBuffer, canInput)); \
} \
} \
@ -1217,7 +1273,7 @@ namespace Aurora::Console::ConsoleStd
if (next == nestedChar) \
{ \
canInput.type = ENoncanonicalInput::op; \
canInput.isShiftSequence = true; \
canInput.bIsShiftSequence = true; \
SysAssert(AuTryInsert(gCanonicalBuffer, canInput)); \
} \
} \
@ -1229,9 +1285,9 @@ namespace Aurora::Console::ConsoleStd
if (next == nestedChar) \
{ \
canInput.type = ENoncanonicalInput::op; \
canInput.isShiftSequence = true; \
canInput.isControlSequence = true; \
canInput.isAltSequence = true; \
canInput.bIsShiftSequence = true; \
canInput.bIsControlSequence = true; \
canInput.bIsAltSequence = true; \
SysAssert(AuTryInsert(gCanonicalBuffer, canInput)); \
} \
} \
@ -1264,13 +1320,13 @@ namespace Aurora::Console::ConsoleStd
if (esc == 'A')
{
canInput.type = ENoncanonicalInput::eScroll;
canInput.scrollDeltaY = 4;
canInput.iScrollDeltaY = 4;
SysAssert(AuTryInsert(gCanonicalBuffer, canInput));
}
else if (esc == 'B')
{
canInput.type = ENoncanonicalInput::eScroll;
canInput.scrollDeltaY = -4;
canInput.iScrollDeltaY = -4;
SysAssert(AuTryInsert(gCanonicalBuffer, canInput));
}
}

View File

@ -204,12 +204,12 @@ namespace Aurora::Console::ConsoleTTY
}
case ConsoleStd::ENoncanonicalInput::eScroll:
{
Scroll(input.scrollDeltaY);
Scroll(input.iScrollDeltaY);
break;
}
default:
{
AuLogDbg("Key Stroke: {}, {}, {}", ConsoleStd::ENoncanonicalInputToString(input.type), input.scrollDeltaY, input.string);
AuLogDbg("Key Stroke: {}, {}, {}", ConsoleStd::ENoncanonicalInputToString(input.type), input.iScrollDeltaY, input.string);
}
};
@ -272,9 +272,10 @@ namespace Aurora::Console::ConsoleTTY
return;
}
// TODO: missing locale API
auto uAddend = AuLocale::Encoding::IterateUTF8({ &this->inputField[this->noncanonicalCursorPosInBytes], this->inputField.size() - this->noncanonicalCursorPosInBytes });
this->noncanonicalCursorPos++;
this->noncanonicalCursorPosInBytes++; // << ILLEGAL
this->noncanonicalCursorPosInBytes += uAddend;
NoncanonicalSetCursor();
}

View File

@ -161,7 +161,7 @@ namespace Aurora::Parse
// Consume array
for (; i < in.size(); )
{
// Consume prefix
// Consume 0x prefix
if ((i + 1) < in.size())
{
if ((in[i] == '0') &&
@ -186,14 +186,22 @@ namespace Aurora::Parse
i += 2;
}
HEX_GRAMMAR_CONSUME_ONE(',');
HEX_GRAMMAR_CONSUME_END_OF_LINE;
if (i < in.size())
{
if ((in[i] == 'h' /*some hex dump code and people prefer FFh over 0xFF*/))
{
i++;
}
}
HEX_GRAMMAR_CONSUME_EITHER(':' /*wireshark and other networking tools*/, ',' /*latin splitter array*/);
HEX_GRAMMAR_CONSUME_END_OF_LINE; // all whitespace [+newline[+all whitespace]]
// Consume end literal hint
if (i < in.size())
{
if ((in[i] == '}') ||
(in[i] == ']'))
if ((in[i] == '}' /*c-like*/) ||
(in[i] == ']' /*more latin array tag*/))
{
break;
}