Add keyboard input RShift, tilde, "no key up" tokens and debug buttons

These are used to add support for vrc debug commands which I personally wanted to add. Because it's a narrow use case the must be enabled manually by adding vrcDebug = true to [utilitiesSettings] in the OpenVRAdvancedSettings.ini file
This commit is contained in:
Kung-vr
2019-10-01 10:36:04 +09:00
parent 93913b6e94
commit b4dbbe8857
9 changed files with 884 additions and 11 deletions
+4
View File
@@ -308,7 +308,11 @@ bool isModifier( const Token token ) noexcept
[[fallthrough]];
case Token::MODIFIER_SHIFT:
[[fallthrough]];
case Token::MODIFIER_RSHIFT:
[[fallthrough]];
case Token::MODIFIER_SUPER:
[[fallthrough]];
case Token::MODIFIER_TILDE:
return true;
default:
return false;
+3
View File
@@ -81,12 +81,15 @@ enum class Token
// Misc tokens
TOKEN_NEW_SEQUENCE,
TOKEN_NO_KEYUP_NEXT,
// Modifiers
MODIFIER_CTRL,
MODIFIER_ALT,
MODIFIER_SHIFT,
MODIFIER_RSHIFT,
MODIFIER_SUPER,
MODIFIER_TILDE,
};
std::vector<Token>
+25 -2
View File
@@ -151,8 +151,12 @@ unsigned int tokenToKeySym( const Token token )
return XK_Alt_L;
case Token::MODIFIER_SHIFT:
return XK_Shift_L;
case Token::MODIFIER_RSHIFT:
return XK_Shift_R;
case Token::MODIFIER_SUPER:
return XK_Super_L;
case Token::MODIFIER_TILDE:
return XK_grave;
default:
return 0;
@@ -182,12 +186,22 @@ void sendTokensAsInput( const std::vector<Token> tokens )
XTestGrabControl( display, True );
std::vector<Token> heldInputs = {};
bool noKeyUp = false;
for ( const auto& token : tokens )
{
if ( token == Token::TOKEN_NO_KEYUP_NEXT )
{
noKeyUp = true;
continue;
}
if ( isModifier( token ) )
{
sendKeyPress( token, KeyStatus::Down, display );
heldInputs.push_back( token );
if ( noKeyUp )
{
heldInputs.push_back( token );
}
continue;
}
@@ -204,7 +218,16 @@ void sendTokensAsInput( const std::vector<Token> tokens )
if ( isLiteral( token ) )
{
sendKeyPress( token, KeyStatus::Down, display );
sendKeyPress( token, KeyStatus::Up, display );
if ( noKeyUp )
{
sendKeyPress( token, KeyStatus::Up, display );
}
continue;
}
if ( token != Token::TOKEN_NO_KEYUP_NEXT )
{
noKeyUp = false;
continue;
}
}
+48 -9
View File
@@ -82,8 +82,12 @@ WORD convertToVirtualKeycode( const Token token )
return VK_MENU;
case Token::MODIFIER_SHIFT:
return VK_SHIFT;
case Token::MODIFIER_RSHIFT:
return VK_RSHIFT;
case Token::MODIFIER_SUPER:
return VK_LWIN;
case Token::MODIFIER_TILDE:
return VK_OEM_3;
default:
return 0;
@@ -97,15 +101,32 @@ INPUT createInputStruct( const WORD virtualKeyCode,
input.type = INPUT_KEYBOARD;
input.ki.wVk = virtualKeyCode;
if ( virtualKeyCode == VK_RSHIFT )
{
input.ki.wVk = VK_SHIFT;
input.ki.wScan = 0x36;
if ( keyStatus == KeyStatus::Up )
{
input.ki.dwFlags = KEYEVENTF_KEYUP;
if ( keyStatus == KeyStatus::Up )
{
input.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
}
else if ( keyStatus == KeyStatus::Down )
{
input.ki.dwFlags = 0 | KEYEVENTF_SCANCODE;
}
}
else if ( keyStatus == KeyStatus::Down )
else
{
input.ki.dwFlags = 0;
input.ki.wVk = virtualKeyCode;
if ( keyStatus == KeyStatus::Up )
{
input.ki.dwFlags = KEYEVENTF_KEYUP;
}
else if ( keyStatus == KeyStatus::Down )
{
input.ki.dwFlags = 0;
}
}
return input;
@@ -146,13 +167,23 @@ void sendTokensAsInput( const std::vector<Token> tokens )
{
std::vector<INPUT> inputs = {};
std::vector<Token> heldInputs = {};
bool noKeyUp = false;
for ( const auto& token : tokens )
{
if ( token == Token::TOKEN_NO_KEYUP_NEXT )
{
noKeyUp = true;
continue;
}
if ( isModifier( token ) )
{
inputs.push_back( createInputStruct(
convertToVirtualKeycode( token ), KeyStatus::Down ) );
heldInputs.push_back( token );
if ( !noKeyUp )
{
heldInputs.push_back( token );
}
continue;
}
@@ -171,8 +202,16 @@ void sendTokensAsInput( const std::vector<Token> tokens )
{
inputs.push_back( createInputStruct(
convertToVirtualKeycode( token ), KeyStatus::Down ) );
inputs.push_back( createInputStruct(
convertToVirtualKeycode( token ), KeyStatus::Up ) );
if ( !noKeyUp )
{
inputs.push_back( createInputStruct(
convertToVirtualKeycode( token ), KeyStatus::Up ) );
}
continue;
}
if ( token != Token::TOKEN_NO_KEYUP_NEXT )
{
noKeyUp = false;
continue;
}
}
+180
View File
@@ -56,4 +56,184 @@ void sendKeyboardCtrlV()
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde1()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_1
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde2()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_2
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde3()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_3
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde4()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_4
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde5()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_5
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde6()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_6
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde7()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_7
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde8()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_8
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde9()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_9
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde0()
{
const auto tokens = std::vector<Token>{
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_RSHIFT,
Token::TOKEN_NO_KEYUP_NEXT, Token::MODIFIER_TILDE,
Token::TOKEN_NO_KEYUP_NEXT, Token::KEY_0
};
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde1Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_1 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde2Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_2 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde3Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_3 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde4Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_4 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde5Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_5 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde6Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_6 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde7Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_7 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde8Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_8 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde9Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_9 };
sendTokensAsInput( tokens );
}
void sendKeyboardRShiftTilde0Delayed()
{
const auto tokens = std::vector<Token>{ Token::MODIFIER_RSHIFT,
Token::MODIFIER_TILDE,
Token::KEY_0 };
sendTokensAsInput( tokens );
}
} // namespace keyboardinput
+31
View File
@@ -24,4 +24,35 @@ void sendKeyboardAltEnter();
void sendKeyboardCtrlC();
void sendKeyboardCtrlV();
// the following functions are used for debug commands in VRChat
// I (Kung) wanted them personally because they're very hard to
// hit from in VR, but it's a narrow use case for a specific app
// so for now these will only be enabled in the UI via manually
// adding vrcDebug = true to [utilitiesSettings] in
// OpenVRAdvancedSettings.ini
// These just call a thread
void sendKeyboardRShiftTilde1();
void sendKeyboardRShiftTilde2();
void sendKeyboardRShiftTilde3();
void sendKeyboardRShiftTilde4();
void sendKeyboardRShiftTilde5();
void sendKeyboardRShiftTilde6();
void sendKeyboardRShiftTilde7();
void sendKeyboardRShiftTilde8();
void sendKeyboardRShiftTilde9();
void sendKeyboardRShiftTilde0();
// These should be run after a slight delay
void sendKeyboardRShiftTilde1Delayed();
void sendKeyboardRShiftTilde2Delayed();
void sendKeyboardRShiftTilde3Delayed();
void sendKeyboardRShiftTilde4Delayed();
void sendKeyboardRShiftTilde5Delayed();
void sendKeyboardRShiftTilde6Delayed();
void sendKeyboardRShiftTilde7Delayed();
void sendKeyboardRShiftTilde8Delayed();
void sendKeyboardRShiftTilde9Delayed();
void sendKeyboardRShiftTilde0Delayed();
} // namespace keyboardinput