yterm

commit 74650508698486e36590b6b22bccf18ff45a78b4

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,