Author: mesyeti <mesyeti@mesyeti.uk>
add application cursor keys
source/interpreter/vt100.c | 51 ++++++++++++++++++++++++++++-----------
diff --git a/source/interpreter/vt100.c b/source/interpreter/vt100.c index 84496a4d64a16e4e2e7733da00aa075931bdbdac..465745b5b7776c9acda15579654f27eb458f3bfa 100644 --- a/source/interpreter/vt100.c +++ b/source/interpreter/vt100.c @@ -30,9 +30,11 @@ // terminal settings bool bracketedPaste; int mouseMode; Vec2 savedCursor; + bool appKeypad; + bool appCursor; } Vt100; -static char* KeyToSequence(Key key) { +static char* KeyToSequence(Vt100* this, Key key) { if ( (key == KEY_LSHIFT) || (key == KEY_RSHIFT) || (key == KEY_LALT) || (key == KEY_LCTRL) || (key == KEY_RCTRL) || @@ -112,34 +114,47 @@ default: return buf; } + const char* control = "\x1b["; + + if (this->appCursor) { + switch (key) { + case KEY_UP: + case KEY_DOWN: + case KEY_RIGHT: + case KEY_LEFT: { + control = "\x1bO"; // SS3 + break; + } + default: break; + } + } + if (vt) { if (mod == 1) { - snprintf(buf, sizeof(buf), "\x1b[%d~", vtCode); + snprintf(buf, sizeof(buf), "%s%d~", control, vtCode); } else { - snprintf(buf, sizeof(buf), "\x1b[%d;%d~", vtCode, mod); + snprintf(buf, sizeof(buf), "%s%d;%d~", control, vtCode, mod); } } else { if (mod == 1) { - snprintf(buf, sizeof(buf), "\x1b[%c", xtermChar); + snprintf(buf, sizeof(buf), "%s%c", control, xtermChar); } else { - snprintf(buf, sizeof(buf), "\x1b[%d%c", mod, xtermChar); + snprintf(buf, sizeof(buf), "%s%d%c", control, mod, xtermChar); } } - - printf("Sending CSI %s\n", &buf[1]); return buf; } static void SendInput(Interpreter* p_this, Terminal* terminal, Event* e) { - (void) p_this; + Vt100* this = (Vt100*) p_this->data; switch (e->type) { case EVENT_KEY_DOWN: { - const char* seq = KeyToSequence(e->key.key); + const char* seq = KeyToSequence(this, e->key.key); for (size_t i = 0; seq[i]; ++ i) { SysTerm_WriteByte(&terminal->term, seq[i]); @@ -506,9 +521,11 @@ for (size_t i = 0; i < num; ++ i) { int param = atoi(parts[i]); switch (param) { - case 9: this->mouseMode = MOUSE_PRESS; break; - case 12: terminal->blinkCursor = true; break; - case 25: terminal->showCursor = true; break; + case 1: this->appCursor = true; break; + case 9: this->mouseMode = MOUSE_PRESS; break; + case 12: terminal->blinkCursor = true; break; + case 25: terminal->showCursor = true; break; + case 66: this->appKeypad = true; break; case 1047: case 47: break; // TODO: show alternate screen buffer case 1000: this->mouseMode = MOUSE_BOTH; break; @@ -537,9 +554,11 @@ for (size_t i = 0; i < num; ++ i) { int param = atoi(parts[i]); switch (param) { - case 9: this->mouseMode = MOUSE_OFF; break; - case 12: terminal->blinkCursor = false; break; - case 25: terminal->showCursor = false; break; + case 1: this->appCursor = false; break; + case 9: this->mouseMode = MOUSE_OFF; break; + case 12: terminal->blinkCursor = false; break; + case 25: terminal->showCursor = false; break; + case 66: this->appKeypad = false; break; case 1047: case 47: break; // TODO: use normal screen buffer case 1000: this->mouseMode = MOUSE_OFF; break; @@ -782,6 +801,8 @@ // terminal settings data->bracketedPaste = false; data->mouseMode = MOUSE_OFF; + data->appKeypad = false; + data->appCursor = false; return (Interpreter) { .data = (void*) data,