vte: implement Shift+F4-F20

If Shift is hold while F4 to F20 is pressed, a second parameter is added
to the sent CSI sequence. Implement this according to all other major
terminal emulators. This is no official DEC feature, though.

Thanks to "Etam" for reporting this!

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-09-18 09:44:27 +02:00
parent 92a14e0964
commit 3602b736ff

113
src/vte.c
View File

@ -2474,6 +2474,21 @@ bool kmscon_vte_handle_keyboard(struct kmscon_vte *vte, uint32_t keysym,
else
vte_write(vte, "+", 1);
return true;
case XKB_KEY_Home:
if (vte->flags & FLAG_CURSOR_KEY_MODE)
vte_write(vte, "\eOH", 3);
else
vte_write(vte, "\e[H", 3);
return true;
case XKB_KEY_End:
if (vte->flags & FLAG_CURSOR_KEY_MODE)
vte_write(vte, "\eOF", 3);
else
vte_write(vte, "\e[F", 3);
return true;
case XKB_KEY_KP_Space:
vte_write(vte, " ", 1);
return true;
case XKB_KEY_F1:
case XKB_KEY_KP_F1:
vte_write(vte, "\eOP", 3);
@ -2488,70 +2503,106 @@ bool kmscon_vte_handle_keyboard(struct kmscon_vte *vte, uint32_t keysym,
return true;
case XKB_KEY_F4:
case XKB_KEY_KP_F4:
vte_write(vte, "\eOS", 3);
return true;
case XKB_KEY_KP_Space:
vte_write(vte, " ", 1);
return true;
case XKB_KEY_Home:
if (vte->flags & FLAG_CURSOR_KEY_MODE)
vte_write(vte, "\eOH", 3);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[1;2S", 6);
else
vte_write(vte, "\e[H", 3);
return true;
case XKB_KEY_End:
if (vte->flags & FLAG_CURSOR_KEY_MODE)
vte_write(vte, "\eOF", 3);
else
vte_write(vte, "\e[F", 3);
vte_write(vte, "\eOS", 3);
return true;
case XKB_KEY_F5:
vte_write(vte, "\e[15~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[15;2~", 7);
else
vte_write(vte, "\e[15~", 5);
return true;
case XKB_KEY_F6:
vte_write(vte, "\e[17~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[17;2~", 7);
else
vte_write(vte, "\e[17~", 5);
return true;
case XKB_KEY_F7:
vte_write(vte, "\e[18~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[18;2~", 7);
else
vte_write(vte, "\e[18~", 5);
return true;
case XKB_KEY_F8:
vte_write(vte, "\e[19~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[19;2~", 7);
else
vte_write(vte, "\e[19~", 5);
return true;
case XKB_KEY_F9:
vte_write(vte, "\e[20~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[20;2~", 7);
else
vte_write(vte, "\e[20~", 5);
return true;
case XKB_KEY_F10:
vte_write(vte, "\e[21~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[21;2~", 7);
else
vte_write(vte, "\e[21~", 5);
return true;
case XKB_KEY_F11:
vte_write(vte, "\e[23~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[23;2~", 7);
else
vte_write(vte, "\e[23~", 5);
return true;
case XKB_KEY_F12:
vte_write(vte, "\e[24~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[24;2~", 7);
else
vte_write(vte, "\e[24~", 5);
return true;
case XKB_KEY_F13:
vte_write(vte, "\e[25~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[25;2~", 7);
else
vte_write(vte, "\e[25~", 5);
return true;
case XKB_KEY_F14:
vte_write(vte, "\e[26~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[26;2~", 7);
else
vte_write(vte, "\e[26~", 5);
return true;
case XKB_KEY_F15:
vte_write(vte, "\e[28~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[28;2~", 7);
else
vte_write(vte, "\e[28~", 5);
return true;
case XKB_KEY_F16:
vte_write(vte, "\e[29~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[29;2~", 7);
else
vte_write(vte, "\e[29~", 5);
return true;
case XKB_KEY_F17:
vte_write(vte, "\e[31~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[31;2~", 7);
else
vte_write(vte, "\e[31~", 5);
return true;
case XKB_KEY_F18:
vte_write(vte, "\e[32~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[32;2~", 7);
else
vte_write(vte, "\e[32~", 5);
return true;
case XKB_KEY_F19:
vte_write(vte, "\e[33~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[33;2~", 7);
else
vte_write(vte, "\e[33~", 5);
return true;
case XKB_KEY_F20:
vte_write(vte, "\e[34~", 5);
if (mods & UTERM_SHIFT_MASK)
vte_write(vte, "\e[34;2~", 7);
else
vte_write(vte, "\e[34~", 5);
return true;
}