Commit: f1055209d9732ffa0e2cb06054bf4b1dbeb8fb7b
Parent: c86265503880612d85f924f794061aea978a8d25
Author: Randy Palamar
Date:   Sun,  7 Jul 2024 12:00:10 -0600
insert/replace mode and app cursor keys
Diffstat:
2 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/terminal.c b/terminal.c
@@ -255,6 +255,10 @@ set_mode(Term *t, CSI *csi, b32 set)
 	for (i32 i = 0; i < csi->argc; i++) {
 		i32 arg = (csi->argv[i]) | ((csi->priv & 1) << 30);
 		switch (arg) {
+		case 4: /* IRM: Insert/Replace Mode */
+			if (set) t->mode |=  TM_REPLACE;
+			else     t->mode &= ~TM_REPLACE;
+			break;
 		case PRIV(1): /* DECCKM: use application cursor keys */
 			if (set) t->gl.mode |=  WIN_MODE_APPCURSOR;
 			else     t->gl.mode &= ~WIN_MODE_APPCURSOR;
diff --git a/vtgl.c b/vtgl.c
@@ -322,6 +322,34 @@ key_callback(GLFWwindow *win, i32 key, i32 sc, i32 act, i32 mods)
 	case ENCODE_KEY(GLFW_REPEAT, 0, GLFW_KEY_BACKSPACE):
 		os_child_put_char(t->child, 0x7F);
 		break;
+	case ENCODE_KEY(GLFW_PRESS,  0, GLFW_KEY_UP):
+	case ENCODE_KEY(GLFW_REPEAT, 0, GLFW_KEY_UP):
+		if (t->gl.mode & WIN_MODE_APPCURSOR)
+			os_child_put_s8(t->child, s8("\x1BOA"));
+		else
+			os_child_put_s8(t->child, s8("\x1B[A"));
+		break;
+	case ENCODE_KEY(GLFW_PRESS,  0, GLFW_KEY_DOWN):
+	case ENCODE_KEY(GLFW_REPEAT, 0, GLFW_KEY_DOWN):
+		if (t->gl.mode & WIN_MODE_APPCURSOR)
+			os_child_put_s8(t->child, s8("\x1BOB"));
+		else
+			os_child_put_s8(t->child, s8("\x1B[B"));
+		break;
+	case ENCODE_KEY(GLFW_PRESS,  0, GLFW_KEY_RIGHT):
+	case ENCODE_KEY(GLFW_REPEAT, 0, GLFW_KEY_RIGHT):
+		if (t->gl.mode & WIN_MODE_APPCURSOR)
+			os_child_put_s8(t->child, s8("\x1BOC"));
+		else
+			os_child_put_s8(t->child, s8("\x1B[C"));
+		break;
+	case ENCODE_KEY(GLFW_PRESS,  0, GLFW_KEY_LEFT):
+	case ENCODE_KEY(GLFW_REPEAT, 0, GLFW_KEY_LEFT):
+		if (t->gl.mode & WIN_MODE_APPCURSOR)
+			os_child_put_s8(t->child, s8("\x1BOD"));
+		else
+			os_child_put_s8(t->child, s8("\x1B[D"));
+		break;
 	}
 }