mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2026-02-04 09:09:09 +00:00
feat(console): hardware detection et cetera
This commit is contained in:
parent
97bbe2ea66
commit
31f215ea14
118 changed files with 4059 additions and 1931 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue