vtgl

terminal emulator implemented in OpenGL
git clone anongit@rnpnr.xyz:vtgl.git
Log | Files | Refs | Feed | LICENSE

Commit: f1055209d9732ffa0e2cb06054bf4b1dbeb8fb7b
Parent: c86265503880612d85f924f794061aea978a8d25
Author: Randy Palamar
Date:   Sun,  7 Jul 2024 12:00:10 -0600

insert/replace mode and app cursor keys

Diffstat:
Mterminal.c | 4++++
Mvtgl.c | 28++++++++++++++++++++++++++++
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; } }