From 15f5534f69924f6c740aa36eba956ea1ca147a70 Mon Sep 17 00:00:00 2001 From: ykeara Date: Tue, 11 Aug 2020 20:02:34 -0500 Subject: [PATCH] Added F10-F12 For Custom KeyBinds (#507) * added F10-F12 keys * updated version strings to 5.2.2 * updated spec to reflect new keys --- build_scripts/compile_version_string.txt | 2 +- docs/keyboard_input_guide.md | 1 + docs/specs/Keyboard_Manager-Parser_Spec.md | 1 + src/keyboard_input/input_parser.cpp | 44 ++++++++++ src/keyboard_input/input_parser.h | 94 +++++++++++----------- src/keyboard_input/input_sender_X11.cpp | 6 ++ src/keyboard_input/input_sender_win.cpp | 6 ++ ver/versioncheck.json | 2 +- 8 files changed, 109 insertions(+), 47 deletions(-) diff --git a/build_scripts/compile_version_string.txt b/build_scripts/compile_version_string.txt index c7db817..db2c4f7 100644 --- a/build_scripts/compile_version_string.txt +++ b/build_scripts/compile_version_string.txt @@ -1 +1 @@ -5.2.1-dev \ No newline at end of file +5.2.2-release \ No newline at end of file diff --git a/docs/keyboard_input_guide.md b/docs/keyboard_input_guide.md index 5fa2138..1706e37 100644 --- a/docs/keyboard_input_guide.md +++ b/docs/keyboard_input_guide.md @@ -55,6 +55,7 @@ | A to Z | The letter in lowercase. `a`, `b`, `c`, ... | | Number Row 0-9 | The number. `0`, `1`, `2`, ... | | Function keys F1-F9 | Capital F followed by number. `F1`, `F2`, `F3`, ... | +| Function keys F10-F12 | Capital G followed by number. `G0` = F10, `G1` = F11, ... | | Backspace | `BACKSPACE` | | Space | `SPACE` | | Tab | `TAB` | diff --git a/docs/specs/Keyboard_Manager-Parser_Spec.md b/docs/specs/Keyboard_Manager-Parser_Spec.md index 1014531..df2030d 100644 --- a/docs/specs/Keyboard_Manager-Parser_Spec.md +++ b/docs/specs/Keyboard_Manager-Parser_Spec.md @@ -47,6 +47,7 @@ A token is either a modifier symbol, literal symbol, symbol sequence or space ch | A to Z | The letter in lowercase. `a`, `b`, `c`, ... | | Number Row 0-9 | The number. `0`, `1`, `2`, ... | | Function keys F1-F9 | Capital F followed by number. `F1`, `F2`, `F3`, ... | +| Function keys F10-F12 | Capital G followed by number. `G0` = F10, `G1` = F11, ... | | Backspace | `BACKSPACE` | | Space | `SPACE` | | Tab | `TAB` | diff --git a/src/keyboard_input/input_parser.cpp b/src/keyboard_input/input_parser.cpp index 9382a84..7c31731 100644 --- a/src/keyboard_input/input_parser.cpp +++ b/src/keyboard_input/input_parser.cpp @@ -55,6 +55,24 @@ std::optional getFunctionNumber( const char& character ) noexcept } } +std::optional getFunctionNumberExtended( const char& character ) noexcept +{ + switch ( character ) + { + case '0': + return Token::KEY_F10; + case '1': + return Token::KEY_F11; + case '2': + return Token::KEY_F12; + // Theoretically we could extende out to f19, but as F12 is the only + // function key on Standard Keyboard. + default: + LOG( INFO ) << "Unknown function key number: " << character; + return std::nullopt; + } +} + std::optional checkIfLegalCapitalLiteral( std::string input ) noexcept { // C++ can't do string comparisons in switches. :( @@ -200,6 +218,26 @@ std::vector break; } } + else if ( *ch == 'G' ) + { + ++ch; + if ( ch == end ) + { + break; + } + const auto token = getFunctionNumberExtended( *ch ); + if ( token.has_value() ) + { + tokens.push_back( *token ); + continue; + } + else + { + // Spec says to abort on errors and submit correct values before + // error. + break; + } + } std::string characters; characters.push_back( *ch ); @@ -428,6 +466,12 @@ bool isLiteral( const Token token ) noexcept return true; case Token::KEY_F9: return true; + case Token::KEY_F10: + return true; + case Token::KEY_F11: + return true; + case Token::KEY_F12: + return true; case Token::KEY_BACKSPACE: return true; diff --git a/src/keyboard_input/input_parser.h b/src/keyboard_input/input_parser.h index 806654d..da96ab8 100644 --- a/src/keyboard_input/input_parser.h +++ b/src/keyboard_input/input_parser.h @@ -7,6 +7,55 @@ enum class Token { + + KEY_F1, + KEY_F2, + KEY_F3, + KEY_F4, + KEY_F5, + KEY_F6, + KEY_F7, + KEY_F8, + KEY_F9, + KEY_F10, + KEY_F11, + KEY_F12, + + KEY_BACKSPACE, + KEY_SPACE, + KEY_TAB, + KEY_ESC, + KEY_INS, + KEY_DEL, + KEY_END, + KEY_PGDN, + KEY_PGUP, + KEY_CAPS, + KEY_PRNSCRN, + KEY_PAUSE, + KEY_SCRLOCK, + KEY_LEFTARROW, + KEY_RIGHTARROW, + KEY_UPARROW, + KEY_DOWNARROW, + KEY_KPSLASH, + KEY_KPSTAR, + KEY_KPMINUS, + KEY_KPPLUS, + KEY_ENTER, + + // Misc tokens + TOKEN_NEW_SEQUENCE, + TOKEN_NO_KEYUP_NEXT, + + // Modifiers + MODIFIER_CTRL, + MODIFIER_ALT, + MODIFIER_SHIFT, + MODIFIER_RSHIFT, + MODIFIER_SUPER, + MODIFIER_TILDE, + // Literals KEY_a = 'a', KEY_b = 'b', @@ -45,51 +94,6 @@ enum class Token KEY_7 = '7', KEY_8 = '8', KEY_9 = '9', - - KEY_F1, - KEY_F2, - KEY_F3, - KEY_F4, - KEY_F5, - KEY_F6, - KEY_F7, - KEY_F8, - KEY_F9, - - KEY_BACKSPACE, - KEY_SPACE, - KEY_TAB, - KEY_ESC, - KEY_INS, - KEY_DEL, - KEY_END, - KEY_PGDN, - KEY_PGUP, - KEY_CAPS, - KEY_PRNSCRN, - KEY_PAUSE, - KEY_SCRLOCK, - KEY_LEFTARROW, - KEY_RIGHTARROW, - KEY_UPARROW, - KEY_DOWNARROW, - KEY_KPSLASH, - KEY_KPSTAR, - KEY_KPMINUS, - KEY_KPPLUS, - KEY_ENTER, - - // Misc tokens - TOKEN_NEW_SEQUENCE, - TOKEN_NO_KEYUP_NEXT, - - // Modifiers - MODIFIER_CTRL, - MODIFIER_ALT, - MODIFIER_SHIFT, - MODIFIER_RSHIFT, - MODIFIER_SUPER, - MODIFIER_TILDE, }; std::vector diff --git a/src/keyboard_input/input_sender_X11.cpp b/src/keyboard_input/input_sender_X11.cpp index 0483d88..b7c3994 100644 --- a/src/keyboard_input/input_sender_X11.cpp +++ b/src/keyboard_input/input_sender_X11.cpp @@ -99,6 +99,12 @@ unsigned int tokenToKeySym( const Token token ) return XK_F8; case Token::KEY_F9: return XK_F9; + case Token::KEY_F10: + return XK_F10; + case Token::KEY_F11: + return XK_F11; + case Token::KEY_F12: + return XK_F12; case Token::KEY_BACKSPACE: return XK_BackSpace; diff --git a/src/keyboard_input/input_sender_win.cpp b/src/keyboard_input/input_sender_win.cpp index 96d20ae..a6c9635 100644 --- a/src/keyboard_input/input_sender_win.cpp +++ b/src/keyboard_input/input_sender_win.cpp @@ -30,6 +30,12 @@ WORD convertToVirtualKeycode( const Token token ) return VK_F8; case Token::KEY_F9: return VK_F9; + case Token::KEY_F10: + return VK_F10; + case Token::KEY_F11: + return VK_F11; + case Token::KEY_F12: + return VK_F12; case Token::KEY_BACKSPACE: return VK_BACK; diff --git a/ver/versioncheck.json b/ver/versioncheck.json index 53f4c9a..49acf3c 100644 --- a/ver/versioncheck.json +++ b/ver/versioncheck.json @@ -1 +1 @@ -{ "major": 5, "minor": 2, "patch": 1, "updateMessage": "", "optionalMessage": "" } \ No newline at end of file +{ "major": 5, "minor": 2, "patch": 2, "updateMessage": "", "optionalMessage": "" } \ No newline at end of file