From cc3d8b22a4d7c7536460af955306febeab4915c0 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Tue, 29 May 2012 14:35:49 +0200 Subject: [PATCH] vte: implement SM/RM 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 --- src/vte.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/vte.c b/src/vte.c index 9ee44cc..91dd9bd 100644 --- 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); }