From d6c50d9b8fff0e6b1e08f1ae5c4d7410d24122b7 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Mon, 28 May 2012 15:18:45 +0200 Subject: [PATCH] vte: handle KeyPad/NumPad keys This adds handlers for all the special keys on numpads/keypads. Signed-off-by: David Herrmann --- src/vte.c | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 205 insertions(+), 4 deletions(-) diff --git a/src/vte.c b/src/vte.c index 6af41b9..294335d 100644 --- a/src/vte.c +++ b/src/vte.c @@ -106,6 +106,7 @@ enum parser_action { /* terminal flags */ #define FLAG_CURSOR_KEY_MODE 0x01 +#define FLAG_KEYPAD_APPLICATION_MODE 0x02 /* TODO: toggle on numlock? */ #define FLAG_LINE_FEED_NEW_LINE_MODE 0x04 struct kmscon_vte { @@ -1095,11 +1096,21 @@ int kmscon_vte_handle_keyboard(struct kmscon_vte *vte, *u8 = "\x1b"; *len = 1; return KMSCON_VTE_SEND; - case XK_Return: case XK_KP_Enter: - /* TODO: im CR/LF mode send \x0d\x0a */ - *u8 = "\x0d"; - *len = 1; + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOM"; + *len = 3; + return KMSCON_VTE_SEND; + } + /* fallthrough */ + case XK_Return: + if (vte->flags & FLAG_LINE_FEED_NEW_LINE_MODE) { + *u8 = "\x0d\x0a"; + *len = 2; + } else { + *u8 = "\x0d"; + *len = 1; + } return KMSCON_VTE_SEND; case XK_Insert: *u8 = "\e[2~"; @@ -1145,6 +1156,196 @@ int kmscon_vte_handle_keyboard(struct kmscon_vte *vte, *u8 = "\e[D"; *len = 3; return KMSCON_VTE_SEND; + case XK_KP_Insert: + case XK_KP_0: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOp"; + *len = 3; + } else { + *u8 = "0"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_End: + case XK_KP_1: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOq"; + *len = 3; + } else { + *u8 = "1"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Down: + case XK_KP_2: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOr"; + *len = 3; + } else { + *u8 = "2"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Page_Down: + case XK_KP_3: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOs"; + *len = 3; + } else { + *u8 = "3"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Left: + case XK_KP_4: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOt"; + *len = 3; + } else { + *u8 = "4"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Begin: + case XK_KP_5: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOu"; + *len = 3; + } else { + *u8 = "5"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Right: + case XK_KP_6: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOv"; + *len = 3; + } else { + *u8 = "6"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Home: + case XK_KP_7: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOw"; + *len = 3; + } else { + *u8 = "7"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Up: + case XK_KP_8: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOx"; + *len = 3; + } else { + *u8 = "8"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Page_Up: + case XK_KP_9: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOy"; + *len = 3; + } else { + *u8 = "9"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Subtract: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOm"; + *len = 3; + } else { + *u8 = "-"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Separator: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOl"; + *len = 3; + } else { + *u8 = ","; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Delete: + case XK_KP_Decimal: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOn"; + *len = 3; + } else { + *u8 = "."; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Equal: + case XK_KP_Divide: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOj"; + *len = 3; + } else { + *u8 = "/"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Multiply: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOo"; + *len = 3; + } else { + *u8 = "*"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_Add: + if (vte->flags & FLAG_KEYPAD_APPLICATION_MODE) { + *u8 = "\eOk"; + *len = 3; + } else { + *u8 = "+"; + *len = 1; + } + return KMSCON_VTE_SEND; + case XK_KP_F1: + *u8 = "\eOP"; + *len = 3; + return KMSCON_VTE_SEND; + case XK_KP_F2: + *u8 = "\eOQ"; + *len = 3; + return KMSCON_VTE_SEND; + case XK_KP_F3: + *u8 = "\eOR"; + *len = 3; + return KMSCON_VTE_SEND; + case XK_KP_F4: + *u8 = "\eOS"; + *len = 3; + return KMSCON_VTE_SEND; + case XK_KP_Space: + *u8 = " "; + *len = 1; + return KMSCON_VTE_SEND; + case XK_Home: + if (vte->flags & FLAG_CURSOR_KEY_MODE) + *u8 = "\eOH"; + else + *u8 = "\e[H"; + *len = 3; + return KMSCON_VTE_SEND; + case XK_End: + if (vte->flags & FLAG_CURSOR_KEY_MODE) + *u8 = "\eOF"; + else + *u8 = "\e[F"; + *len = 3; + return KMSCON_VTE_SEND; } if (ev->unicode != UTERM_INPUT_INVALID) { -- 2.7.4