vte: implement cursor keys
In cursor-key-mode reset we send the normal CSI sequences, again encoded with C0 codes as C1 codes are nonsense in UTF8. In cursor-key-mode set we use the SS3 codes instead. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
8157556602
commit
a3d5eef70e
32
src/vte.c
32
src/vte.c
@ -104,6 +104,9 @@ enum parser_action {
|
|||||||
/* max CSI arguments */
|
/* max CSI arguments */
|
||||||
#define CSI_ARG_MAX 16
|
#define CSI_ARG_MAX 16
|
||||||
|
|
||||||
|
/* terminal flags */
|
||||||
|
#define FLAG_CURSOR_KEY_MODE 0x01
|
||||||
|
|
||||||
struct kmscon_vte {
|
struct kmscon_vte {
|
||||||
unsigned long ref;
|
unsigned long ref;
|
||||||
struct kmscon_console *con;
|
struct kmscon_console *con;
|
||||||
@ -116,6 +119,7 @@ struct kmscon_vte {
|
|||||||
int csi_argv[CSI_ARG_MAX];
|
int csi_argv[CSI_ARG_MAX];
|
||||||
|
|
||||||
struct font_char_attr cattr;
|
struct font_char_attr cattr;
|
||||||
|
unsigned int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
int kmscon_vte_new(struct kmscon_vte **out, struct kmscon_console *con)
|
int kmscon_vte_new(struct kmscon_vte **out, struct kmscon_console *con)
|
||||||
@ -1114,6 +1118,34 @@ int kmscon_vte_handle_keyboard(struct kmscon_vte *vte,
|
|||||||
*u8 = "\e[6~";
|
*u8 = "\e[6~";
|
||||||
*len = 4;
|
*len = 4;
|
||||||
return KMSCON_VTE_SEND;
|
return KMSCON_VTE_SEND;
|
||||||
|
case XK_Up:
|
||||||
|
if (vte->flags & FLAG_CURSOR_KEY_MODE)
|
||||||
|
*u8 = "\eOA";
|
||||||
|
else
|
||||||
|
*u8 = "\e[A";
|
||||||
|
*len = 3;
|
||||||
|
return KMSCON_VTE_SEND;
|
||||||
|
case XK_Down:
|
||||||
|
if (vte->flags & FLAG_CURSOR_KEY_MODE)
|
||||||
|
*u8 = "\eOB";
|
||||||
|
else
|
||||||
|
*u8 = "\e[B";
|
||||||
|
*len = 3;
|
||||||
|
return KMSCON_VTE_SEND;
|
||||||
|
case XK_Right:
|
||||||
|
if (vte->flags & FLAG_CURSOR_KEY_MODE)
|
||||||
|
*u8 = "\eOC";
|
||||||
|
else
|
||||||
|
*u8 = "\e[C";
|
||||||
|
*len = 3;
|
||||||
|
return KMSCON_VTE_SEND;
|
||||||
|
case XK_Left:
|
||||||
|
if (vte->flags & FLAG_CURSOR_KEY_MODE)
|
||||||
|
*u8 = "\eOD";
|
||||||
|
else
|
||||||
|
*u8 = "\e[D";
|
||||||
|
*len = 3;
|
||||||
|
return KMSCON_VTE_SEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ev->unicode != UTERM_INPUT_INVALID) {
|
if (ev->unicode != UTERM_INPUT_INVALID) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user