feat(console): hardware detection et cetera

This commit is contained in:
phaneron 2025-04-12 04:35:49 -04:00
parent 97bbe2ea66
commit 31f215ea14
118 changed files with 4059 additions and 1931 deletions

View file

@ -1,12 +1,17 @@
#include <cstdint>
#include <storm/String.hpp>
#include "console/Handlers.hpp"
#include "console/Line.hpp"
#include "console/Console.hpp"
#include "console/Command.hpp"
#include "console/Screen.hpp"
#include "console/Text.hpp"
#include "console/Highlight.hpp"
#include "event/Event.hpp"
#include <cstdint>
#include "event/Types.hpp"
static int32_t s_historyIndex = 0;
#define SHIFT_MODIFIER(data) ((data->metaKeyState & (1 << KEY_LSHIFT) | (1 << KEY_RSHIFT)) != 0)
#define CTRL_MODIFIER(data) ((data->metaKeyState & (1 << KEY_LCONTROL) | (1 << KEY_RCONTROL)) != 0)
namespace {
@ -21,19 +26,22 @@ int32_t OnChar(const EVENT_DATA_CHAR* data, void* param) {
character[0] = char(data->ch);
character[1] = 0;
// TODO: add custom behavior to support non-ASCII commands?
// SUniSPutUTF8(data->ch, character);
PasteInInputLine(character);
ResetHighlight();
return 0;
}
// SUniSPutUTF8(data->ch, character);
return 1;
}
int32_t OnIdle(const EVENT_DATA_IDLE* data, void* param) {
// TODO repeat buffer logic
if (s_repeatCount && (*s_repeatBuffer)) {
ConsoleCommandExecute(s_repeatBuffer, 0);
s_repeatCount--;
}
ConsoleScreenAnimate(data->elapsedSec);
@ -58,71 +66,108 @@ int32_t OnKeyDown(const EVENT_DATA_KEY* data, void* param) {
return 1;
}
auto anyControl = (1 << KEY_LCONTROL) | (1 << KEY_RCONTROL);
auto line = GetInputLine();
auto lineptr = GetInputLine();
switch (data->key) {
case KEY_ESCAPE:
if (line->inputpos < line->inputstart || line->inputpos == line->inputstart) {
if (lineptr->inputstart < lineptr->inputpos) {
ConsoleSetActive(0);
} else {
line->inputpos = line->inputstart;
line->chars = line->inputstart;
line->buffer[line->inputstart] = '\0';
SetInputString(line->buffer);
lineptr->inputpos = lineptr->inputstart;
lineptr->chars = lineptr->inputstart;
lineptr->buffer[lineptr->inputstart] = '\0';
SetInputString(lineptr->buffer);
}
break;
case KEY_PAGEUP:
MoveLinePtr(1, data->metaKeyState);
break;
case KEY_PAGEDOWN:
MoveLinePtr(0, data->metaKeyState);
break;
case KEY_ENTER:
if (line->inputstart <= line->inputpos && line->inputpos != line->inputstart) {
line->inputpos = 0;
GenerateNodeString(line);
ConsoleCommandExecute(line->buffer + line->inputstart, 1);
s_historyIndex = -1;
}
break;
case KEY_HOME:
break;
case KEY_END:
break;
case KEY_C:
if (data->metaKeyState & anyControl) {
CutHighlightToClipboard();
if (CTRL_MODIFIER(data)) {
CopyHighlightToClipboard();
}
break;
case KEY_V:
if (data->metaKeyState & anyControl) {
PasteClipboardToHighlight();
if (CTRL_MODIFIER(data)) {
PasteClipboardInInputLine();
}
break;
case KEY_ENTER:
if (lineptr->inputstart < lineptr->inputpos) {
lineptr->inputpos = 0;
GenerateNodeString(lineptr);
ConsoleCommandExecute(lineptr->buffer + lineptr->inputstart, 1);
s_historyIndex = -1;
}
break;
case KEY_BACKSPACE:
lineptr->Backspace();
break;
case KEY_TAB:
if (s_completionMode == 0) {
s_completedCmd = nullptr;
s_completionMode = 1;
SStrCopy(s_partial, lineptr->buffer + lineptr->inputstart, STORM_MAX_STR);
}
if (ConsoleCommandComplete(s_partial, &s_completedCmd, SHIFT_MODIFIER(data))) {
MakeCommandCurrent(lineptr, s_completedCmd);
}
SetInputString(lineptr->buffer);
break;
case KEY_LEFT:
if (line->inputstart <= line->inputpos && line->inputpos != line->inputstart) {
line->inputpos--;
if (lineptr->inputstart < lineptr->inputpos) {
lineptr->inputpos--;
}
break;
case KEY_UP:
lineptr->Up();
break;
case KEY_RIGHT:
if (line->inputpos < line->chars) {
line->inputpos++;
if (lineptr->inputpos < lineptr->chars) {
lineptr->inputpos++;
}
break;
case KEY_BACKSPACE:
BackspaceLine(line);
case KEY_DOWN:
lineptr->Down();
break;
case KEY_DELETE:
lineptr->Delete();
break;
case KEY_HOME:
if (CTRL_MODIFIER(data)) {
s_currlineptr = s_linelist.Tail();
} else {
if (lineptr->inputpos > lineptr->inputstart) {
lineptr->inputpos = lineptr->inputstart;
}
}
break;
case KEY_END:
if (CTRL_MODIFIER(data)) {
s_currlineptr = s_linelist.Head();
} else {
if (lineptr->inputpos < lineptr->chars) {
lineptr->inputpos = lineptr->chars;
}
}
break;
case KEY_PAGEUP:
MoveLinePtr(1, SHIFT_MODIFIER(data));
break;
case KEY_PAGEDOWN:
MoveLinePtr(0, SHIFT_MODIFIER(data));
break;
default:
break;
}
if (data->key != KEY_TAB && data->key != KEY_LSHIFT && data->key != KEY_RSHIFT && data->key != KEY_LALT && data->key != KEY_RALT && !(data->metaKeyState & anyControl)) {
// s_completionMode = 0;
if (data->key != KEY_TAB
&& data->key != KEY_LSHIFT
&& data->key != KEY_RSHIFT
&& data->key != KEY_LALT
&& data->key != KEY_RALT
&& !(CTRL_MODIFIER(data))) {
s_completionMode = 0;
ResetHighlight();
}
// TODO
return 0;
}
@ -132,34 +177,52 @@ int32_t OnKeyDownRepeat(const EVENT_DATA_KEY* data, void* param) {
return 0;
}
auto anyControl = (1 << KEY_LCONTROL) | (1 << KEY_RCONTROL);
if (EventIsKeyDown(ConsoleGetHotKey()) || !ConsoleGetActive()) {
return 1;
}
auto line = GetInputLine();
auto lineptr = GetInputLine();
switch (data->key) {
case KEY_PAGEUP:
MoveLinePtr(1, data->metaKeyState);
break;
case KEY_PAGEDOWN:
MoveLinePtr(0, data->metaKeyState);
case KEY_BACKSPACE:
lineptr->Backspace();
break;
case KEY_LEFT:
if (line->inputstart <= line->inputpos && line->inputpos != line->inputstart) {
line->inputpos--;
if (lineptr->inputstart < lineptr->inputpos) {
lineptr->inputpos--;
}
break;
case KEY_UP:
lineptr->Up();
break;
case KEY_RIGHT:
if (line->inputpos < line->chars) {
line->inputpos++;
if (lineptr->inputstart < lineptr->inputpos) {
lineptr->inputpos++;
}
break;
case KEY_BACKSPACE:
BackspaceLine(line);
case KEY_DOWN:
lineptr->Down();
break;
case KEY_DELETE:
lineptr->Delete();
break;
case KEY_PAGEUP:
MoveLinePtr(1, SHIFT_MODIFIER(data));
break;
case KEY_PAGEDOWN:
MoveLinePtr(0, SHIFT_MODIFIER(data));
break;
default:
break;
}
if (data->key != KEY_TAB && data->key != KEY_LSHIFT && data->key != KEY_RSHIFT && data->key != KEY_LALT && data->key != KEY_RALT && !(data->metaKeyState & anyControl)) {
// s_completionMode = 0;
if (data->key != KEY_TAB
&& data->key != KEY_LSHIFT
&& data->key != KEY_RSHIFT
&& data->key != KEY_LALT
&& data->key != KEY_RALT
&& !(CTRL_MODIFIER(data))) {
s_completionMode = 0;
ResetHighlight();
}
@ -167,51 +230,50 @@ int32_t OnKeyDownRepeat(const EVENT_DATA_KEY* data, void* param) {
}
int32_t OnKeyUp(const EVENT_DATA_KEY* data, void* param) {
// TODO
return 1;
if (data->key == ConsoleGetHotKey()) {
if (ConsoleAccessGetEnabled()) {
return 0;
}
}
return !ConsoleGetActive();
}
int32_t OnMouseDown(const EVENT_DATA_MOUSE* data, void* param) {
auto consoleHeight = ConsoleGetHeight();
auto fontHeight = ConsoleGetFontHeight();
if (EventIsKeyDown(ConsoleGetHotKey()) || !ConsoleGetActive() || (1.0f - consoleHeight) > data->y) {
if (EventIsKeyDown(ConsoleGetHotKey()) || !ConsoleGetActive() || (1.0f - s_consoleHeight) > data->y) {
return 1;
}
float clickPos = 1.0f - data->y;
if (clickPos < (std::min(consoleHeight, 1.0f) - (fontHeight * 0.75f)) || clickPos > consoleHeight) {
if (clickPos < (std::min(s_consoleHeight, 1.0f) - (s_fontHeight * 0.75f)) || clickPos > s_consoleHeight) {
ResetHighlight();
auto line = GetLineAtMousePosition(data->y);
auto lineptr = GetLineAtMousePosition(data->y);
if (line) {
SetHighlightCopyText(line->buffer);
SetHighlightState(HS_HIGHLIGHTING);
if (lineptr) {
SStrCopy(s_copyText, lineptr->buffer, CONSOLE_HIGHLIGHT_CLIPBOARD_SIZE);
s_highlightState = HS_HIGHLIGHTING;
float v7 = 1.0f - (consoleHeight - (fontHeight * 0.75f) - (fontHeight) - ((consoleHeight - clickPos) / fontHeight - 1.0) * fontHeight);
float v7 = 1.0f - (s_consoleHeight - (s_fontHeight * 0.75f) - (s_fontHeight) - ((s_consoleHeight - clickPos) / s_fontHeight - 1.0) * s_fontHeight);
auto hRect = GetHighlightRect();
s_hRect.bottom = v7;
s_hRect.top = v7 - s_fontHeight;
hRect.bottom = v7;
hRect.top = v7 - fontHeight;
SetHighlightStart(v7);
SetHighlightEnd(v7);
s_highlightHStart = v7;
s_highlightHEnd = v7;
UpdateHighlight();
return 0;
}
ResetHighlightCopyText();
s_copyText[0] = '\0';
return 0;
}
ResetHighlight();
ConsoleSetResizeState(CS_STRETCH);
s_consoleResizeState = CS_STRETCH;
return 1;
}
@ -221,16 +283,16 @@ int32_t OnMouseMove(const EVENT_DATA_MOUSE* data, void* param) {
return 1;
}
if (ConsoleGetResizeState() == CS_STRETCH) {
auto newHeight = std::max(1.0f - data->y, ConsoleGetFontHeight());
ConsoleSetHeight(newHeight);
} else if ((1.0f - ConsoleGetHeight()) > data->y) {
if (s_consoleResizeState == CS_STRETCH) {
auto newHeight = std::max(1.0f - data->y, s_fontHeight);
s_consoleHeight = newHeight;
} else if ((1.0f - s_consoleHeight) > data->y) {
return 1;
}
SetHighlightEnd(data->x);
s_highlightHEnd = data->x;
if (GetHighlightState() == HS_HIGHLIGHTING) {
if (s_highlightState == HS_HIGHLIGHTING) {
UpdateHighlight();
}
@ -242,8 +304,8 @@ int32_t OnMouseUp(const EVENT_DATA_MOUSE* data, void* param) {
return 1;
}
SetHighlightState(HS_ENDHIGHLIGHT);
ConsoleSetResizeState(CS_NONE);
s_highlightState = HS_ENDHIGHLIGHT;
s_consoleResizeState = CS_NONE;
return 1;
}