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 <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-05-29 14:35:49 +02:00
parent 25b5a7583c
commit cc3d8b22a4

View File

@ -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);
}