Add missed key definitions

This patch adds the keys for the keypad (in both modes, application mode or
ansi mode) and function keys. It uses the same convention than xterm and
instead of using the XK_Fxx values it generates them using F1-F12 and
modifiers. For example:

   F1 -> ^[OP
   F1 + Shift = F13 -> ^[[1;2P
   F1 + Control = F25 -> ^[[1;5P
   F1 + Mod2 = F37 -> ^[[1;6P
   F1 + Mod1 = F49 -> ^[[1;3P
   F1 + Mod3 = F61 -> ^[[1;4P

It is also important notice than the terminfo capability kIC (shifted insert
key) only can be generated using the keypad keyboard, because the shorcut
for selection paste is using the same combination.

After this path the number of elements in the Key array becomes high, and
maybe a sequencial search is not enough efficient now.
---
 TODO         |    6 +---
 config.def.h |  102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 st.info      |   70 ++++++++++++++++++++++++++++++++++++++--
 3 files changed, 169 insertions(+), 9 deletions(-)
dev
Roberto E. Vargas Caballero 2012-11-13 20:05:02 +01:00
parent 44597b359e
commit 620e3bb39e
3 changed files with 169 additions and 9 deletions

6
TODO
View File

@ -5,11 +5,7 @@ vt emulation
* color definition in CSI * color definition in CSI
* implement CSI parsing * implement CSI parsing
* make the keypad keys really work * make the keypad keys really work
* kf0 .. kf44 * kel, kfnd, ked, kext
* kend, kel, kent, kfnd, ked, kext
* kNXT, kPRV
* ka1, ka3, kb2
* add arrow keys handling
code & interface code & interface
---------------- ----------------

View File

@ -77,6 +77,49 @@ static unsigned int defaultucs = 257;
/* key, mask, output, keypad, cursor, crlf */ /* key, mask, output, keypad, cursor, crlf */
static Key key[] = { static Key key[] = {
/* keysym mask string keypad cursor crlf */ /* keysym mask string keypad cursor crlf */
{ XK_KP_Home, XK_NO_MOD, "\033[H", 0, 0, 0},
{ XK_KP_Home, ShiftMask, "\033[1;2H", 0, 0, 0},
{ XK_KP_Up, XK_NO_MOD, "\033Ox", +1, 0, 0},
{ XK_KP_Up, XK_NO_MOD, "\033[A", 0, -1, 0},
{ XK_KP_Up, XK_NO_MOD, "\033OA", 0, +1, 0},
{ XK_KP_Down, XK_NO_MOD, "\033Or", +1, 0, 0},
{ XK_KP_Down, XK_NO_MOD, "\033[B", 0, -1, 0},
{ XK_KP_Down, XK_NO_MOD, "\033OB", 0, +1, 0},
{ XK_KP_Left, XK_NO_MOD, "\033Ot", +1, 0, 0},
{ XK_KP_Left, XK_NO_MOD, "\033[D", 0, -1, 0},
{ XK_KP_Left, XK_NO_MOD, "\033OD", 0, +1, 0},
{ XK_KP_Right, XK_NO_MOD, "\033Ov", +1, 0, 0},
{ XK_KP_Right, XK_NO_MOD, "\033[C", 0, -1, 0},
{ XK_KP_Right, XK_NO_MOD, "\033OC", 0, +1, 0},
{ XK_KP_Prior, XK_NO_MOD, "\033[5~", 0, 0, 0},
{ XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0, 0},
{ XK_KP_Begin, XK_NO_MOD, "\033[E", 0, 0, 0},
{ XK_KP_End, XK_NO_MOD, "\033[4~", 0, 0, 0},
{ XK_KP_End, ShiftMask, "\033[1;2F", 0, 0, 0},
{ XK_KP_Next, XK_NO_MOD, "\033[6~", 0, 0, 0},
{ XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0, 0},
{ XK_KP_Insert, XK_NO_MOD, "\033[2~", 0, 0, 0},
{ XK_KP_Insert, ShiftMask, "\033[2;2~", 0, 0, 0},
{ XK_KP_Delete, XK_NO_MOD, "\033[3~", 0, 0, 0},
{ XK_KP_Delete, ShiftMask, "\033[3;2~", 0, 0, 0},
{ XK_KP_Multiply, XK_NO_MOD, "\033Oj", +1, 0, 0},
{ XK_KP_Add, XK_NO_MOD, "\033Ok", +1, 0, 0},
{ XK_KP_Enter, XK_NO_MOD, "\033OM", +1, 0, 0},
{ XK_KP_Enter, XK_NO_MOD, "\n", -1, 0, -1},
{ XK_KP_Enter, XK_NO_MOD, "\r\n", -1, 0, 0},
{ XK_KP_Subtract, XK_NO_MOD, "\033Om", +1, 0, 0},
{ XK_KP_Decimal, XK_NO_MOD, "\033On", +1, 0, 0},
{ XK_KP_Divide, XK_NO_MOD, "\033Oo", +1, 0, 0},
{ XK_KP_0, XK_NO_MOD, "\033Op", +1, 0, 0},
{ XK_KP_1, XK_NO_MOD, "\033Oq", +1, 0, 0},
{ XK_KP_2, XK_NO_MOD, "\033Or", +1, 0, 0},
{ XK_KP_3, XK_NO_MOD, "\033Os", +1, 0, 0},
{ XK_KP_4, XK_NO_MOD, "\033Ot", +1, 0, 0},
{ XK_KP_5, XK_NO_MOD, "\033Ou", +1, 0, 0},
{ XK_KP_6, XK_NO_MOD, "\033Ov", +1, 0, 0},
{ XK_KP_7, XK_NO_MOD, "\033Ow", +1, 0, 0},
{ XK_KP_8, XK_NO_MOD, "\033Ox", +1, 0, 0},
{ XK_KP_9, XK_NO_MOD, "\033Oy", +1, 0, 0},
{ XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0}, { XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0},
{ XK_Up, XK_NO_MOD, "\033[A", 0, -1, 0}, { XK_Up, XK_NO_MOD, "\033[A", 0, -1, 0},
{ XK_Up, XK_NO_MOD, "\033OA", 0, +1, 0}, { XK_Up, XK_NO_MOD, "\033OA", 0, +1, 0},
@ -98,28 +141,85 @@ static Key key[] = {
{ XK_Right, ShiftMask, "\033[1;2C", 0, 0, 0}, { XK_Right, ShiftMask, "\033[1;2C", 0, 0, 0},
{ XK_Right, ControlMask, "\033[1;5C", 0, 0, 0}, { XK_Right, ControlMask, "\033[1;5C", 0, 0, 0},
{ XK_Right, Mod1Mask, "\033[1;3C", 0, 0, 0}, { XK_Right, Mod1Mask, "\033[1;3C", 0, 0, 0},
{ XK_Tab, ShiftMask, "\033[Z", 0, 0, 0},
{ XK_Return, XK_NO_MOD, "\n", 0, 0, -1}, { XK_Return, XK_NO_MOD, "\n", 0, 0, -1},
{ XK_Return, XK_NO_MOD, "\r\n", 0, 0, +1}, { XK_Return, XK_NO_MOD, "\r\n", 0, 0, +1},
{ XK_Return, Mod1Mask, "\033\n", 0, 0, -1}, { XK_Return, Mod1Mask, "\033\n", 0, 0, -1},
{ XK_Return, Mod1Mask, "\033\r\n", 0, 0, +1}, { XK_Return, Mod1Mask, "\033\r\n", 0, 0, +1},
{ XK_Insert, XK_NO_MOD, "\033[2~", 0, 0, 0}, { XK_Insert, XK_NO_MOD, "\033[2~", 0, 0, 0},
{ XK_Insert, ShiftMask, "\033[2;2~", 0, 0, 0},
{ XK_Delete, XK_NO_MOD, "\033[3~", 0, 0, 0}, { XK_Delete, XK_NO_MOD, "\033[3~", 0, 0, 0},
{ XK_Home, XK_NO_MOD, "\033[1~", 0, 0, 0}, { XK_Delete, ShiftMask, "\033[3;2~", 0, 0, 0},
{ XK_Home, XK_NO_MOD, "\033[H", 0, 0, 0},
{ XK_Home, ShiftMask, "\033[1;2H", 0, 0, 0},
{ XK_End, XK_NO_MOD, "\033[4~", 0, 0, 0}, { XK_End, XK_NO_MOD, "\033[4~", 0, 0, 0},
{ XK_End, ShiftMask, "\033[1;2F", 0, 0, 0},
{ XK_Prior, XK_NO_MOD, "\033[5~", 0, 0, 0}, { XK_Prior, XK_NO_MOD, "\033[5~", 0, 0, 0},
{ XK_Next, XK_NO_MOD, "\033[6~", 0, 0, 0}, { XK_Next, XK_NO_MOD, "\033[6~", 0, 0, 0},
{ XK_Next, ShiftMask, "\033[6;2~", 0, 0, 0},
{ XK_F1, XK_NO_MOD, "\033OP" , 0, 0, 0}, { XK_F1, XK_NO_MOD, "\033OP" , 0, 0, 0},
{ XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0, 0},
{ XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0, 0},
{ XK_F1, /* F37 */ Mod2Mask, "\033[1;6P", 0, 0, 0},
{ XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0, 0},
{ XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0, 0},
{ XK_F2, XK_NO_MOD, "\033OQ" , 0, 0, 0}, { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0, 0},
{ XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0, 0},
{ XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0, 0},
{ XK_F2, /* F38 */ Mod2Mask, "\033[1;6Q", 0, 0, 0},
{ XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0, 0},
{ XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0, 0},
{ XK_F3, XK_NO_MOD, "\033OR" , 0, 0, 0}, { XK_F3, XK_NO_MOD, "\033OR" , 0, 0, 0},
{ XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0, 0},
{ XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0, 0},
{ XK_F3, /* F39 */ Mod2Mask, "\033[1;6R", 0, 0, 0},
{ XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0, 0},
{ XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0, 0},
{ XK_F4, XK_NO_MOD, "\033OS" , 0, 0, 0}, { XK_F4, XK_NO_MOD, "\033OS" , 0, 0, 0},
{ XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0, 0},
{ XK_F4, /* F28 */ ShiftMask, "\033[1;5S", 0, 0, 0},
{ XK_F4, /* F40 */ Mod2Mask, "\033[1;6S", 0, 0, 0},
{ XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0, 0},
{ XK_F5, XK_NO_MOD, "\033[15~", 0, 0, 0}, { XK_F5, XK_NO_MOD, "\033[15~", 0, 0, 0},
{ XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0, 0},
{ XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0, 0},
{ XK_F5, /* F41 */ Mod2Mask, "\033[15;6~", 0, 0, 0},
{ XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0, 0},
{ XK_F6, XK_NO_MOD, "\033[17~", 0, 0, 0}, { XK_F6, XK_NO_MOD, "\033[17~", 0, 0, 0},
{ XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0, 0},
{ XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0, 0},
{ XK_F6, /* F42 */ Mod2Mask, "\033[17;6~", 0, 0, 0},
{ XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0, 0},
{ XK_F7, XK_NO_MOD, "\033[18~", 0, 0, 0}, { XK_F7, XK_NO_MOD, "\033[18~", 0, 0, 0},
{ XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0, 0},
{ XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0, 0},
{ XK_F7, /* F43 */ Mod2Mask, "\033[18;6~", 0, 0, 0},
{ XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0, 0},
{ XK_F8, XK_NO_MOD, "\033[19~", 0, 0, 0}, { XK_F8, XK_NO_MOD, "\033[19~", 0, 0, 0},
{ XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0, 0},
{ XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0, 0},
{ XK_F8, /* F44 */ Mod2Mask, "\033[19;6~", 0, 0, 0},
{ XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0, 0},
{ XK_F9, XK_NO_MOD, "\033[20~", 0, 0, 0}, { XK_F9, XK_NO_MOD, "\033[20~", 0, 0, 0},
{ XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0, 0},
{ XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0, 0},
{ XK_F9, /* F45 */ Mod2Mask, "\033[20;6~", 0, 0, 0},
{ XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0, 0},
{ XK_F10, XK_NO_MOD, "\033[21~", 0, 0, 0}, { XK_F10, XK_NO_MOD, "\033[21~", 0, 0, 0},
{ XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0, 0},
{ XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0, 0},
{ XK_F10, /* F46 */ Mod2Mask, "\033[21;6~", 0, 0, 0},
{ XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0, 0},
{ XK_F11, XK_NO_MOD, "\033[23~", 0, 0, 0}, { XK_F11, XK_NO_MOD, "\033[23~", 0, 0, 0},
{ XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0, 0},
{ XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0, 0},
{ XK_F11, /* F47 */ Mod2Mask, "\033[23;6~", 0, 0, 0},
{ XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0, 0},
{ XK_F12, XK_NO_MOD, "\033[24~", 0, 0, 0}, { XK_F12, XK_NO_MOD, "\033[24~", 0, 0, 0},
{ XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0, 0},
{ XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0, 0},
{ XK_F12, /* F48 */ Mod2Mask, "\033[24;6~", 0, 0, 0},
{ XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0, 0},
}; };
/* Internal shortcuts. */ /* Internal shortcuts. */

70
st.info
View File

@ -49,11 +49,24 @@ st| simpleterm,
invis=\E[8m, invis=\E[8m,
is2=\E[4l\E>, is2=\E[4l\E>,
it#8, it#8,
ka1=\E[E,
ka3=\E[5~,
kc1=\E[4~,
kc3=\E[6~,
kbs=\177, kbs=\177,
kcbt=\E[Z,
kb2=\EOu,
kcub1=\EOD, kcub1=\EOD,
kcud1=\EOB, kcud1=\EOB,
kcuf1=\EOC, kcuf1=\EOC,
kcuu1=\EOA, kcuu1=\EOA,
kDC=\E[3;2~,
kent=\EOM,
kEND=\E[1;2F,
kIC=\E[2;2~,
kNXT=\E[6;2~,
kPRV=\E[5;2~,
kHOM=\E[1;2H,
kLFT=\E[1;2D, kLFT=\E[1;2D,
kRIT=\E[1;2C, kRIT=\E[1;2C,
kind=\E[1;2B, kind=\E[1;2B,
@ -61,9 +74,6 @@ st| simpleterm,
kdch1=\E[3~, kdch1=\E[3~,
kich1=\E[2~, kich1=\E[2~,
kend=\E[4~, kend=\E[4~,
kf10=\E[21~,
kf11=\E[23~,
kf12=\E[24~,
kf1=\EOP, kf1=\EOP,
kf2=\EOQ, kf2=\EOQ,
kf3=\EOR, kf3=\EOR,
@ -73,6 +83,60 @@ st| simpleterm,
kf7=\E[18~, kf7=\E[18~,
kf8=\E[19~, kf8=\E[19~,
kf9=\E[20~, kf9=\E[20~,
kf10=\E[21~,
kf11=\E[23~,
kf12=\E[24~,
kf13=\E[1;2P,
kf14=\E[1;2Q,
kf15=\E[1;2R,
kf16=\E[1;2S,
kf17=\E[15;2~,
kf18=\E[17;2~,
kf19=\E[18;2~,
kf20=\E[19;2~,
kf21=\E[20;2~,
kf22=\E[21;2~,
kf23=\E[23;2~,
kf24=\E[24;2~,
kf25=\E[1;5P,
kf26=\E[1;5Q,
kf27=\E[1;5R,
kf28=\E[1;5S,
kf29=\E[15;5~,
kf30=\E[17;5~,
kf31=\E[18;5~,
kf32=\E[19;5~,
kf33=\E[20;5~,
kf34=\E[21;5~,
kf35=\E[23;5~,
kf36=\E[24;5~,
kf37=\E[1;6P,
kf38=\E[1;6Q,
kf39=\E[1;6R,
kf40=\E[1;6S,
kf41=\E[15;6~,
kf42=\E[17;6~,
kf43=\E[18;6~,
kf44=\E[19;6~,
kf45=\E[20;6~,
kf46=\E[21;6~,
kf47=\E[23;6~,
kf48=\E[24;6~,
kf49=\E[1;3P,
kf50=\E[1;3Q,
kf51=\E[1;3R,
kf52=\E[1;3S,
kf53=\E[15;3~,
kf54=\E[17;3~,
kf55=\E[18;3~,
kf56=\E[19;3~,
kf57=\E[20;3~,
kf58=\E[21;3~,
kf59=\E[23;3~,
kf60=\E[24;3~,
kf61=\E[1;4P,
kf62=\E[1;4Q,
kf63=\E[1;4R,
khome=\E[1~, khome=\E[1~,
knp=\E[6~, knp=\E[6~,
kmous=\E[M, kmous=\E[M,