From 4fb026958e0f843608afcaba173e5217acf0f781 Mon Sep 17 00:00:00 2001 From: ykeara Date: Thu, 3 Sep 2020 11:08:37 -0500 Subject: [PATCH] custom keybinds multiple keypress fix. [add backslash to Parser] (#513) * fixed input sending bug not properly releasing keys * updated to ovr 1.12.5 * added disable oculus api button experimental * small refactor and fix float and bool bugs * added nokeyup events to modifier keys when read in, and adjusted token send to have proper logic * fixed literal held issue * added backslash * fixed sender token parser * updated version string to dev whoops * added backslash to documentation for keyboard input --- docs/keyboard_input_guide.md | 1 + docs/specs/Keyboard_Manager-Parser_Spec.md | 1 + src/keyboard_input/input_parser.cpp | 7 ++++ src/keyboard_input/input_parser.h | 1 + src/keyboard_input/input_sender.h | 41 +++++----------------- src/keyboard_input/input_sender_X11.cpp | 2 ++ src/keyboard_input/input_sender_win.cpp | 2 ++ 7 files changed, 23 insertions(+), 32 deletions(-) diff --git a/docs/keyboard_input_guide.md b/docs/keyboard_input_guide.md index 105f09b..b1beba1 100644 --- a/docs/keyboard_input_guide.md +++ b/docs/keyboard_input_guide.md @@ -78,6 +78,7 @@ | Keypad Minus | `KPMINUS` | | Keypad Plus | `KPPLUS` | | Enter | `ENTER` | +| Backslash | `BACKSLASH` | ### Misc symbols diff --git a/docs/specs/Keyboard_Manager-Parser_Spec.md b/docs/specs/Keyboard_Manager-Parser_Spec.md index df2030d..32a3e31 100644 --- a/docs/specs/Keyboard_Manager-Parser_Spec.md +++ b/docs/specs/Keyboard_Manager-Parser_Spec.md @@ -70,6 +70,7 @@ A token is either a modifier symbol, literal symbol, symbol sequence or space ch | Keypad Minus | `KPMINUS` | | Keypad Plus | `KPPLUS` | | Enter | `ENTER` | +| Backslash | `BACKSLASH` | ### Misc symbols diff --git a/src/keyboard_input/input_parser.cpp b/src/keyboard_input/input_parser.cpp index 7c31731..28d0674 100644 --- a/src/keyboard_input/input_parser.cpp +++ b/src/keyboard_input/input_parser.cpp @@ -164,6 +164,10 @@ std::optional checkIfLegalCapitalLiteral( std::string input ) noexcept { return Token::KEY_ENTER; } + if ( input == "BACKSLASH" ) + { + return Token::KEY_BACKSLASH; + } return std::nullopt; } @@ -182,6 +186,7 @@ std::vector } if ( const auto c = getModifier( *ch ); c.has_value() ) { + tokens.push_back( Token::TOKEN_NO_KEYUP_NEXT ); tokens.push_back( *c ); continue; } @@ -517,6 +522,8 @@ bool isLiteral( const Token token ) noexcept return true; case Token::KEY_ENTER: return true; + case Token::KEY_BACKSLASH: + return true; default: return false; diff --git a/src/keyboard_input/input_parser.h b/src/keyboard_input/input_parser.h index da96ab8..9069dfb 100644 --- a/src/keyboard_input/input_parser.h +++ b/src/keyboard_input/input_parser.h @@ -43,6 +43,7 @@ enum class Token KEY_KPMINUS, KEY_KPPLUS, KEY_ENTER, + KEY_BACKSLASH, // Misc tokens TOKEN_NEW_SEQUENCE, diff --git a/src/keyboard_input/input_sender.h b/src/keyboard_input/input_sender.h index 9499018..81c9499 100644 --- a/src/keyboard_input/input_sender.h +++ b/src/keyboard_input/input_sender.h @@ -18,29 +18,26 @@ inline void sendTokensAsInput( const std::vector tokens ) initOsSystems(); std::vector heldInputs = {}; - bool noKeyUp = false; for ( const auto& token : tokens ) { + // maintained for support w/o altering other binds/parsers if ( token == Token::TOKEN_NO_KEYUP_NEXT ) { - noKeyUp = true; continue; } - + // Modifiers always push to held if ( isModifier( token ) ) { sendKeyPress( token, KeyStatus::Down ); - if ( noKeyUp ) - { - heldInputs.push_back( token ); - } - else - { - sendKeyPress( token, KeyStatus::Up ); - } + heldInputs.push_back( token ); + continue; + } + if ( isLiteral( token ) ) + { + sendKeyPress( token, KeyStatus::Down ); + sendKeyPress( token, KeyStatus::Up ); continue; } - if ( token == Token::TOKEN_NEW_SEQUENCE ) { for ( const auto& h : heldInputs ) @@ -50,26 +47,6 @@ inline void sendTokensAsInput( const std::vector tokens ) heldInputs.clear(); continue; } - - if ( isLiteral( token ) ) - { - sendKeyPress( token, KeyStatus::Down ); - if ( noKeyUp ) - { - heldInputs.push_back( token ); - } - else - { - sendKeyPress( token, KeyStatus::Up ); - } - continue; - } - - if ( token != Token::TOKEN_NO_KEYUP_NEXT ) - { - noKeyUp = false; - continue; - } } if ( !heldInputs.empty() ) diff --git a/src/keyboard_input/input_sender_X11.cpp b/src/keyboard_input/input_sender_X11.cpp index b7c3994..970a235 100644 --- a/src/keyboard_input/input_sender_X11.cpp +++ b/src/keyboard_input/input_sender_X11.cpp @@ -150,6 +150,8 @@ unsigned int tokenToKeySym( const Token token ) return XK_KP_Add; case Token::KEY_ENTER: return XK_Return; + case Token::KEY_BACKSLASH: + return XK_backslash; case Token::MODIFIER_CTRL: return XK_Control_L; diff --git a/src/keyboard_input/input_sender_win.cpp b/src/keyboard_input/input_sender_win.cpp index a6c9635..9f5dcc0 100644 --- a/src/keyboard_input/input_sender_win.cpp +++ b/src/keyboard_input/input_sender_win.cpp @@ -94,6 +94,8 @@ WORD convertToVirtualKeycode( const Token token ) return VK_LWIN; case Token::MODIFIER_TILDE: return VK_OEM_3; + case Token::KEY_BACKSLASH: + return VK_OEM_5; default: return 0;