From: Matthew Mondor Date: Sun, 9 Mar 2025 03:11:25 +0000 (+0000) Subject: AnalogTerm2: Add DEC Private Mode application cursor keys switch (DECCKM). X-Git-Url: http://git.pulsar-zone.net/?a=commitdiff_plain;h=11decdabafd9b80b9816415dd196f19359eb092c;p=mmondor.git AnalogTerm2: Add DEC Private Mode application cursor keys switch (DECCKM). --- diff --git a/mmsoftware/analogterm2/src/main.c b/mmsoftware/analogterm2/src/main.c index 1b934aa..69378af 100644 --- a/mmsoftware/analogterm2/src/main.c +++ b/mmsoftware/analogterm2/src/main.c @@ -143,7 +143,7 @@ x11_process(screen_t *screen, tty_t *ttys, state_t *state) draw_update(screen); break; case KeyPress: - screen_handlekey(&event.xkey, ttys->ptyfd); + screen_handlekey(state, &event.xkey, ttys->ptyfd); break; case KeyRelease: /* We seem to be getting some despite the mask */ diff --git a/mmsoftware/analogterm2/src/screen.c b/mmsoftware/analogterm2/src/screen.c index 6d529fa..613e16e 100644 --- a/mmsoftware/analogterm2/src/screen.c +++ b/mmsoftware/analogterm2/src/screen.c @@ -427,13 +427,13 @@ write_utf8_char(int fd, unsigned char c) void -screen_handlekey(XKeyEvent *k, int ptyfd) +screen_handlekey(state_t *st, XKeyEvent *k, int ptyfd) { KeySym keysym = 0; unsigned char c = 0; uint32_t uc = 0; const char *send = NULL; - bool swapped = false; + bool swapped = false, app = st->application_mode; if (cfg_cursorinputreset) @@ -466,25 +466,31 @@ screen_handlekey(XKeyEvent *k, int ptyfd) send = kv(k->state, "\033[3~", "\033[3;2~", "\033[3;5~", "\033[3;6~"); break; - case XK_Home: + case XK_Begin: + case XK_Home: /* FALLTHROUGH */ send = kv(k->state, - "\033OH", "\033[1;2H", "\033[1;5H", "\033[1;6H"); + (app ? "\033OH" : "\033[H"), "\033[1;2H", "\033[1;5H", + "\033[1;6H"); break; case XK_Left: send = kv(k->state, - "\033OD", "\033[1;2D", "\033[1;5D", "\033[1;6D"); + (app ? "\033OD" : "\033[D"), "\033[1;2D", "\033[1;5D", + "\033[1;6D"); break; case XK_Up: send = kv(k->state, - "\033OA", "\033[1;2A", "\033[1;5A", "\033[1;6A"); + (app ? "\033OA" : "\033[A"), "\033[1;2A", "\033[1;5A", + "\033[1;6A"); break; case XK_Right: send = kv(k->state, - "\033OC", "\033[1;2C", "\033[1;5C", "\033[1;6C"); + (app ? "\033OC" : "\033[C"), "\033[1;2C", "\033[1;5C", + "\033[1;6C"); break; case XK_Down: send = kv(k->state, - "\033OB", "\033[1;2B", "\033[1;5B", "\033[1;6B"); + (app ? "\033OB" : "\033[B"), "\033[1;2B", "\033[1;5B", + "\033[1;6B"); break; case XK_Page_Up: send = kv(k->state, @@ -496,11 +502,8 @@ screen_handlekey(XKeyEvent *k, int ptyfd) break; case XK_End: send = kv(k->state, - "\033OF", "\033[1;2F", "\033[1;5F", "\033[1;6F"); - break; - case XK_Begin: - send = kv(k->state, - "\033[H", "\033[1;2H", "\033[1;5H", "\033[1;6H"); + (app ? "\033OF" : "\033[F"), "\033[1;2F", "\033[1;5F", + "\033[1;6F"); break; case XK_Tab: send = kv(k->state, @@ -598,15 +601,15 @@ screen_handlekey(XKeyEvent *k, int ptyfd) break; case XK_KP_Up: send = kv(k->state, - "\033OA", "8", "\033[1;5A", "8"); + (app ? "\033OA" : "\033[A"), "8", "\033[1;5A", "8"); break; case XK_KP_Right: send = kv(k->state, - "\033OC", "6", "\033[1;5C", "6"); + (app ? "\033OC" : "\033[C"), "6", "\033[1;5C", "6"); break; case XK_KP_Down: send = kv(k->state, - "\033OB", "2", "\033[1;5B", "2"); + (app ? "\033OB" : "\033[B"), "2", "\033[1;5B", "2"); break; case XK_KP_Page_Up: send = kv(k->state, @@ -618,12 +621,12 @@ screen_handlekey(XKeyEvent *k, int ptyfd) break; case XK_KP_End: send = kv(k->state, - "\033OF", "1", "\033[1;5F", "1"); + (app ? "\033OF" : "\033[F"), "1", "\033[1;5F", "1"); break; case XK_KP_Begin: case XK_KP_Home: /* FALLTHROUGH */ send = kv(k->state, - "\033[H", "7", "\033[1;5H", "7"); + (app ? "\033OH" : "\033[H"), "7", "\033[1;5H", "7"); break; } if (send != NULL) diff --git a/mmsoftware/analogterm2/src/screen.h b/mmsoftware/analogterm2/src/screen.h index ab5d32d..a3883e4 100644 --- a/mmsoftware/analogterm2/src/screen.h +++ b/mmsoftware/analogterm2/src/screen.h @@ -71,7 +71,7 @@ struct screen_s { screen_t *screen_init(void); -void screen_handlekey(XKeyEvent *, int); +void screen_handlekey(state_t *, XKeyEvent *, int); void screen_select_start(state_t *, XButtonEvent *); void screen_select_end(state_t *, XButtonEvent *); void screen_select_adjust(state_t *, XMotionEvent *); diff --git a/mmsoftware/analogterm2/src/state.c b/mmsoftware/analogterm2/src/state.c index d65a238..d831091 100644 --- a/mmsoftware/analogterm2/src/state.c +++ b/mmsoftware/analogterm2/src/state.c @@ -287,6 +287,7 @@ state_reset(state_t *st) st->cursor_bright = cfg_cursorbright; st->quotedpaste = false; st->reverse_video = false; + st->application_mode = false; st->reverse_video_timer = 0; st->monocolor = cfg_color; st->mode = 0; @@ -1129,6 +1130,9 @@ state_emul_printc(state_t *st, uint8_t c) } for (i = 0; i <= state->curparam; i++) { switch (state->csiparam[i]) { + case 1: /* Applic. mode curs. keys (DECCKM) */ + st->application_mode = true; + break; case 4: /* Smooth (slow) scroll (DECSCLM) */ st->scroll_slow = true; break; @@ -1456,6 +1460,9 @@ endh: } for (i = 0; i <= state->curparam; i++) { switch (state->csiparam[i]) { + case 1: /* Applic. mode curs. keys (DECCKM) */ + st->application_mode = false; + break; case 4: /* Fast/jump scroll (DECSCLM) */ st->scroll_slow = false; break; diff --git a/mmsoftware/analogterm2/src/state.h b/mmsoftware/analogterm2/src/state.h index faf9b3f..71a019a 100644 --- a/mmsoftware/analogterm2/src/state.h +++ b/mmsoftware/analogterm2/src/state.h @@ -81,6 +81,7 @@ struct state_s { bool text_blink; bool quotedpaste; bool reverse_video; + bool application_mode; int reverse_video_timer; int monocolor; int cursor_mode, cursor_x, cursor_y;