diff --git a/ChangeLog b/ChangeLog index af39538e..109a0ba8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-07-29 Markus Gans + * Added numeric Keypad [/], [*], [-], [+] support + * More tests in FKeyboard unit test + 2017-07-27 Markus Gans * The array for keyboard input of UTF-8 characters was not long enough for 4 bytes of UTF-8 codes. diff --git a/include/final/fc.h b/include/final/fc.h index be7e771a..77f44dd7 100644 --- a/include/final/fc.h +++ b/include/final/fc.h @@ -284,7 +284,22 @@ enum keys Fckey_right_square_bracket = 0x000001d, // control-] Fckey_caret = 0x000001e, // control-^ Fckey_underscore = 0x000001f, // control-_ - Fkey_space = 0x0000020, + Fkey_space = 0x0000020, // space + Fkey_exclamation_mark = 0x0000021, // ! + Fkey_quotation_mark = 0x0000022, // " + Fkey_number_sign = 0x0000023, // # + Fkey_dollar_sign = 0x0000024, // $ + Fkey_percent_sign = 0x0000025, // % + Fkey_ampersand = 0x0000026, // & + Fkey_apostrophe = 0x0000027, // ' + Fkey_left_parentheses = 0x0000028, // ( + Fkey_right_parentheses = 0x0000029, // ) + Fkey_asterisk = 0x000002a, // * + Fkey_plus_sign = 0x000002b, // + + Fkey_comma = 0x000002c, // , + Fkey_minus_sign = 0x000002d, // - + Fkey_full_stop = 0x000002e, // . + Fkey_slash = 0x000002f, // / Fckey_space = 0x1000020, // control-space Fkey_backspace = 0x1000100, Fkey_catab = 0x1000101, diff --git a/src/fkey_map.cpp b/src/fkey_map.cpp index d81207f7..c2dfaee7 100644 --- a/src/fkey_map.cpp +++ b/src/fkey_map.cpp @@ -28,171 +28,176 @@ namespace fc fkeymap Fkey[] = { - { fc::Fkey_backspace, 0, "kb" }, // backspace key - { fc::Fkey_catab , 0, "ka" }, // clear-all-tabs key - { fc::Fkey_clear , 0, "kC" }, // clear-screen or erase key - { fc::Fkey_ctab , 0, "kt" }, // clear-tab key - { fc::Fkey_dc , 0, "kD" }, // delete-character key - { fc::Fkey_dl , 0, "kL" }, // delete-line key - { fc::Fkey_down , 0, "kd" }, // down-arrow key - { fc::Fkey_down , 0, "kdx"}, // down-arrow key - { fc::Fkey_eic , 0, "kM" }, // sent by rmir or smir in insert mode - { fc::Fkey_eol , 0, "kE" }, // clear-to-end-of-line key - { fc::Fkey_eos , 0, "kS" }, // clear-to-end-of-screen key - { fc::Fkey_f0 , 0, "k0" }, // F0 function key - { fc::Fkey_f1 , 0, "k1" }, // F1 function key - { fc::Fkey_f1 , 0, "k1x"}, // F1 function key - { fc::Fkey_f1 , 0, "k1X"}, // F1 function key - { fc::Fkey_f2 , 0, "k2" }, // F2 function key - { fc::Fkey_f2 , 0, "k2x"}, // F2 function key - { fc::Fkey_f2 , 0, "k2X"}, // F2 function key - { fc::Fkey_f3 , 0, "k3" }, // F3 function key - { fc::Fkey_f3 , 0, "k3x"}, // F3 function key - { fc::Fkey_f3 , 0, "k3X"}, // F3 function key - { fc::Fkey_f4 , 0, "k4" }, // F4 function key - { fc::Fkey_f4 , 0, "k4x"}, // F4 function key - { fc::Fkey_f4 , 0, "k4X"}, // F4 function key - { fc::Fkey_f5 , 0, "k5" }, // F5 function key - { fc::Fkey_f6 , 0, "k6" }, // F6 function key - { fc::Fkey_f7 , 0, "k7" }, // F7 function key - { fc::Fkey_f8 , 0, "k8" }, // F8 fucntion key - { fc::Fkey_f9 , 0, "k9" }, // F9 function key - { fc::Fkey_f10 , 0, "k;" }, // F10 function key - { fc::Fkey_home , 0, "kh" }, // home key - { fc::Fkey_home , 0, "khx"}, // home key - { fc::Fkey_ic , 0, "kI" }, // insert-character key - { fc::Fkey_il , 0, "kA" }, // insert-line key - { fc::Fkey_left , 0, "kl" }, // left-arrow key - { fc::Fkey_left , 0, "klx"}, // left-arrow key - { fc::Fkey_ll , 0, "kH" }, // last-line key - { fc::Fkey_npage , 0, "kN" }, // next-page key - { fc::Fkey_ppage , 0, "kP" }, // prev-page key - { fc::Fkey_right , 0, "kr" }, // right-arrow key - { fc::Fkey_right , 0, "krx"}, // right-arrow key - { fc::Fkey_sf , 0, "kF" }, // scroll-forward key - { fc::Fkey_sr , 0, "kR" }, // scroll-backward key - { fc::Fkey_stab , 0, "kT" }, // set-tab key - { fc::Fkey_up , 0, "ku" }, // up-arrow key - { fc::Fkey_up , 0, "kux"}, // up-arrow key - { fc::Fkey_a1 , 0, "K1" }, // upper left of keypad - { fc::Fkey_a3 , 0, "K3" }, // upper right of keypad - { fc::Fkey_b2 , 0, "K2" }, // center of keypad - { fc::Fkey_c1 , 0, "K4" }, // lower left of keypad - { fc::Fkey_c3 , 0, "K5" }, // lower right of keypad - { fc::Fkey_btab , 0, "kB" }, // back-tab key - { fc::Fkey_beg , 0, "@1" }, // begin key - { fc::Fkey_cancel , 0, "@2" }, // cancel key - { fc::Fkey_close , 0, "@3" }, // close key - { fc::Fkey_command , 0, "@4" }, // command key - { fc::Fkey_copy , 0, "@5" }, // copy key - { fc::Fkey_create , 0, "@6" }, // create key - { fc::Fkey_end , 0, "@7" }, // end key - { fc::Fkey_end , 0, "@7x"}, // end key - { fc::Fkey_end , 0, "@7X"}, // end key - { fc::Fkey_enter , 0, "@8" }, // enter/send key - { fc::Fkey_exit , 0, "@9" }, // exit key - { fc::Fkey_find , 0, "@0" }, // find key - { fc::Fkey_help , 0, "%1" }, // help key - { fc::Fkey_mark , 0, "%2" }, // mark key - { fc::Fkey_message , 0, "%3" }, // message key - { fc::Fkey_move , 0, "%4" }, // move key - { fc::Fkey_next , 0, "%5" }, // next key - { fc::Fkey_open , 0, "%6" }, // open key - { fc::Fkey_options , 0, "%7" }, // options key - { fc::Fkey_previous , 0, "%8" }, // previous key - { fc::Fkey_print , 0, "%9" }, // print key - { fc::Fkey_redo , 0, "%0" }, // redo key - { fc::Fkey_reference, 0, "&1" }, // reference key - { fc::Fkey_refresh , 0, "&2" }, // refresh key - { fc::Fkey_replace , 0, "&3" }, // replace key - { fc::Fkey_restart , 0, "&4" }, // restart key - { fc::Fkey_resume , 0, "&5" }, // resume key - { fc::Fkey_save , 0, "&6" }, // save key - { fc::Fkey_suspend , 0, "&7" }, // suspend key - { fc::Fkey_undo , 0, "&8" }, // undo key - { fc::Fkey_sbeg , 0, "&9" }, // shifted key - { fc::Fkey_scancel , 0, "&0" }, // shifted key - { fc::Fkey_scommand , 0, "*1" }, // shifted key - { fc::Fkey_scopy , 0, "*2" }, // shifted key - { fc::Fkey_screate , 0, "*3" }, // shifted key - { fc::Fkey_sdc , 0, "*4" }, // shifted key - { fc::Fkey_sdl , 0, "*5" }, // shifted key - { fc::Fkey_select , 0, "*6" }, // select key - { fc::Fkey_send , 0, "*7" }, // shifted key - { fc::Fkey_seol , 0, "*8" }, // shifted key - { fc::Fkey_sexit , 0, "*9" }, // shifted key - { fc::Fkey_sfind , 0, "*0" }, // shifted key - { fc::Fkey_shelp , 0, "#1" }, // shifted key - { fc::Fkey_shome , 0, "#2" }, // shifted key - { fc::Fkey_sic , 0, "#3" }, // shifted key - { fc::Fkey_sleft , 0, "#4" }, // shifted key - { fc::Fkey_smessage , 0, "%a" }, // shifted key - { fc::Fkey_smove , 0, "%b" }, // shifted key - { fc::Fkey_snext , 0, "%c" }, // shifted key - { fc::Fkey_soptions , 0, "%d" }, // shifted key - { fc::Fkey_sprevious, 0, "%e" }, // shifted key - { fc::Fkey_sprint , 0, "%f" }, // shifted key - { fc::Fkey_sredo , 0, "%g" }, // shifted key - { fc::Fkey_sreplace , 0, "%h" }, // shifted key - { fc::Fkey_sright , 0, "%i" }, // shifted key - { fc::Fkey_srsume , 0, "%j" }, // shifted key - { fc::Fkey_ssave , 0, "!1" }, // shifted key - { fc::Fkey_ssuspend , 0, "!2" }, // shifted key - { fc::Fkey_sundo , 0, "!3" }, // shifted key - { fc::Fkey_f11 , 0, "F1" }, // F11 function key - { fc::Fkey_f12 , 0, "F2" }, // F12 function key - { fc::Fkey_f13 , 0, "F3" }, // F13 function key - { fc::Fkey_f14 , 0, "F4" }, // F14 function key - { fc::Fkey_f15 , 0, "F5" }, // F15 function key - { fc::Fkey_f16 , 0, "F6" }, // F16 function key - { fc::Fkey_f17 , 0, "F7" }, // F17 function key - { fc::Fkey_f18 , 0, "F8" }, // F18 function key - { fc::Fkey_f19 , 0, "F9" }, // F19 function key - { fc::Fkey_f20 , 0, "FA" }, // F20 function key - { fc::Fkey_f21 , 0, "FB" }, // F21 function key - { fc::Fkey_f22 , 0, "FC" }, // F22 function key - { fc::Fkey_f23 , 0, "FD" }, // F23 function key - { fc::Fkey_f24 , 0, "FE" }, // F24 function key - { fc::Fkey_f25 , 0, "FF" }, // F25 function key - { fc::Fkey_f26 , 0, "FG" }, // F26 function key - { fc::Fkey_f27 , 0, "FH" }, // F27 function key - { fc::Fkey_f28 , 0, "FI" }, // F28 function key - { fc::Fkey_f29 , 0, "FJ" }, // F29 function key - { fc::Fkey_f30 , 0, "FK" }, // F30 function key - { fc::Fkey_f31 , 0, "FL" }, // F31 function key - { fc::Fkey_f32 , 0, "FM" }, // F32 function key - { fc::Fkey_f33 , 0, "FN" }, // F33 function key - { fc::Fkey_f34 , 0, "FO" }, // F34 function key - { fc::Fkey_f35 , 0, "FP" }, // F35 function key - { fc::Fkey_f36 , 0, "FQ" }, // F36 function key - { fc::Fkey_f37 , 0, "FR" }, // F37 function key - { fc::Fkey_f38 , 0, "FS" }, // F38 function key - { fc::Fkey_f39 , 0, "FT" }, // F39 function key - { fc::Fkey_f40 , 0, "FU" }, // F40 function key - { fc::Fkey_f41 , 0, "FV" }, // F41 function key - { fc::Fkey_f42 , 0, "FW" }, // F42 function key - { fc::Fkey_f43 , 0, "FX" }, // F43 function key - { fc::Fkey_f44 , 0, "FY" }, // F44 function key - { fc::Fkey_f45 , 0, "FZ" }, // F45 function key - { fc::Fkey_f46 , 0, "Fa" }, // F46 function key - { fc::Fkey_f47 , 0, "Fb" }, // F47 function key - { fc::Fkey_f48 , 0, "Fc" }, // F48 function key - { fc::Fkey_f49 , 0, "Fd" }, // F49 function key - { fc::Fkey_f50 , 0, "Fe" }, // F50 function key - { fc::Fkey_f51 , 0, "Ff" }, // F51 function key - { fc::Fkey_f52 , 0, "Fg" }, // F52 function key - { fc::Fkey_f53 , 0, "Fh" }, // F53 function key - { fc::Fkey_f54 , 0, "Fi" }, // F54 function key - { fc::Fkey_f55 , 0, "Fj" }, // F55 function key - { fc::Fkey_f56 , 0, "Fk" }, // F56 function key - { fc::Fkey_f57 , 0, "Fl" }, // F57 function key - { fc::Fkey_f58 , 0, "Fm" }, // F58 function key - { fc::Fkey_f59 , 0, "Fn" }, // F59 function key - { fc::Fkey_f60 , 0, "Fo" }, // F60 function key - { fc::Fkey_f61 , 0, "Fp" }, // F61 function key - { fc::Fkey_f62 , 0, "Fq" }, // F62 function key - { fc::Fkey_f63 , 0, "Fr" }, // F63 function key - { 0 , 0, "\0" } + { fc::Fkey_backspace , 0, "kb" }, // backspace key + { fc::Fkey_catab , 0, "ka" }, // clear-all-tabs key + { fc::Fkey_clear , 0, "kC" }, // clear-screen or erase key + { fc::Fkey_ctab , 0, "kt" }, // clear-tab key + { fc::Fkey_dc , 0, "kD" }, // delete-character key + { fc::Fkey_dl , 0, "kL" }, // delete-line key + { fc::Fkey_down , 0, "kd" }, // down-arrow key + { fc::Fkey_down , 0, "kdx"}, // down-arrow key + { fc::Fkey_eic , 0, "kM" }, // sent by rmir or smir in insert mode + { fc::Fkey_eol , 0, "kE" }, // clear-to-end-of-line key + { fc::Fkey_eos , 0, "kS" }, // clear-to-end-of-screen key + { fc::Fkey_f0 , 0, "k0" }, // F0 function key + { fc::Fkey_f1 , 0, "k1" }, // F1 function key + { fc::Fkey_f1 , 0, "k1x"}, // F1 function key + { fc::Fkey_f1 , 0, "k1X"}, // F1 function key + { fc::Fkey_f2 , 0, "k2" }, // F2 function key + { fc::Fkey_f2 , 0, "k2x"}, // F2 function key + { fc::Fkey_f2 , 0, "k2X"}, // F2 function key + { fc::Fkey_f3 , 0, "k3" }, // F3 function key + { fc::Fkey_f3 , 0, "k3x"}, // F3 function key + { fc::Fkey_f3 , 0, "k3X"}, // F3 function key + { fc::Fkey_f4 , 0, "k4" }, // F4 function key + { fc::Fkey_f4 , 0, "k4x"}, // F4 function key + { fc::Fkey_f4 , 0, "k4X"}, // F4 function key + { fc::Fkey_f5 , 0, "k5" }, // F5 function key + { fc::Fkey_f6 , 0, "k6" }, // F6 function key + { fc::Fkey_f7 , 0, "k7" }, // F7 function key + { fc::Fkey_f8 , 0, "k8" }, // F8 fucntion key + { fc::Fkey_f9 , 0, "k9" }, // F9 function key + { fc::Fkey_f10 , 0, "k;" }, // F10 function key + { fc::Fkey_home , 0, "kh" }, // home key + { fc::Fkey_home , 0, "khx"}, // home key + { fc::Fkey_ic , 0, "kI" }, // insert-character key + { fc::Fkey_il , 0, "kA" }, // insert-line key + { fc::Fkey_left , 0, "kl" }, // left-arrow key + { fc::Fkey_left , 0, "klx"}, // left-arrow key + { fc::Fkey_ll , 0, "kH" }, // last-line key + { fc::Fkey_npage , 0, "kN" }, // next-page key + { fc::Fkey_ppage , 0, "kP" }, // prev-page key + { fc::Fkey_right , 0, "kr" }, // right-arrow key + { fc::Fkey_right , 0, "krx"}, // right-arrow key + { fc::Fkey_sf , 0, "kF" }, // scroll-forward key (shift-up) + { fc::Fkey_sr , 0, "kR" }, // scroll-backward key (shift-down) + { fc::Fkey_stab , 0, "kT" }, // set-tab key + { fc::Fkey_up , 0, "ku" }, // up-arrow key + { fc::Fkey_up , 0, "kux"}, // up-arrow key + { fc::Fkey_a1 , 0, "K1" }, // upper left of keypad + { fc::Fkey_a3 , 0, "K3" }, // upper right of keypad + { fc::Fkey_b2 , 0, "K2" }, // center of keypad + { fc::Fkey_c1 , 0, "K4" }, // lower left of keypad + { fc::Fkey_c3 , 0, "K5" }, // lower right of keypad + { fc::Fkey_btab , 0, "kB" }, // back-tab key + { fc::Fkey_beg , 0, "@1" }, // begin key + { fc::Fkey_cancel , 0, "@2" }, // cancel key + { fc::Fkey_close , 0, "@3" }, // close key + { fc::Fkey_command , 0, "@4" }, // command key + { fc::Fkey_copy , 0, "@5" }, // copy key + { fc::Fkey_create , 0, "@6" }, // create key + { fc::Fkey_end , 0, "@7" }, // end key + { fc::Fkey_end , 0, "@7x"}, // end key + { fc::Fkey_end , 0, "@7X"}, // end key + { fc::Fkey_enter , 0, "@8" }, // enter/send key + { fc::Fkey_enter , 0, "@8x"}, // enter/send key + { fc::Fkey_exit , 0, "@9" }, // exit key + { fc::Fkey_find , 0, "@0" }, // find key + { fc::Fkey_slash , 0, "KP1"}, // keypad slash + { fc::Fkey_asterisk , 0, "KP2"}, // keypad asterisk + { fc::Fkey_minus_sign, 0, "KP3"}, // keypad minus sign + { fc::Fkey_plus_sign , 0, "KP4"}, // keypad plus sign + { fc::Fkey_help , 0, "%1" }, // help key + { fc::Fkey_mark , 0, "%2" }, // mark key + { fc::Fkey_message , 0, "%3" }, // message key + { fc::Fkey_move , 0, "%4" }, // move key + { fc::Fkey_next , 0, "%5" }, // next key + { fc::Fkey_open , 0, "%6" }, // open key + { fc::Fkey_options , 0, "%7" }, // options key + { fc::Fkey_previous , 0, "%8" }, // previous key + { fc::Fkey_print , 0, "%9" }, // print key + { fc::Fkey_redo , 0, "%0" }, // redo key + { fc::Fkey_reference , 0, "&1" }, // reference key + { fc::Fkey_refresh , 0, "&2" }, // refresh key + { fc::Fkey_replace , 0, "&3" }, // replace key + { fc::Fkey_restart , 0, "&4" }, // restart key + { fc::Fkey_resume , 0, "&5" }, // resume key + { fc::Fkey_save , 0, "&6" }, // save key + { fc::Fkey_suspend , 0, "&7" }, // suspend key + { fc::Fkey_undo , 0, "&8" }, // undo key + { fc::Fkey_sbeg , 0, "&9" }, // shifted begin key + { fc::Fkey_scancel , 0, "&0" }, // shifted cancel key + { fc::Fkey_scommand , 0, "*1" }, // shifted command key + { fc::Fkey_scopy , 0, "*2" }, // shifted copy key + { fc::Fkey_screate , 0, "*3" }, // shifted create key + { fc::Fkey_sdc , 0, "*4" }, // shifted delete-character key + { fc::Fkey_sdl , 0, "*5" }, // shifted delete-line key + { fc::Fkey_select , 0, "*6" }, // select key + { fc::Fkey_send , 0, "*7" }, // shifted end key + { fc::Fkey_seol , 0, "*8" }, // shifted clear-to-end-of-line key + { fc::Fkey_sexit , 0, "*9" }, // shifted exit key + { fc::Fkey_sfind , 0, "*0" }, // shifted find key + { fc::Fkey_shelp , 0, "#1" }, // shifted help key + { fc::Fkey_shome , 0, "#2" }, // shifted home key + { fc::Fkey_sic , 0, "#3" }, // shifted insert-character key + { fc::Fkey_sleft , 0, "#4" }, // shifted left-arrow key + { fc::Fkey_smessage , 0, "%a" }, // shifted message key + { fc::Fkey_smove , 0, "%b" }, // shifted move key + { fc::Fkey_snext , 0, "%c" }, // shifted next key + { fc::Fkey_soptions , 0, "%d" }, // shifted options key + { fc::Fkey_sprevious , 0, "%e" }, // shifted previous key + { fc::Fkey_sprint , 0, "%f" }, // shifted print key + { fc::Fkey_sredo , 0, "%g" }, // shifted redo key + { fc::Fkey_sreplace , 0, "%h" }, // shifted replace key + { fc::Fkey_sright , 0, "%i" }, // shifted right-arrow key + { fc::Fkey_srsume , 0, "%j" }, // shifted resume key + { fc::Fkey_ssave , 0, "!1" }, // shifted save key + { fc::Fkey_ssuspend , 0, "!2" }, // shifted suspend key + { fc::Fkey_sundo , 0, "!3" }, // shifted undo key + { fc::Fkey_f11 , 0, "F1" }, // F11 function key + { fc::Fkey_f12 , 0, "F2" }, // F12 function key + { fc::Fkey_f13 , 0, "F3" }, // F13 function key + { fc::Fkey_f14 , 0, "F4" }, // F14 function key + { fc::Fkey_f15 , 0, "F5" }, // F15 function key + { fc::Fkey_f16 , 0, "F6" }, // F16 function key + { fc::Fkey_f17 , 0, "F7" }, // F17 function key + { fc::Fkey_f18 , 0, "F8" }, // F18 function key + { fc::Fkey_f19 , 0, "F9" }, // F19 function key + { fc::Fkey_f20 , 0, "FA" }, // F20 function key + { fc::Fkey_f21 , 0, "FB" }, // F21 function key + { fc::Fkey_f22 , 0, "FC" }, // F22 function key + { fc::Fkey_f23 , 0, "FD" }, // F23 function key + { fc::Fkey_f24 , 0, "FE" }, // F24 function key + { fc::Fkey_f25 , 0, "FF" }, // F25 function key + { fc::Fkey_f26 , 0, "FG" }, // F26 function key + { fc::Fkey_f27 , 0, "FH" }, // F27 function key + { fc::Fkey_f28 , 0, "FI" }, // F28 function key + { fc::Fkey_f29 , 0, "FJ" }, // F29 function key + { fc::Fkey_f30 , 0, "FK" }, // F30 function key + { fc::Fkey_f31 , 0, "FL" }, // F31 function key + { fc::Fkey_f32 , 0, "FM" }, // F32 function key + { fc::Fkey_f33 , 0, "FN" }, // F33 function key + { fc::Fkey_f34 , 0, "FO" }, // F34 function key + { fc::Fkey_f35 , 0, "FP" }, // F35 function key + { fc::Fkey_f36 , 0, "FQ" }, // F36 function key + { fc::Fkey_f37 , 0, "FR" }, // F37 function key + { fc::Fkey_f38 , 0, "FS" }, // F38 function key + { fc::Fkey_f39 , 0, "FT" }, // F39 function key + { fc::Fkey_f40 , 0, "FU" }, // F40 function key + { fc::Fkey_f41 , 0, "FV" }, // F41 function key + { fc::Fkey_f42 , 0, "FW" }, // F42 function key + { fc::Fkey_f43 , 0, "FX" }, // F43 function key + { fc::Fkey_f44 , 0, "FY" }, // F44 function key + { fc::Fkey_f45 , 0, "FZ" }, // F45 function key + { fc::Fkey_f46 , 0, "Fa" }, // F46 function key + { fc::Fkey_f47 , 0, "Fb" }, // F47 function key + { fc::Fkey_f48 , 0, "Fc" }, // F48 function key + { fc::Fkey_f49 , 0, "Fd" }, // F49 function key + { fc::Fkey_f50 , 0, "Fe" }, // F50 function key + { fc::Fkey_f51 , 0, "Ff" }, // F51 function key + { fc::Fkey_f52 , 0, "Fg" }, // F52 function key + { fc::Fkey_f53 , 0, "Fh" }, // F53 function key + { fc::Fkey_f54 , 0, "Fi" }, // F54 function key + { fc::Fkey_f55 , 0, "Fj" }, // F55 function key + { fc::Fkey_f56 , 0, "Fk" }, // F56 function key + { fc::Fkey_f57 , 0, "Fl" }, // F57 function key + { fc::Fkey_f58 , 0, "Fm" }, // F58 function key + { fc::Fkey_f59 , 0, "Fn" }, // F59 function key + { fc::Fkey_f60 , 0, "Fo" }, // F60 function key + { fc::Fkey_f61 , 0, "Fp" }, // F61 function key + { fc::Fkey_f62 , 0, "Fq" }, // F62 function key + { fc::Fkey_f63 , 0, "Fr" }, // F63 function key + { 0 , 0, "\0" } }; fmetakeymap Fmetakey[] = diff --git a/src/fterm.cpp b/src/fterm.cpp index b522707c..db82c5dd 100644 --- a/src/fterm.cpp +++ b/src/fterm.cpp @@ -1327,6 +1327,22 @@ void FTerm::init_termcap_keys (char*& buffer) // Fallback for TERM=ansi if ( std::strncmp(fc::Fkey[i].tname, "@7X", 3) == 0 ) fc::Fkey[i].string = C_STR(CSI "K"); // End key + + // Keypad keys + if ( std::strncmp(fc::Fkey[i].tname, "@8x", 3) == 0 ) + fc::Fkey[i].string = C_STR(ESC "OM"); // Enter key + + if ( std::strncmp(fc::Fkey[i].tname, "KP1", 3) == 0 ) + fc::Fkey[i].string = C_STR(ESC "Oo"); // Keypad slash + + if ( std::strncmp(fc::Fkey[i].tname, "KP2", 3) == 0 ) + fc::Fkey[i].string = C_STR(ESC "Oj"); // Keypad asterisk + + if ( std::strncmp(fc::Fkey[i].tname, "KP3", 3) == 0 ) + fc::Fkey[i].string = C_STR(ESC "Om"); // Keypad minus sign + + if ( std::strncmp(fc::Fkey[i].tname, "KP4", 3) == 0 ) + fc::Fkey[i].string = C_STR(ESC "Ok"); // Keypad plus sign } // Some terminals (e.g. PuTTY) send the wrong code for the arrow keys diff --git a/src/test/fkeyboard-test.cpp b/src/test/fkeyboard-test.cpp index f182b10b..19f85a24 100644 --- a/src/test/fkeyboard-test.cpp +++ b/src/test/fkeyboard-test.cpp @@ -46,171 +46,176 @@ fkeymap; fkeymap Fkey[] = { - { fc::Fkey_backspace, C_STR("\177") , "kb" }, // backspace key - { fc::Fkey_catab , 0 , "ka" }, // clear-all-tabs key - { fc::Fkey_clear , 0 , "kC" }, // clear-screen or erase key - { fc::Fkey_ctab , C_STR(CSI "3~") , "kt" }, // clear-tab key - { fc::Fkey_dc , 0 , "kD" }, // delete-character key - { fc::Fkey_dl , 0 , "kL" }, // delete-line key - { fc::Fkey_down , C_STR(ESC "OB") , "kd" }, // down-arrow key - { fc::Fkey_down , C_STR(CSI "B") , "kdx"}, // down-arrow key - { fc::Fkey_eic , 0 , "kM" }, // sent by rmir or smir in insert mode - { fc::Fkey_eol , 0 , "kE" }, // clear-to-end-of-line key - { fc::Fkey_eos , 0 , "kS" }, // clear-to-end-of-screen key - { fc::Fkey_f0 , 0 , "k0" }, // F0 function key - { fc::Fkey_f1 , C_STR(ESC "OP") , "k1" }, // F1 function key - { fc::Fkey_f1 , C_STR(CSI "11~") , "k1x"}, // F1 function key - { fc::Fkey_f1 , C_STR(ESC "OP") , "k1X"}, // F1 function key - { fc::Fkey_f2 , C_STR(ESC "OQ") , "k2" }, // F2 function key - { fc::Fkey_f2 , C_STR(CSI "12~") , "k2x"}, // F2 function key - { fc::Fkey_f2 , C_STR(CSI "OQ") , "k2X"}, // F2 function key - { fc::Fkey_f3 , C_STR(ESC "OR") , "k3" }, // F3 function key - { fc::Fkey_f3 , C_STR(CSI "13~") , "k3x"}, // F3 function key - { fc::Fkey_f3 , C_STR(ESC "OR") , "k3X"}, // F3 function key - { fc::Fkey_f4 , C_STR(ESC "OS") , "k4" }, // F4 function key - { fc::Fkey_f4 , C_STR(CSI "14~") , "k4x"}, // F4 function key - { fc::Fkey_f4 , C_STR(ESC "OS") , "k4X"}, // F4 function key - { fc::Fkey_f5 , C_STR(CSI "15~") , "k5" }, // F5 function key - { fc::Fkey_f6 , C_STR(CSI "17~") , "k6" }, // F6 function key - { fc::Fkey_f7 , C_STR(CSI "18~") , "k7" }, // F7 function key - { fc::Fkey_f8 , C_STR(CSI "19~") , "k8" }, // F8 fucntion key - { fc::Fkey_f9 , C_STR(CSI "20~") , "k9" }, // F9 function key - { fc::Fkey_f10 , C_STR(CSI "21~") , "k;" }, // F10 function key - { fc::Fkey_home , C_STR(ESC "OH") , "kh" }, // home key - { fc::Fkey_home , C_STR(CSI "7~") , "khx"}, // home key - { fc::Fkey_ic , C_STR(CSI "2~") , "kI" }, // insert-character key - { fc::Fkey_il , 0 , "kA" }, // insert-line key - { fc::Fkey_left , C_STR(ESC "OD") , "kl" }, // left-arrow key - { fc::Fkey_left , C_STR(CSI "D") , "klx"}, // left-arrow key - { fc::Fkey_ll , 0 , "kH" }, // last-line key - { fc::Fkey_npage , C_STR(CSI "6~") , "kN" }, // next-page key - { fc::Fkey_ppage , C_STR(CSI "5~") , "kP" }, // prev-page key - { fc::Fkey_right , C_STR(ESC "OC") , "kr" }, // right-arrow key - { fc::Fkey_right , C_STR(CSI "C") , "krx"}, // right-arrow key - { fc::Fkey_sf , C_STR(CSI "1;2B") , "kF" }, // scroll-forward key - { fc::Fkey_sr , C_STR(CSI "1;2A") , "kR" }, // scroll-backward key - { fc::Fkey_stab , 0 , "kT" }, // set-tab key - { fc::Fkey_up , C_STR(ESC "OA") , "ku" }, // up-arrow key - { fc::Fkey_up , C_STR(CSI "A") , "kux"}, // up-arrow key - { fc::Fkey_a1 , 0 , "K1" }, // upper left of keypad - { fc::Fkey_a3 , 0 , "K3" }, // upper right of keypad - { fc::Fkey_b2 , C_STR(CSI "E") , "K2" }, // center of keypad - { fc::Fkey_c1 , 0 , "K4" }, // lower left of keypad - { fc::Fkey_c3 , 0 , "K5" }, // lower right of keypad - { fc::Fkey_btab , C_STR(CSI "Z") , "kB" }, // back-tab key - { fc::Fkey_beg , 0 , "@1" }, // begin key - { fc::Fkey_cancel , 0 , "@2" }, // cancel key - { fc::Fkey_close , 0 , "@3" }, // close key - { fc::Fkey_command , 0 , "@4" }, // command key - { fc::Fkey_copy , 0 , "@5" }, // copy key - { fc::Fkey_create , 0 , "@6" }, // create key - { fc::Fkey_end , C_STR(ESC "OF") , "@7" }, // end key - { fc::Fkey_end , C_STR(CSI "8~") , "@7x"}, // end key - { fc::Fkey_end , C_STR(CSI "K") , "@7X"}, // end key - { fc::Fkey_enter , 0 , "@8" }, // enter/send key - { fc::Fkey_exit , 0 , "@9" }, // exit key - { fc::Fkey_find , C_STR(CSI "1~") , "@0" }, // find key - { fc::Fkey_help , 0 , "%1" }, // help key - { fc::Fkey_mark , 0 , "%2" }, // mark key - { fc::Fkey_message , 0 , "%3" }, // message key - { fc::Fkey_move , 0 , "%4" }, // move key - { fc::Fkey_next , 0 , "%5" }, // next key - { fc::Fkey_open , 0 , "%6" }, // open key - { fc::Fkey_options , 0 , "%7" }, // options key - { fc::Fkey_previous , 0 , "%8" }, // previous key - { fc::Fkey_print , 0 , "%9" }, // print key - { fc::Fkey_redo , 0 , "%0" }, // redo key - { fc::Fkey_reference, 0 , "&1" }, // reference key - { fc::Fkey_refresh , 0 , "&2" }, // refresh key - { fc::Fkey_replace , 0 , "&3" }, // replace key - { fc::Fkey_restart , 0 , "&4" }, // restart key - { fc::Fkey_resume , 0 , "&5" }, // resume key - { fc::Fkey_save , 0 , "&6" }, // save key - { fc::Fkey_suspend , 0 , "&7" }, // suspend key - { fc::Fkey_undo , 0 , "&8" }, // undo key - { fc::Fkey_sbeg , 0 , "&9" }, // shifted key - { fc::Fkey_scancel , 0 , "&0" }, // shifted key - { fc::Fkey_scommand , 0 , "*1" }, // shifted key - { fc::Fkey_scopy , 0 , "*2" }, // shifted key - { fc::Fkey_screate , 0 , "*3" }, // shifted key - { fc::Fkey_sdc , C_STR(CSI "3;2~") , "*4" }, // shifted key - { fc::Fkey_sdl , 0 , "*5" }, // shifted key - { fc::Fkey_select , C_STR(CSI "4~") , "*6" }, // select key - { fc::Fkey_send , C_STR(CSI "1;2F") , "*7" }, // shifted key - { fc::Fkey_seol , 0 , "*8" }, // shifted key - { fc::Fkey_sexit , 0 , "*9" }, // shifted key - { fc::Fkey_sfind , 0 , "*0" }, // shifted key - { fc::Fkey_shelp , 0 , "#1" }, // shifted key - { fc::Fkey_shome , C_STR(CSI "1;2H") , "#2" }, // shifted key - { fc::Fkey_sic , C_STR(CSI "2;2~") , "#3" }, // shifted key - { fc::Fkey_sleft , C_STR(CSI "1;2D") , "#4" }, // shifted key - { fc::Fkey_smessage , 0 , "%a" }, // shifted key - { fc::Fkey_smove , 0 , "%b" }, // shifted key - { fc::Fkey_snext , C_STR(CSI "6;2~") , "%c" }, // shifted key - { fc::Fkey_soptions , 0 , "%d" }, // shifted key - { fc::Fkey_sprevious, C_STR(CSI "5;2~") , "%e" }, // shifted key - { fc::Fkey_sprint , 0 , "%f" }, // shifted key - { fc::Fkey_sredo , 0 , "%g" }, // shifted key - { fc::Fkey_sreplace , 0 , "%h" }, // shifted key - { fc::Fkey_sright , C_STR(CSI "1;2C") , "%i" }, // shifted key - { fc::Fkey_srsume , 0 , "%j" }, // shifted key - { fc::Fkey_ssave , 0 , "!1" }, // shifted key - { fc::Fkey_ssuspend , 0 , "!2" }, // shifted key - { fc::Fkey_sundo , 0 , "!3" }, // shifted key - { fc::Fkey_f11 , C_STR(CSI "23~") , "F1" }, // F11 function key - { fc::Fkey_f12 , C_STR(CSI "24~") , "F2" }, // F12 function key - { fc::Fkey_f13 , C_STR(ESC "O1;2P"), "F3" }, // F13 function key - { fc::Fkey_f14 , C_STR(ESC "O1;2Q"), "F4" }, // F14 function key - { fc::Fkey_f15 , C_STR(ESC "O1;2R"), "F5" }, // F15 function key - { fc::Fkey_f16 , C_STR(ESC "O1;2S"), "F6" }, // F16 function key - { fc::Fkey_f17 , C_STR(CSI "15;2~"), "F7" }, // F17 function key - { fc::Fkey_f18 , C_STR(CSI "17;2~"), "F8" }, // F18 function key - { fc::Fkey_f19 , C_STR(CSI "18;2~"), "F9" }, // F19 function key - { fc::Fkey_f20 , C_STR(CSI "19;2~"), "FA" }, // F20 function key - { fc::Fkey_f21 , C_STR(CSI "20;2~"), "FB" }, // F21 function key - { fc::Fkey_f22 , C_STR(CSI "21;2~"), "FC" }, // F22 function key - { fc::Fkey_f23 , C_STR(CSI "23;2~"), "FD" }, // F23 function key - { fc::Fkey_f24 , C_STR(CSI "24;2~"), "FE" }, // F24 function key - { fc::Fkey_f25 , C_STR(ESC "O1;5P"), "FF" }, // F25 function key - { fc::Fkey_f26 , C_STR(ESC "O1;5Q"), "FG" }, // F26 function key - { fc::Fkey_f27 , C_STR(ESC "O1;5R"), "FH" }, // F27 function key - { fc::Fkey_f28 , C_STR(ESC "O1;5S"), "FI" }, // F28 function key - { fc::Fkey_f29 , C_STR(CSI "15;5~"), "FJ" }, // F29 function key - { fc::Fkey_f30 , C_STR(CSI "17;5~"), "FK" }, // F30 function key - { fc::Fkey_f31 , C_STR(CSI "18;5~"), "FL" }, // F31 function key - { fc::Fkey_f32 , C_STR(CSI "19;5~"), "FM" }, // F32 function key - { fc::Fkey_f33 , C_STR(CSI "20;5~"), "FN" }, // F33 function key - { fc::Fkey_f34 , C_STR(CSI "21;5~"), "FO" }, // F34 function key - { fc::Fkey_f35 , C_STR(CSI "23;5~"), "FP" }, // F35 function key - { fc::Fkey_f36 , C_STR(CSI "24;5~"), "FQ" }, // F36 function key - { fc::Fkey_f37 , C_STR(ESC "O1;6P"), "FR" }, // F37 function key - { fc::Fkey_f38 , C_STR(ESC "O1;6Q"), "FS" }, // F38 function key - { fc::Fkey_f39 , C_STR(ESC "O1;6R"), "FT" }, // F39 function key - { fc::Fkey_f40 , C_STR(ESC "O1;6S"), "FU" }, // F40 function key - { fc::Fkey_f41 , C_STR(CSI "15;6~"), "FV" }, // F41 function key - { fc::Fkey_f42 , C_STR(CSI "17;6~"), "FW" }, // F42 function key - { fc::Fkey_f43 , C_STR(CSI "18;6~"), "FX" }, // F43 function key - { fc::Fkey_f44 , C_STR(CSI "19;6~"), "FY" }, // F44 function key - { fc::Fkey_f45 , C_STR(CSI "20;6~"), "FZ" }, // F45 function key - { fc::Fkey_f46 , C_STR(CSI "21;6~"), "Fa" }, // F46 function key - { fc::Fkey_f47 , C_STR(CSI "23;6~"), "Fb" }, // F47 function key - { fc::Fkey_f48 , C_STR(CSI "24;6~"), "Fc" }, // F48 function key - { fc::Fkey_f49 , C_STR(ESC "O1;3P"), "Fd" }, // F49 function key - { fc::Fkey_f50 , C_STR(ESC "O1;3Q"), "Fe" }, // F50 function key - { fc::Fkey_f51 , C_STR(ESC "O1;3R"), "Ff" }, // F51 function key - { fc::Fkey_f52 , C_STR(ESC "O1;3S"), "Fg" }, // F52 function key - { fc::Fkey_f53 , C_STR(CSI "15;3~"), "Fh" }, // F53 function key - { fc::Fkey_f54 , C_STR(CSI "17;3~"), "Fi" }, // F54 function key - { fc::Fkey_f55 , C_STR(CSI "18;3~"), "Fj" }, // F55 function key - { fc::Fkey_f56 , C_STR(CSI "19;3~"), "Fk" }, // F56 function key - { fc::Fkey_f57 , C_STR(CSI "20;3~"), "Fl" }, // F57 function key - { fc::Fkey_f58 , C_STR(CSI "21;3~"), "Fm" }, // F58 function key - { fc::Fkey_f59 , C_STR(CSI "23;3~"), "Fn" }, // F59 function key - { fc::Fkey_f60 , C_STR(CSI "24;3~"), "Fo" }, // F60 function key - { fc::Fkey_f61 , C_STR(ESC "O1;4P"), "Fp" }, // F61 function key - { fc::Fkey_f62 , C_STR(ESC "O1;4Q"), "Fq" }, // F62 function key - { fc::Fkey_f63 , C_STR(ESC "O1;4R"), "Fr" }, // F63 function key - { 0 , 0 , "\0" } + { fc::Fkey_backspace , C_STR("\177") , "kb" }, // backspace key + { fc::Fkey_catab , 0 , "ka" }, // clear-all-tabs key + { fc::Fkey_clear , 0 , "kC" }, // clear-screen or erase key + { fc::Fkey_ctab , C_STR(CSI "3~") , "kt" }, // clear-tab key + { fc::Fkey_dc , 0 , "kD" }, // delete-character key + { fc::Fkey_dl , 0 , "kL" }, // delete-line key + { fc::Fkey_down , C_STR(ESC "OB") , "kd" }, // down-arrow key + { fc::Fkey_down , C_STR(CSI "B") , "kdx"}, // down-arrow key + { fc::Fkey_eic , 0 , "kM" }, // sent by rmir or smir in insert mode + { fc::Fkey_eol , 0 , "kE" }, // clear-to-end-of-line key + { fc::Fkey_eos , 0 , "kS" }, // clear-to-end-of-screen key + { fc::Fkey_f0 , 0 , "k0" }, // F0 function key + { fc::Fkey_f1 , C_STR(ESC "OP") , "k1" }, // F1 function key + { fc::Fkey_f1 , C_STR(CSI "11~") , "k1x"}, // F1 function key + { fc::Fkey_f1 , C_STR(ESC "OP") , "k1X"}, // F1 function key + { fc::Fkey_f2 , C_STR(ESC "OQ") , "k2" }, // F2 function key + { fc::Fkey_f2 , C_STR(CSI "12~") , "k2x"}, // F2 function key + { fc::Fkey_f2 , C_STR(CSI "OQ") , "k2X"}, // F2 function key + { fc::Fkey_f3 , C_STR(ESC "OR") , "k3" }, // F3 function key + { fc::Fkey_f3 , C_STR(CSI "13~") , "k3x"}, // F3 function key + { fc::Fkey_f3 , C_STR(ESC "OR") , "k3X"}, // F3 function key + { fc::Fkey_f4 , C_STR(ESC "OS") , "k4" }, // F4 function key + { fc::Fkey_f4 , C_STR(CSI "14~") , "k4x"}, // F4 function key + { fc::Fkey_f4 , C_STR(ESC "OS") , "k4X"}, // F4 function key + { fc::Fkey_f5 , C_STR(CSI "15~") , "k5" }, // F5 function key + { fc::Fkey_f6 , C_STR(CSI "17~") , "k6" }, // F6 function key + { fc::Fkey_f7 , C_STR(CSI "18~") , "k7" }, // F7 function key + { fc::Fkey_f8 , C_STR(CSI "19~") , "k8" }, // F8 fucntion key + { fc::Fkey_f9 , C_STR(CSI "20~") , "k9" }, // F9 function key + { fc::Fkey_f10 , C_STR(CSI "21~") , "k;" }, // F10 function key + { fc::Fkey_home , C_STR(ESC "OH") , "kh" }, // home key + { fc::Fkey_home , C_STR(CSI "7~") , "khx"}, // home key + { fc::Fkey_ic , C_STR(CSI "2~") , "kI" }, // insert-character key + { fc::Fkey_il , 0 , "kA" }, // insert-line key + { fc::Fkey_left , C_STR(ESC "OD") , "kl" }, // left-arrow key + { fc::Fkey_left , C_STR(CSI "D") , "klx"}, // left-arrow key + { fc::Fkey_ll , 0 , "kH" }, // last-line key + { fc::Fkey_npage , C_STR(CSI "6~") , "kN" }, // next-page key + { fc::Fkey_ppage , C_STR(CSI "5~") , "kP" }, // prev-page key + { fc::Fkey_right , C_STR(ESC "OC") , "kr" }, // right-arrow key + { fc::Fkey_right , C_STR(CSI "C") , "krx"}, // right-arrow key + { fc::Fkey_sf , C_STR(CSI "1;2B") , "kF" }, // scroll-forward key (shift-up) + { fc::Fkey_sr , C_STR(CSI "1;2A") , "kR" }, // scroll-backward key (shift-down) + { fc::Fkey_stab , 0 , "kT" }, // set-tab key + { fc::Fkey_up , C_STR(ESC "OA") , "ku" }, // up-arrow key + { fc::Fkey_up , C_STR(CSI "A") , "kux"}, // up-arrow key + { fc::Fkey_a1 , 0 , "K1" }, // upper left of keypad + { fc::Fkey_a3 , 0 , "K3" }, // upper right of keypad + { fc::Fkey_b2 , C_STR(CSI "E") , "K2" }, // center of keypad + { fc::Fkey_c1 , 0 , "K4" }, // lower left of keypad + { fc::Fkey_c3 , 0 , "K5" }, // lower right of keypad + { fc::Fkey_btab , C_STR(CSI "Z") , "kB" }, // back-tab key + { fc::Fkey_beg , 0 , "@1" }, // begin key + { fc::Fkey_cancel , 0 , "@2" }, // cancel key + { fc::Fkey_close , 0 , "@3" }, // close key + { fc::Fkey_command , 0 , "@4" }, // command key + { fc::Fkey_copy , 0 , "@5" }, // copy key + { fc::Fkey_create , 0 , "@6" }, // create key + { fc::Fkey_end , C_STR(ESC "OF") , "@7" }, // end key + { fc::Fkey_end , C_STR(CSI "8~") , "@7x"}, // end key + { fc::Fkey_end , C_STR(CSI "K") , "@7X"}, // end key + { fc::Fkey_enter , 0 , "@8" }, // enter/send key + { fc::Fkey_enter , C_STR(ESC "OM") , "@8x"}, // enter/send key + { fc::Fkey_exit , 0 , "@9" }, // exit key + { fc::Fkey_find , C_STR(CSI "1~") , "@0" }, // find key + { fc::Fkey_slash , C_STR(ESC "Oo") , "KP1"}, // keypad slash + { fc::Fkey_asterisk , C_STR(ESC "Oj") , "KP2"}, // keypad asterisk + { fc::Fkey_minus_sign, C_STR(ESC "Om") , "KP3"}, // keypad minus sign + { fc::Fkey_plus_sign , C_STR(ESC "Ok") , "KP4"}, // keypad plus sign + { fc::Fkey_help , 0 , "%1" }, // help key + { fc::Fkey_mark , 0 , "%2" }, // mark key + { fc::Fkey_message , 0 , "%3" }, // message key + { fc::Fkey_move , 0 , "%4" }, // move key + { fc::Fkey_next , 0 , "%5" }, // next key + { fc::Fkey_open , 0 , "%6" }, // open key + { fc::Fkey_options , 0 , "%7" }, // options key + { fc::Fkey_previous , 0 , "%8" }, // previous key + { fc::Fkey_print , 0 , "%9" }, // print key + { fc::Fkey_redo , 0 , "%0" }, // redo key + { fc::Fkey_reference , 0 , "&1" }, // reference key + { fc::Fkey_refresh , 0 , "&2" }, // refresh key + { fc::Fkey_replace , 0 , "&3" }, // replace key + { fc::Fkey_restart , 0 , "&4" }, // restart key + { fc::Fkey_resume , 0 , "&5" }, // resume key + { fc::Fkey_save , 0 , "&6" }, // save key + { fc::Fkey_suspend , 0 , "&7" }, // suspend key + { fc::Fkey_undo , 0 , "&8" }, // undo key + { fc::Fkey_sbeg , 0 , "&9" }, // shifted begin key + { fc::Fkey_scancel , 0 , "&0" }, // shifted cancel key + { fc::Fkey_scommand , 0 , "*1" }, // shifted command key + { fc::Fkey_scopy , 0 , "*2" }, // shifted copy key + { fc::Fkey_screate , 0 , "*3" }, // shifted create key + { fc::Fkey_sdc , C_STR(CSI "3;2~") , "*4" }, // shifted delete-character key + { fc::Fkey_sdl , 0 , "*5" }, // shifted delete-line key + { fc::Fkey_select , C_STR(CSI "4~") , "*6" }, // select key + { fc::Fkey_send , C_STR(CSI "1;2F") , "*7" }, // shifted end key + { fc::Fkey_seol , 0 , "*8" }, // shifted clear-to-end-of-line key + { fc::Fkey_sexit , 0 , "*9" }, // shifted exit key + { fc::Fkey_sfind , 0 , "*0" }, // shifted find key + { fc::Fkey_shelp , 0 , "#1" }, // shifted help key + { fc::Fkey_shome , C_STR(CSI "1;2H") , "#2" }, // shifted home key + { fc::Fkey_sic , C_STR(CSI "2;2~") , "#3" }, // shifted insert-character key + { fc::Fkey_sleft , C_STR(CSI "1;2D") , "#4" }, // shifted left-arrow key + { fc::Fkey_smessage , 0 , "%a" }, // shifted message key + { fc::Fkey_smove , 0 , "%b" }, // shifted move key + { fc::Fkey_snext , C_STR(CSI "6;2~") , "%c" }, // shifted next key + { fc::Fkey_soptions , 0 , "%d" }, // shifted options key + { fc::Fkey_sprevious , C_STR(CSI "5;2~") , "%e" }, // shifted previous key + { fc::Fkey_sprint , 0 , "%f" }, // shifted print key + { fc::Fkey_sredo , 0 , "%g" }, // shifted redo key + { fc::Fkey_sreplace , 0 , "%h" }, // shifted replace key + { fc::Fkey_sright , C_STR(CSI "1;2C") , "%i" }, // shifted right-arrow key + { fc::Fkey_srsume , 0 , "%j" }, // shifted resume key + { fc::Fkey_ssave , 0 , "!1" }, // shifted save key + { fc::Fkey_ssuspend , 0 , "!2" }, // shifted suspend key + { fc::Fkey_sundo , 0 , "!3" }, // shifted undo key + { fc::Fkey_f11 , C_STR(CSI "23~") , "F1" }, // F11 function key + { fc::Fkey_f12 , C_STR(CSI "24~") , "F2" }, // F12 function key + { fc::Fkey_f13 , C_STR(ESC "O1;2P"), "F3" }, // F13 function key + { fc::Fkey_f14 , C_STR(ESC "O1;2Q"), "F4" }, // F14 function key + { fc::Fkey_f15 , C_STR(ESC "O1;2R"), "F5" }, // F15 function key + { fc::Fkey_f16 , C_STR(ESC "O1;2S"), "F6" }, // F16 function key + { fc::Fkey_f17 , C_STR(CSI "15;2~"), "F7" }, // F17 function key + { fc::Fkey_f18 , C_STR(CSI "17;2~"), "F8" }, // F18 function key + { fc::Fkey_f19 , C_STR(CSI "18;2~"), "F9" }, // F19 function key + { fc::Fkey_f20 , C_STR(CSI "19;2~"), "FA" }, // F20 function key + { fc::Fkey_f21 , C_STR(CSI "20;2~"), "FB" }, // F21 function key + { fc::Fkey_f22 , C_STR(CSI "21;2~"), "FC" }, // F22 function key + { fc::Fkey_f23 , C_STR(CSI "23;2~"), "FD" }, // F23 function key + { fc::Fkey_f24 , C_STR(CSI "24;2~"), "FE" }, // F24 function key + { fc::Fkey_f25 , C_STR(ESC "O1;5P"), "FF" }, // F25 function key + { fc::Fkey_f26 , C_STR(ESC "O1;5Q"), "FG" }, // F26 function key + { fc::Fkey_f27 , C_STR(ESC "O1;5R"), "FH" }, // F27 function key + { fc::Fkey_f28 , C_STR(ESC "O1;5S"), "FI" }, // F28 function key + { fc::Fkey_f29 , C_STR(CSI "15;5~"), "FJ" }, // F29 function key + { fc::Fkey_f30 , C_STR(CSI "17;5~"), "FK" }, // F30 function key + { fc::Fkey_f31 , C_STR(CSI "18;5~"), "FL" }, // F31 function key + { fc::Fkey_f32 , C_STR(CSI "19;5~"), "FM" }, // F32 function key + { fc::Fkey_f33 , C_STR(CSI "20;5~"), "FN" }, // F33 function key + { fc::Fkey_f34 , C_STR(CSI "21;5~"), "FO" }, // F34 function key + { fc::Fkey_f35 , C_STR(CSI "23;5~"), "FP" }, // F35 function key + { fc::Fkey_f36 , C_STR(CSI "24;5~"), "FQ" }, // F36 function key + { fc::Fkey_f37 , C_STR(ESC "O1;6P"), "FR" }, // F37 function key + { fc::Fkey_f38 , C_STR(ESC "O1;6Q"), "FS" }, // F38 function key + { fc::Fkey_f39 , C_STR(ESC "O1;6R"), "FT" }, // F39 function key + { fc::Fkey_f40 , C_STR(ESC "O1;6S"), "FU" }, // F40 function key + { fc::Fkey_f41 , C_STR(CSI "15;6~"), "FV" }, // F41 function key + { fc::Fkey_f42 , C_STR(CSI "17;6~"), "FW" }, // F42 function key + { fc::Fkey_f43 , C_STR(CSI "18;6~"), "FX" }, // F43 function key + { fc::Fkey_f44 , C_STR(CSI "19;6~"), "FY" }, // F44 function key + { fc::Fkey_f45 , C_STR(CSI "20;6~"), "FZ" }, // F45 function key + { fc::Fkey_f46 , C_STR(CSI "21;6~"), "Fa" }, // F46 function key + { fc::Fkey_f47 , C_STR(CSI "23;6~"), "Fb" }, // F47 function key + { fc::Fkey_f48 , C_STR(CSI "24;6~"), "Fc" }, // F48 function key + { fc::Fkey_f49 , C_STR(ESC "O1;3P"), "Fd" }, // F49 function key + { fc::Fkey_f50 , C_STR(ESC "O1;3Q"), "Fe" }, // F50 function key + { fc::Fkey_f51 , C_STR(ESC "O1;3R"), "Ff" }, // F51 function key + { fc::Fkey_f52 , C_STR(ESC "O1;3S"), "Fg" }, // F52 function key + { fc::Fkey_f53 , C_STR(CSI "15;3~"), "Fh" }, // F53 function key + { fc::Fkey_f54 , C_STR(CSI "17;3~"), "Fi" }, // F54 function key + { fc::Fkey_f55 , C_STR(CSI "18;3~"), "Fj" }, // F55 function key + { fc::Fkey_f56 , C_STR(CSI "19;3~"), "Fk" }, // F56 function key + { fc::Fkey_f57 , C_STR(CSI "20;3~"), "Fl" }, // F57 function key + { fc::Fkey_f58 , C_STR(CSI "21;3~"), "Fm" }, // F58 function key + { fc::Fkey_f59 , C_STR(CSI "23;3~"), "Fn" }, // F59 function key + { fc::Fkey_f60 , C_STR(CSI "24;3~"), "Fo" }, // F60 function key + { fc::Fkey_f61 , C_STR(ESC "O1;4P"), "Fp" }, // F61 function key + { fc::Fkey_f62 , C_STR(ESC "O1;4Q"), "Fq" }, // F62 function key + { fc::Fkey_f63 , C_STR(ESC "O1;4R"), "Fr" }, // F63 function key + { 0 , 0 , "\0" } }; } // namespace test @@ -232,7 +237,14 @@ class FKeyboardTest : public CPPUNIT_NS::TestFixture protected: void classNameTest(); void noArgumentTest(); - void inputTest(); + void escapeKeyTest(); + void characterwiseInputTest(); + void severalKeysTest(); + void functionKeyTest(); + void sequencesTest(); + void mouseTest(); + void utf8Test(); + void unknownKeyTest(); private: // Adds code needed to register the test suite @@ -241,7 +253,14 @@ class FKeyboardTest : public CPPUNIT_NS::TestFixture // Add a methods to the test suite CPPUNIT_TEST (classNameTest); CPPUNIT_TEST (noArgumentTest); - CPPUNIT_TEST (inputTest); + CPPUNIT_TEST (escapeKeyTest); + CPPUNIT_TEST (characterwiseInputTest); + CPPUNIT_TEST (severalKeysTest); + CPPUNIT_TEST (functionKeyTest); + CPPUNIT_TEST (sequencesTest); + CPPUNIT_TEST (mouseTest); + CPPUNIT_TEST (utf8Test); + CPPUNIT_TEST (unknownKeyTest); // End of test suite definition CPPUNIT_TEST_SUITE_END(); @@ -256,6 +275,7 @@ class FKeyboardTest : public CPPUNIT_NS::TestFixture // Data Members int key_pressed; int key_released; + int number_of_keys; FKeyboard* keyboard; }; #pragma pack(pop) @@ -264,6 +284,7 @@ class FKeyboardTest : public CPPUNIT_NS::TestFixture FKeyboardTest::FKeyboardTest() : key_pressed(0) , key_released(0) + , number_of_keys(0) , keyboard(0) { init(); @@ -319,44 +340,8 @@ void FKeyboardTest::noArgumentTest() } //---------------------------------------------------------------------- -void FKeyboardTest::inputTest() +void FKeyboardTest::escapeKeyTest() { - // X11 mouse - std::cout << std::endl; - input("\033[M Z2"); - processInput(); - std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == fc::Fkey_mouse ); - clear(); - - // SGR mouse - input("\033[<0;11;7M"); - processInput(); - std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == fc::Fkey_extended_mouse ); - clear(); - - // URXVT mouse - input("\033[32;11;7M"); - processInput(); - std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == fc::Fkey_urxvt_mouse ); - clear(); - - // Without mouse support - keyboard->disableMouseSequences(); - input("\033[M Z2"); - processInput(); - CPPUNIT_ASSERT ( key_pressed != fc::Fkey_mouse ); - clear(); - input("\033[<0;11;7M"); - processInput(); - CPPUNIT_ASSERT ( key_pressed != fc::Fkey_extended_mouse ); - clear(); - input("\033[32;11;7M"); - processInput(); - CPPUNIT_ASSERT ( key_pressed != fc::Fkey_urxvt_mouse ); - clear(); std::cout << std::endl; // Mintty application escape key @@ -374,27 +359,13 @@ void FKeyboardTest::inputTest() std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; CPPUNIT_ASSERT ( key_pressed == fc::Fkey_escape ); keyboard->clearKeyBufferOnTimeout(); - - // Clear-tab - input("\033[3~"); - processInput(); - std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == fc::Fkey_ctab ); clear(); +} - // Cursor down keys in positioning mode - input("\033OB"); - processInput(); - std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == fc::Fkey_down ); - clear(); - - // Cursor down keys in applications mode - input("\033[B"); - processInput(); - std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == fc::Fkey_down ); - clear(); +//---------------------------------------------------------------------- +void FKeyboardTest::characterwiseInputTest() +{ + std::cout << std::endl; // Cursor down in character by character input (e.g. rxvt-cygwin-native) input("\033"); @@ -404,37 +375,44 @@ void FKeyboardTest::inputTest() input("B"); processInput(); std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( number_of_keys == 1 ); CPPUNIT_ASSERT ( key_pressed == fc::Fkey_down ); clear(); +} - // Two one byte characters - input("aA"); +//---------------------------------------------------------------------- +void FKeyboardTest::severalKeysTest() +{ + std::cout << std::endl; + + // Input of two 1 byte characters + input("A"); + input("B"); processInput(); std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == 'A' ); - CPPUNIT_ASSERT ( key_released == 'A' ); + CPPUNIT_ASSERT ( number_of_keys == 2 ); + CPPUNIT_ASSERT ( key_pressed == 'B' ); + CPPUNIT_ASSERT ( key_released == 'B' ); clear(); - // UTF-8 encoded character - input("\360\220\200\200"); // Linear B syllable (4 bytes) + // F1, F2, F3 + input("\033[11~\033[12~\033[13~"); processInput(); - std::cout << " - code: " << key_pressed << std::endl; - CPPUNIT_ASSERT ( key_released == 0x10000 ); - input("\342\202\254"); // Euro sign (3 bytes) - processInput(); - std::cout << " - code: " << key_pressed << std::endl; - CPPUNIT_ASSERT ( key_released == 0x20ac ); - input("\303\274"); // u with two Dots (2 bytes) - processInput(); - std::cout << " - code: " << key_pressed << std::endl; - CPPUNIT_ASSERT ( key_released == 0x00fc ); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( number_of_keys == 3 ); + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f3 ); + CPPUNIT_ASSERT ( key_released == fc::Fkey_f3 ); clear(); +} +//---------------------------------------------------------------------- +void FKeyboardTest::functionKeyTest() +{ // Function key F1 (numeric keypad PF1) - input("\033OP"); + input("\033[2~"); processInput(); std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; - CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f1 ); + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_ic ); clear(); // Function key F1 @@ -458,7 +436,7 @@ void FKeyboardTest::inputTest() CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f2 ); clear(); - // Function key F3 (numeric keypad PF1) + // Function key F3 (numeric keypad PF3) input("\033OR"); processInput(); std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; @@ -472,7 +450,7 @@ void FKeyboardTest::inputTest() CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f3 ); clear(); - // Function key F4 (numeric keypad PF1) + // Function key F4 (numeric keypad PF3) input("\033OS"); processInput(); std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; @@ -527,6 +505,719 @@ void FKeyboardTest::inputTest() std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f10 ); clear(); + + // Function key F11 + input("\033[23~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f11 ); + clear(); + + // Function key F12 + input("\033[24~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f12 ); + clear(); + + // Function key F13 (shift + F1) + input("\033O1;2P"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f13 ); + clear(); + + // Function key F14 (shift + F2) + input("\033O1;2Q"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f14 ); + clear(); + + // Function key F15 (shift + F3) + input("\033O1;2R"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f15 ); + clear(); + + // Function key F16 (shift + F4) + input("\033O1;2S"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f16 ); + clear(); + + // Function key F17 (shift + F5) + input("\033[15;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f17 ); + clear(); + + // Function key F18 (shift + F6) + input("\033[17;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f18 ); + clear(); + + // Function key F19 (shift + F7) + input("\033[18;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f19 ); + clear(); + + // Function key F20 (shift + F8) + input("\033[19;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f20 ); + clear(); + + // Function key F21 (shift + F9) + input("\033[20;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f21 ); + clear(); + + // Function key F22 (shift + F10) + input("\033[21;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f22 ); + clear(); + + // Function key F23 (shift + F11) + input("\033[23;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f23 ); + clear(); + + // Function key F24 (shift + F12) + input("\033[24;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f24 ); + clear(); + + // Function key F25 (ctrl + F1) + input("\033O1;5P"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f25 ); + clear(); + + // Function key F26 (ctrl + F2) + input("\033O1;5Q"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f26 ); + clear(); + + // Function key F27 (ctrl + F3) + input("\033O1;5R"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f27 ); + clear(); + + // Function key F28 (ctrl + F4) + input("\033O1;5S"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f28 ); + clear(); + + // Function key F29 (ctrl + F5) + input("\033[15;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f29 ); + clear(); + + // Function key F30 (ctrl + F6) + input("\033[17;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f30 ); + clear(); + + // Function key F31 (ctrl + F7) + input("\033[18;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f31 ); + clear(); + + // Function key F32 (ctrl + F8) + input("\033[19;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f32 ); + clear(); + + // Function key F33 (ctrl + F9) + input("\033[20;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f33 ); + clear(); + + // Function key F34 (ctrl + F10) + input("\033[21;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f34 ); + clear(); + + // Function key F35 (ctrl + F11) + input("\033[23;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f35 ); + clear(); + + // Function key F36 (ctrl + F12) + input("\033[24;5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f36 ); + clear(); + + // Function key F37 (shift + ctrl + F1) + input("\033O1;6P"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f37 ); + clear(); + + // Function key F38 (shift + ctrl + F2) + input("\033O1;6Q"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f38 ); + clear(); + + // Function key F39 (shift + ctrl + F3) + input("\033O1;6R"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f39 ); + clear(); + + // Function key F40 (shift + ctrl + F4) + input("\033O1;6S"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f40 ); + clear(); + + // Function key F41 (shift + ctrl + F5) + input("\033[15;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f41 ); + clear(); + + // Function key F42 (shift + ctrl + F6) + input("\033[17;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f42 ); + clear(); + + // Function key F43 (shift + ctrl + F7) + input("\033[18;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f43 ); + clear(); + + // Function key F44 (shift + ctrl + F8) + input("\033[19;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f44 ); + clear(); + + // Function key F45 (shift + ctrl + F9) + input("\033[20;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f45 ); + clear(); + + // Function key F46 (shift + ctrl + F10) + input("\033[21;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f46 ); + clear(); + + // Function key F47 (shift + ctrl + F11) + input("\033[23;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f47 ); + clear(); + + // Function key F48 (shift + ctrl + F12) + input("\033[24;6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f48 ); + clear(); + + // Function key F49 (meta + F1) + input("\033O1;3P"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f49 ); + clear(); + + // Function key F50 (meta + F2) + input("\033O1;3Q"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f50 ); + clear(); + + // Function key F51 (meta + F3) + input("\033O1;3R"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f51 ); + clear(); + + // Function key F52 (meta + F4) + input("\033O1;3S"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f52 ); + clear(); + + // Function key F53 (meta + F5) + input("\033[15;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f53 ); + clear(); + + // Function key F54 (meta + F6) + input("\033[17;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f54 ); + clear(); + + // Function key F55 (meta + F7) + input("\033[18;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f55 ); + clear(); + + // Function key F56 (meta + F8) + input("\033[19;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f56 ); + clear(); + + // Function key F57 (meta + F9) + input("\033[20;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f57 ); + clear(); + + // Function key F58 (meta + F10) + input("\033[21;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f58 ); + clear(); + + // Function key F59 (meta + F11) + input("\033[23;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f59 ); + clear(); + + // Function key F60 (meta + F12) + input("\033[24;3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f60 ); + clear(); + + // Function key F61 (shift + meta + F1) + input("\033O1;4P"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f61 ); + clear(); + + // Function key F62 (shift + meta + F2) + input("\033O1;4Q"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f62 ); + clear(); + + // Function key F63 (shift + meta + F3) + input("\033O1;4R"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_f63 ); + clear(); +} + +//---------------------------------------------------------------------- +void FKeyboardTest::sequencesTest() +{ + std::cout << std::endl; + + // Clear-tab + input("\033[3~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_ctab ); + clear(); + + // Cursor up key in applications mode + input("\033OA"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_up ); + clear(); + + // Cursor up key in positioning mode + input("\033[A"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_up ); + clear(); + + // Cursor down key in applications mode + input("\033OB"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_down ); + clear(); + + // Cursor down key in positioning mode + input("\033[B"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_down ); + clear(); + + // Cursor right key in applications mode + input("\033OC"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_right ); + clear(); + + // Cursor right key in positioning mode + input("\033[C"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_right ); + clear(); + + // Cursor left key in applications mode + input("\033OD"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_left ); + clear(); + + // Cursor left key in applications mode + input("\033OD"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_left ); + clear(); + + // Home key in positioning mode + input("\033[7~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_home ); + clear(); + + // Home key in applications mode + input("\033OH"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_home ); + clear(); + + // End key in positioning mode + input("\033[8~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_end ); + clear(); + + // End key in applications mode + input("\033OF"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_end ); + clear(); + + // End key (ANSI terminal) + input("\033[K"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_end ); + clear(); + + // Next-page key (Page down) + input("\033[6~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_npage ); + clear(); + + // Previous-page key (Page up) + input("\033[5~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_ppage ); + clear(); + + // Insert key + input("\033[2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_ic ); + clear(); + + // Scroll-forward key (shift + up-arrow) + input("\033[1;2B"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_sf ); + clear(); + + // Scroll-backward key (shift + down-arrow) + input("\033[1;2A"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_sr ); + clear(); + + // Center of keypad + input("\033[E"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_b2 ); + clear(); + + // back-tab key + input("\033[Z"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_btab ); + clear(); + + // find key + input("\033[1~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_find ); + clear(); + + // select key + input("\033[4~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_select ); + clear(); + + // shifted delete-character key + input("\033[3;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_sdc ); + clear(); + + // shifted end key + input("\033[1;2F"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_send ); + clear(); + + // shifted home key + input("\033[1;2H"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_shome ); + clear(); + + // shifted insert-character key + input("\033[2;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_sic ); + clear(); + + // shifted left-arrow key + input("\033[1;2D"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_sleft ); + clear(); + + // shifted next key + input("\033[6;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_snext ); + clear(); + + // shifted previous key + input("\033[5;2~"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_sprevious ); + clear(); + + // shifted right-arrow key + input("\033[1;2C"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_sright ); + clear(); + + // Keypad slash (numlock off) + input("\033Oo"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_slash ); + clear(); + + // Keypad asterisk (numlock off) + input("\033Oj"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_asterisk ); + clear(); + + // Keypad minus sign (numlock off) + input("\033Om"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_minus_sign ); + clear(); + + // Keypad plus sign (numlock off) + input("\033Ok"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_plus_sign ); + clear(); + +} + +//---------------------------------------------------------------------- +void FKeyboardTest::mouseTest() +{ + std::cout << std::endl; + + // X11 mouse + input("\033[M Z2"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_mouse ); + clear(); + + // SGR mouse + input("\033[<0;11;7M"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_extended_mouse ); + clear(); + + // URXVT mouse + input("\033[32;11;7M"); + processInput(); + std::cout << " - Key: " << keyboard->getKeyName(key_pressed) << std::endl; + CPPUNIT_ASSERT ( key_pressed == fc::Fkey_urxvt_mouse ); + clear(); + + // Without mouse support + keyboard->disableMouseSequences(); + input("\033[M Z2"); + processInput(); + CPPUNIT_ASSERT ( key_pressed != fc::Fkey_mouse ); + clear(); + input("\033[<0;11;7M"); + processInput(); + CPPUNIT_ASSERT ( key_pressed != fc::Fkey_extended_mouse ); + clear(); + input("\033[32;11;7M"); + processInput(); + CPPUNIT_ASSERT ( key_pressed != fc::Fkey_urxvt_mouse ); + clear(); +} + +//---------------------------------------------------------------------- +void FKeyboardTest::utf8Test() +{ + std::cout << std::endl; + + // UTF-8 encoded character + + // Linear B syllable (4 bytes) + input("\360\220\200\200"); + processInput(); + std::cout << " - code: " << key_pressed << std::endl; + CPPUNIT_ASSERT ( key_released == 0x10000 ); + + // Euro sign (3 bytes) + input("\342\202\254"); + processInput(); + std::cout << " - code: " << key_pressed << std::endl; + CPPUNIT_ASSERT ( key_released == 0x20ac ); + + // u with two Dots (2 bytes) + input("\303\274"); + processInput(); + std::cout << " - code: " << key_pressed << std::endl; + CPPUNIT_ASSERT ( key_released == 0x00fc ); + + // Without UTF-8 support + keyboard->disableUTF8(); + input("\360\220\200\200"); + processInput(); + CPPUNIT_ASSERT ( key_released == 0200 ); + clear(); +} + +//---------------------------------------------------------------------- +void FKeyboardTest::unknownKeyTest() +{ + std::cout << std::endl; + + // Unknown key code + CPPUNIT_ASSERT ( keyboard->getKeyName(0xf8d0) == "" ); + + // Unknown input + input("\033[_."); + processInput(); + CPPUNIT_ASSERT ( key_pressed == 0 ); + CPPUNIT_ASSERT ( keyboard->getKeyName(key_pressed) == "" ); } //---------------------------------------------------------------------- @@ -594,13 +1285,16 @@ void FKeyboardTest::processInput() void FKeyboardTest::clear() { keyboard->clearKeyBuffer(); - key_pressed = key_released = 0; + number_of_keys = \ + key_pressed = \ + key_released = 0; } //---------------------------------------------------------------------- void FKeyboardTest::keyPressed() { key_pressed = keyboard->getKey(); + number_of_keys++; } //---------------------------------------------------------------------- @@ -614,6 +1308,7 @@ void FKeyboardTest::escapeKeyPressed() { key_pressed = fc::Fkey_escape; key_released = fc::Fkey_escape; + number_of_keys++; } // Put the test suite in the registry