Add tests for functional KP keys

This commit is contained in:
Kovid Goyal 2021-01-12 20:04:44 +05:30
parent 529e9f83f7
commit eeacac227a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 42 additions and 8 deletions

View File

@ -188,6 +188,8 @@ and alternate screens. If a pop request is received that empties the stack,
all flags are reset. If a push request is received and the stack is full, the all flags are reset. If a push request is received and the stack is full, the
oldest entry from the stack must be evicted. oldest entry from the stack must be evicted.
.. _disambiguate:
Disambiguate escape codes Disambiguate escape codes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -198,7 +200,9 @@ the start of an escape code. Similarly pressing the key :kbd:`alt+[` will
generate the bytes used for CSI control codes. Turning on this flag will cause generate the bytes used for CSI control codes. Turning on this flag will cause
the terminal to report the :kbd:`Esc, alt+letter, ctrl+letter, ctrl+alt+letter` the terminal to report the :kbd:`Esc, alt+letter, ctrl+letter, ctrl+alt+letter`
keys using ``CSI u`` sequences instead of legacy ones. Here letter is any printable keys using ``CSI u`` sequences instead of legacy ones. Here letter is any printable
ASCII letter (from 32 (i.e. space) to 126 (i.e. ~)). ASCII letter (from 32 (i.e. space) to 126 (i.e. ~)). Additionally, all keypad
keys will be reported as separate keys with ``CSI u`` encoding, using dedicated codes
from the :ref:`table below <functional>`.
Report event types Report event types
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -277,7 +281,7 @@ mode* (the ``smkx/rmkx`` terminfo capabilities). This form is used only in
"F11", "kf11", "CSI 23 ~" "F11", "kf11", "CSI 23 ~"
"F12", "kf12", "CSI 24 ~" "F12", "kf12", "CSI 24 ~"
Finally, there are a few more functional keys that have special cased legacy There are a few more functional keys that have special cased legacy
encodings: encodings:
.. csv-table:: C0 controls .. csv-table:: C0 controls
@ -292,6 +296,9 @@ encodings:
Note that :kbd:`Backspace` and :kbd:`ctrl+backspace` are swapped in some Note that :kbd:`Backspace` and :kbd:`ctrl+backspace` are swapped in some
terminals. terminals.
All keypad keys are reported as there equivalent non-keypad keys. To
distinguish these, use the :ref:`disambiguate <disambiguate>` flag.
Legacy text keys Legacy text keys
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~

View File

