From: David Herrmann Date: Tue, 29 May 2012 12:35:49 +0000 (+0200) Subject: vte: implement SM/RM X-Git-Tag: kmscon-7~906 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cc3d8b22a4d7c7536460af955306febeab4915c0;p=platform%2Fupstream%2Fkmscon.git 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 --- 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); }