vte: implement SM/RM
authorDavid Herrmann <dh.herrmann@googlemail.com>
Tue, 29 May 2012 12:35:49 +0000 (14:35 +0200)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Tue, 29 May 2012 12:35:49 +0000 (14:35 +0200)
SM/RM - SetMode/ResetMode are used to explicitely set terminal modes. DEC
private modes and ANSI modes are separated as defined by VT220.

We currently only parse modes that we actually support. Further modes may
follow.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
src/vte.c

index 9ee44cc..91dd9bd 100644 (file)
--- a/src/vte.c
+++ b/src/vte.c
@@ -771,6 +771,43 @@ static void csi_compat_mode(struct kmscon_vte *vte)
        }
 }
 
+static inline void set_reset_flag(struct kmscon_vte *vte, bool set,
+                                 unsigned int flag)
+{
+       if (set)
+               vte->flags |= flag;
+       else
+               vte->flags &= ~flag;
+}
+
+static void csi_mode(struct kmscon_vte *vte, bool set)
+{
+       unsigned int i;
+
+       for (i = 0; i < CSI_ARG_MAX; ++i) {
+               switch (vte->csi_argv[i]) {
+               case 20: /* LNM */
+                       set_reset_flag(vte, set, FLAG_LINE_FEED_NEW_LINE_MODE);
+                       continue;
+               }
+
+               if (!(vte->csi_flags & CSI_WHAT)) {
+                       log_debug("unknown non-DEC (Re)Set-Mode %d",
+                                 vte->csi_argv[i]);
+                       continue;
+               }
+
+               switch (vte->csi_argv[i]) {
+               case 1: /* DECCKM */
+                       set_reset_flag(vte, set, FLAG_CURSOR_KEY_MODE);
+                       continue;
+               default:
+                       log_debug("unknown DEC (Re)Set-Mode %d",
+                                 vte->csi_argv[i]);
+               }
+       }
+}
+
 static void do_csi(struct kmscon_vte *vte, uint32_t data)
 {
        int num;
@@ -846,6 +883,12 @@ static void do_csi(struct kmscon_vte *vte, uint32_t data)
                                csi_compat_mode(vte);
                        }
                        break;
+               case 'h': /* SM: Set Mode */
+                       csi_mode(vte, true);
+                       break;
+               case 'l': /* RM: Reset Mode */
+                       csi_mode(vte, false);
+                       break;
                default:
                        log_debug("unhandled CSI sequence %c", data);
        }