AnalogTerm2: Add DEC Private Mode application cursor keys switch (DECCKM).
authorMatthew Mondor <mmondor@pulsar-zone.net>
Sun, 9 Mar 2025 03:11:25 +0000 (03:11 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Sun, 9 Mar 2025 03:11:25 +0000 (03:11 +0000)
mmsoftware/analogterm2/src/main.c
mmsoftware/analogterm2/src/screen.c
mmsoftware/analogterm2/src/screen.h
mmsoftware/analogterm2/src/state.c
mmsoftware/analogterm2/src/state.h

index 1b934aa..69378af 100644 (file)
@@ -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 */
index 6d529fa..613e16e 100644 (file)
@@ -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)
index ab5d32d..a3883e4 100644 (file)
@@ -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 *);
index d65a238..d831091 100644 (file)
@@ -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;
index faf9b3f..71a019a 100644 (file)
@@ -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;