vte: handle KeyPad/NumPad keys

This adds handlers for all the special keys on numpads/keypads.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-05-28 15:18:45 +02:00
parent 0986989ce7
commit d6c50d9b8f

209
src/vte.c
View File

@ -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) {