@ -78,16 +78,30 @@ serialize(const EncodingData *data, char *output, const char csi_trailer) {
return pos; return pos;
} }
static inline uint32_t
convert_kp_key_to_normal_key(uint32_t key_number) {
switch(key_number) {
#define S(x) case GLFW_FKEY_KP_##x: key_number = GLFW_FKEY_##x; break;
S(ENTER) S(HOME) S(END) S(INSERT) S(DELETE) S(PAGE_UP) S(PAGE_DOWN)
S(UP) S(DOWN) S(LEFT) S(RIGHT)
#undef S
case GLFW_FKEY_KP_0:
case GLFW_FKEY_KP_9: key_number = '0' + (key_number - GLFW_FKEY_KP_0); break;
case GLFW_FKEY_KP_DECIMAL: key_number = '.'; break;
case GLFW_FKEY_KP_DIVIDE: key_number = '/'; break;
case GLFW_FKEY_KP_MULTIPLY: key_number = '*'; break;
case GLFW_FKEY_KP_SUBTRACT: key_number = '-'; break;
case GLFW_FKEY_KP_ADD: key_number = '+'; break;
case GLFW_FKEY_KP_EQUAL: key_number = '='; break;
}
return key_number;
}
static int static int
encode_function_key(const KeyEvent *ev, char *output) { encode_function_key(const KeyEvent *ev, char *output) {
#define SIMPLE(val) return snprintf(output, KEY_BUFFER_SIZE, "%s", val); #define SIMPLE(val) return snprintf(output, KEY_BUFFER_SIZE, "%s", val);
char csi_trailer = 'u'; char csi_trailer = 'u';
uint32_t key_number = ev->key; uint32_t key_number = ev->key;
switch(key_number) {
#define S(x) case GLFW_FKEY_KP_##x: key_number = GLFW_FKEY_##x; break;
S(ENTER) S(HOME) S(END) S(INSERT) S(DELETE) S(PAGE_UP) S(PAGE_DOWN)
#undef S
}
if (ev->cursor_key_mode && !ev->disambiguate && !ev->report_all_event_types) { if (ev->cursor_key_mode && !ev->disambiguate && !ev->report_all_event_types) {
switch(key_number) { switch(key_number) {
@ -222,6 +236,9 @@ encode_glfw_key_event(const GLFWkeyevent *e, const bool cursor_key_mode, const u
.report_alternate_key = key_encoding_flags & 4 .report_alternate_key = key_encoding_flags & 4
}; };
ev.has_text = e->text && !is_ascii_control_char(e->text[0]); ev.has_text = e->text && !is_ascii_control_char(e->text[0]);
if (!ev.disambiguate && GLFW_FKEY_KP_0 <= ev.key && ev.key <= GLFW_FKEY_KP_DELETE) {
ev.key = convert_kp_key_to_normal_key(ev.key);
}
switch (e->action) { switch (e->action) {
case GLFW_PRESS: ev.action = PRESS; break; case GLFW_PRESS: ev.action = PRESS; break;
case GLFW_REPEAT: ev.action = REPEAT; break; case GLFW_REPEAT: ev.action = REPEAT; break;

View File

@ -46,15 +46,21 @@ class TestKeys(BaseTest):
a(e(mods=defines.GLFW_MOD_SHIFT | defines.GLFW_MOD_ALT), ashift or c(defines.GLFW_MOD_ALT | defines.GLFW_MOD_SHIFT)) a(e(mods=defines.GLFW_MOD_SHIFT | defines.GLFW_MOD_ALT), ashift or c(defines.GLFW_MOD_ALT | defines.GLFW_MOD_SHIFT))
mods_test(defines.GLFW_FKEY_ENTER, '\x0d', alt='\033\x0d', csi_num=ord('\r')) mods_test(defines.GLFW_FKEY_ENTER, '\x0d', alt='\033\x0d', csi_num=ord('\r'))
mods_test(defines.GLFW_FKEY_KP_ENTER, '\x0d', alt='\033\x0d', csi_num=ord('\r'))
mods_test(defines.GLFW_FKEY_ESCAPE, '\x1b', alt='\033\033', csi_num=27) mods_test(defines.GLFW_FKEY_ESCAPE, '\x1b', alt='\033\033', csi_num=27)
mods_test(defines.GLFW_FKEY_BACKSPACE, '\x7f', alt='\033\x7f', csi_num=127) mods_test(defines.GLFW_FKEY_BACKSPACE, '\x7f', alt='\033\x7f', csi_num=127)
mods_test(defines.GLFW_FKEY_TAB, '\t', alt='\033\t', shift='\x1b[Z', csi_num=ord('\t')) mods_test(defines.GLFW_FKEY_TAB, '\t', alt='\033\t', shift='\x1b[Z', csi_num=ord('\t'))
mods_test(defines.GLFW_FKEY_INSERT, csi_num=2, trailer='~') mods_test(defines.GLFW_FKEY_INSERT, csi_num=2, trailer='~')
mods_test(defines.GLFW_FKEY_KP_INSERT, csi_num=2, trailer='~')
mods_test(defines.GLFW_FKEY_DELETE, csi_num=3, trailer='~') mods_test(defines.GLFW_FKEY_DELETE, csi_num=3, trailer='~')
mods_test(defines.GLFW_FKEY_KP_DELETE, csi_num=3, trailer='~')
mods_test(defines.GLFW_FKEY_PAGE_UP, csi_num=5, trailer='~') mods_test(defines.GLFW_FKEY_PAGE_UP, csi_num=5, trailer='~')
mods_test(defines.GLFW_FKEY_PAGE_DOWN, csi_num=6, trailer='~') mods_test(defines.GLFW_FKEY_KP_PAGE_UP, csi_num=5, trailer='~')
mods_test(defines.GLFW_FKEY_KP_PAGE_DOWN, csi_num=6, trailer='~')
mods_test(defines.GLFW_FKEY_HOME, csi_num=1, trailer='H') mods_test(defines.GLFW_FKEY_HOME, csi_num=1, trailer='H')
mods_test(defines.GLFW_FKEY_KP_HOME, csi_num=1, trailer='H')
mods_test(defines.GLFW_FKEY_END, csi_num=1, trailer='F') mods_test(defines.GLFW_FKEY_END, csi_num=1, trailer='F')
mods_test(defines.GLFW_FKEY_KP_END, csi_num=1, trailer='F')
mods_test(defines.GLFW_FKEY_F1, csi_num=1, trailer='P') mods_test(defines.GLFW_FKEY_F1, csi_num=1, trailer='P')
mods_test(defines.GLFW_FKEY_F2, csi_num=1, trailer='Q') mods_test(defines.GLFW_FKEY_F2, csi_num=1, trailer='Q')
mods_test(defines.GLFW_FKEY_F3, csi_num=1, trailer='R') mods_test(defines.GLFW_FKEY_F3, csi_num=1, trailer='R')
@ -68,9 +74,13 @@ class TestKeys(BaseTest):
mods_test(defines.GLFW_FKEY_F11, csi_num=23, trailer='~') mods_test(defines.GLFW_FKEY_F11, csi_num=23, trailer='~')
mods_test(defines.GLFW_FKEY_F12, csi_num=24, trailer='~') mods_test(defines.GLFW_FKEY_F12, csi_num=24, trailer='~')
mods_test(defines.GLFW_FKEY_UP, csi_num=1, trailer='A') mods_test(defines.GLFW_FKEY_UP, csi_num=1, trailer='A')
mods_test(defines.GLFW_FKEY_KP_UP, csi_num=1, trailer='A')
mods_test(defines.GLFW_FKEY_DOWN, csi_num=1, trailer='B') mods_test(defines.GLFW_FKEY_DOWN, csi_num=1, trailer='B')
mods_test(defines.GLFW_FKEY_KP_DOWN, csi_num=1, trailer='B')
mods_test(defines.GLFW_FKEY_RIGHT, csi_num=1, trailer='C') mods_test(defines.GLFW_FKEY_RIGHT, csi_num=1, trailer='C')
mods_test(defines.GLFW_FKEY_KP_RIGHT, csi_num=1, trailer='C')
mods_test(defines.GLFW_FKEY_LEFT, csi_num=1, trailer='D') mods_test(defines.GLFW_FKEY_LEFT, csi_num=1, trailer='D')
mods_test(defines.GLFW_FKEY_KP_LEFT, csi_num=1, trailer='D')
q = partial(enc, key=ord('a')) q = partial(enc, key=ord('a'))
ae(q(), 'a') ae(q(), 'a')