diff --git a/advancedSettings.pro b/advancedSettings.pro index 733fb36..be0e6fa 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -13,42 +13,47 @@ TEMPLATE = app SOURCES += src/main.cpp\ - src/overlaycontroller.cpp \ - src/tabcontrollers/AudioTabController.cpp \ - src/tabcontrollers/ChaperoneTabController.cpp \ - src/tabcontrollers/FixFloorTabController.cpp \ - src/tabcontrollers/MoveCenterTabController.cpp \ - src/tabcontrollers/SettingsTabController.cpp \ - src/tabcontrollers/StatisticsTabController.cpp \ - src/tabcontrollers/SteamVRTabController.cpp \ - src/tabcontrollers/ReviveTabController.cpp \ - src/tabcontrollers/UtilitiesTabController.cpp \ - src/tabcontrollers/PttController.cpp \ - src/tabcontrollers/AccessibilityTabController.cpp \ - src/utils/ChaperoneUtils.cpp \ - src/tabcontrollers/audiomanager/AudioManagerDummy.cpp + src/overlaycontroller.cpp \ + src/tabcontrollers/AudioTabController.cpp \ + src/tabcontrollers/ChaperoneTabController.cpp \ + src/tabcontrollers/FixFloorTabController.cpp \ + src/tabcontrollers/MoveCenterTabController.cpp \ + src/tabcontrollers/SettingsTabController.cpp \ + src/tabcontrollers/StatisticsTabController.cpp \ + src/tabcontrollers/SteamVRTabController.cpp \ + src/tabcontrollers/ReviveTabController.cpp \ + src/tabcontrollers/UtilitiesTabController.cpp \ + src/tabcontrollers/PttController.cpp \ + src/tabcontrollers/AccessibilityTabController.cpp \ + src/utils/ChaperoneUtils.cpp \ + src/tabcontrollers/audiomanager/AudioManagerDummy.cpp \ + src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp HEADERS += src/overlaycontroller.h \ - src/logging.h \ - src/tabcontrollers/AudioTabController.h \ - src/tabcontrollers/ChaperoneTabController.h \ - src/tabcontrollers/FixFloorTabController.h \ - src/tabcontrollers/MoveCenterTabController.h \ - src/tabcontrollers/SettingsTabController.h \ - src/tabcontrollers/StatisticsTabController.h \ - src/tabcontrollers/SteamVRTabController.h \ - src/tabcontrollers/ReviveTabController.h \ - src/tabcontrollers/UtilitiesTabController.h \ - src/tabcontrollers/AudioManager.h \ - src/tabcontrollers/PttController.h \ - src/tabcontrollers/AccessibilityTabController.h \ - src/utils/Matrix.h \ - src/utils/ChaperoneUtils.h \ - src/tabcontrollers/audiomanager/AudioManagerDummy.h + src/logging.h \ + src/tabcontrollers/AudioTabController.h \ + src/tabcontrollers/ChaperoneTabController.h \ + src/tabcontrollers/FixFloorTabController.h \ + src/tabcontrollers/MoveCenterTabController.h \ + src/tabcontrollers/SettingsTabController.h \ + src/tabcontrollers/StatisticsTabController.h \ + src/tabcontrollers/SteamVRTabController.h \ + src/tabcontrollers/ReviveTabController.h \ + src/tabcontrollers/UtilitiesTabController.h \ + src/tabcontrollers/AudioManager.h \ + src/tabcontrollers/PttController.h \ + src/tabcontrollers/AccessibilityTabController.h \ + src/tabcontrollers/KeyboardInput.h \ + src/utils/Matrix.h \ + src/utils/ChaperoneUtils.h \ + src/tabcontrollers/audiomanager/AudioManagerDummy.h \ + src/tabcontrollers/keyboardinput/KeyboardInputDummy.h win32 { - SOURCES += src/tabcontrollers/audiomanager/AudioManagerWindows.h - HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h + SOURCES += src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \ + src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp + HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h \ + src/tabcontrollers/keyboardinput/KeyboardInputWindows.h } INCLUDEPATH += third-party/openvr/headers \ diff --git a/src/tabcontrollers/KeyboardInput.h b/src/tabcontrollers/KeyboardInput.h new file mode 100644 index 0000000..28c2468 --- /dev/null +++ b/src/tabcontrollers/KeyboardInput.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +// application namespace +namespace advsettings { + +class AudioTabController; + +class KeyboardInput +{ +public: + virtual ~KeyboardInput() {}; + + virtual void sendKeyboardInput(QString input) = 0; + virtual void sendKeyboardEnter() = 0; + virtual void sendKeyboardBackspace(int count) = 0; +}; + +} + diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 7fe32aa..0ca7744 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -2,8 +2,12 @@ #include #include #include "../overlaycontroller.h" -#include #include +#ifdef _WIN32 + #include "keyboardinput/KeyboardInputWindows.h" +#else + #include "keyboardinput/KeyboardInputDummy.h" +#endif // application namespace namespace advsettings { @@ -11,6 +15,11 @@ namespace advsettings { const char* steamDesktopOverlaykey = "valve.steam.desktop"; void UtilitiesTabController::initStage1() { + #ifdef _WIN32 + keyboardInput.reset(new KeyboardInputWindows()); + #else + keyboardInput.reset(new KeyboardInputDummy()); + #endif auto settings = OverlayController::appSettings(); settings->beginGroup("utilitiesSettings"); auto qAlarmEnabled = settings->value("alarmEnabled", m_alarmEnabled); @@ -44,135 +53,16 @@ namespace advsettings { this->widget = widget; } - void fillKiStruct(INPUT& ip, WORD scanCode, bool keyup) { - ip.type = INPUT_KEYBOARD; - ip.ki.wVk = scanCode; - if (keyup) { - ip.ki.dwFlags = KEYEVENTF_KEYUP; - } else { - ip.ki.dwFlags = 0; - } - ip.ki.wScan = 0; - ip.ki.dwExtraInfo = 0; - ip.ki.time = 0; - }; - void UtilitiesTabController::sendKeyboardInput(QString input) { - int len = input.length(); - if (len > 0) { - LPINPUT ips = new INPUT[len * 5 + 3]; - unsigned ii = 0; - bool shiftPressed = false; - bool ctrlPressed = false; - bool altPressed = false; - for (int i = 0; i < len; i++) { - short tmp = VkKeyScan(input.at(i).toLatin1()); - WORD c = tmp & 0xFF; - short shiftState = tmp >> 8; - bool isShift = shiftState & 1; - bool isCtrl = shiftState & 2; - bool isAlt = shiftState & 4; - if (isShift && !shiftPressed) { - fillKiStruct(ips[ii++], VK_SHIFT, false); - shiftPressed = true; - } else if (!isShift && shiftPressed) { - fillKiStruct(ips[ii++], VK_SHIFT, true); - shiftPressed = false; - } - if (isCtrl && !ctrlPressed) { - fillKiStruct(ips[ii++], VK_CONTROL, false); - ctrlPressed = true; - } else if (!isCtrl && ctrlPressed) { - fillKiStruct(ips[ii++], VK_CONTROL, true); - ctrlPressed = false; - } - if (isAlt && !altPressed) { - fillKiStruct(ips[ii++], VK_MENU, false); - altPressed = true; - } else if (!isAlt && altPressed) { - fillKiStruct(ips[ii++], VK_MENU, true); - altPressed = false; - } - fillKiStruct(ips[ii++], c, false); - fillKiStruct(ips[ii++], c, true); - } - if (shiftPressed) { - fillKiStruct(ips[ii++], VK_SHIFT, true); - shiftPressed = false; - } - if (ctrlPressed) { - fillKiStruct(ips[ii++], VK_CONTROL, true); - ctrlPressed = false; - } - if (altPressed) { - fillKiStruct(ips[ii++], VK_MENU, true); - altPressed = false; - } - if (!SendInput(ii, ips, sizeof(INPUT))) { - char *err; - auto errCode = GetLastError(); - if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errCode, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language - (LPTSTR)&err, - 0, - NULL)){ - LOG(ERROR) << "Error calling SendInput(): Could not get error message (" << errCode << ")"; - } else { - LOG(ERROR) << "Error calling SendInput(): " << err; - } - } - delete ips; - } + keyboardInput->sendKeyboardInput(input); } void UtilitiesTabController::sendKeyboardEnter() { - LPINPUT ips = new INPUT[2]; - fillKiStruct(ips[0], VK_RETURN, false); - fillKiStruct(ips[1], VK_RETURN, true); - if (!SendInput(2, ips, sizeof(INPUT))) { - char *err; - auto errCode = GetLastError(); - if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errCode, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language - (LPTSTR)&err, - 0, - NULL)) { - LOG(ERROR) << "Error calling SendInput(): Could not get error message (" << errCode << ")"; - } else { - LOG(ERROR) << "Error calling SendInput(): " << err; - } - } - delete ips; + keyboardInput->sendKeyboardEnter(); } void UtilitiesTabController::sendKeyboardBackspace(int count) { - if (count > 0) { - LPINPUT ips = new INPUT[count * 2]; - for (int i = 0; i < count; i++) { - fillKiStruct(ips[2 * i], VK_BACK, false); - fillKiStruct(ips[2 * i + 1], VK_BACK, true); - } - if (!SendInput(2 * count, ips, sizeof(INPUT))) { - char *err; - auto errCode = GetLastError(); - if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errCode, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language - (LPTSTR)&err, - 0, - NULL)) { - LOG(ERROR) << "Error calling SendInput(): Could not get error message (" << errCode << ")"; - } else { - LOG(ERROR) << "Error calling SendInput(): " << err; - } - } - delete ips; - } + keyboardInput->sendKeyboardBackspace(count); } diff --git a/src/tabcontrollers/UtilitiesTabController.h b/src/tabcontrollers/UtilitiesTabController.h index 0e107a0..22e2f63 100644 --- a/src/tabcontrollers/UtilitiesTabController.h +++ b/src/tabcontrollers/UtilitiesTabController.h @@ -4,6 +4,8 @@ #include #include #include +#include +#include "KeyboardInput.h" class QQuickWindow; // application namespace @@ -38,6 +40,8 @@ namespace advsettings { int m_batteryState[vr::k_unMaxTrackedDeviceCount]; bool m_batteryVisible[vr::k_unMaxTrackedDeviceCount]; + std::unique_ptr keyboardInput; + public: void initStage1(); void initStage2(OverlayController* parent, QQuickWindow* widget); diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp new file mode 100644 index 0000000..f0ab55b --- /dev/null +++ b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp @@ -0,0 +1,20 @@ +#include "KeyboardInputDummy.h" + +namespace advsettings { + +void KeyboardInputDummy::sendKeyboardInput(QString input) +{ + // noop +} + +void KeyboardInputDummy::sendKeyboardEnter() +{ + // noop +} + +void KeyboardInputDummy::sendKeyboardBackspace(int count) +{ + // noop +} + +} diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.h b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.h new file mode 100644 index 0000000..53b651c --- /dev/null +++ b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.h @@ -0,0 +1,19 @@ +#ifndef KEYBOARDINPUTDUMMY_H +#define KEYBOARDINPUTDUMMY_H + +#include "../KeyboardInput.h" + +// application namespace +namespace advsettings { + +class KeyboardInputDummy : public KeyboardInput +{ +public: + virtual void sendKeyboardInput(QString input) override; + virtual void sendKeyboardEnter() override; + virtual void sendKeyboardBackspace(int count) override; +}; + +} + +#endif // KEYBOARDINPUTDUMMY_H diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp new file mode 100644 index 0000000..8410b65 --- /dev/null +++ b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp @@ -0,0 +1,140 @@ +#include "KeyboardInputWindows.h" +#include + +namespace advsettings { + +void fillKiStruct(INPUT& ip, WORD scanCode, bool keyup) { + ip.type = INPUT_KEYBOARD; + ip.ki.wVk = scanCode; + if (keyup) { + ip.ki.dwFlags = KEYEVENTF_KEYUP; + } else { + ip.ki.dwFlags = 0; + } + ip.ki.wScan = 0; + ip.ki.dwExtraInfo = 0; + ip.ki.time = 0; +}; + +void KeyboardInputWindows::sendKeyboardInput(QString input) +{ + int len = input.length(); + if (len > 0) { + LPINPUT ips = new INPUT[len * 5 + 3]; + unsigned ii = 0; + bool shiftPressed = false; + bool ctrlPressed = false; + bool altPressed = false; + for (int i = 0; i < len; i++) { + short tmp = VkKeyScan(input.at(i).toLatin1()); + WORD c = tmp & 0xFF; + short shiftState = tmp >> 8; + bool isShift = shiftState & 1; + bool isCtrl = shiftState & 2; + bool isAlt = shiftState & 4; + if (isShift && !shiftPressed) { + fillKiStruct(ips[ii++], VK_SHIFT, false); + shiftPressed = true; + } else if (!isShift && shiftPressed) { + fillKiStruct(ips[ii++], VK_SHIFT, true); + shiftPressed = false; + } + if (isCtrl && !ctrlPressed) { + fillKiStruct(ips[ii++], VK_CONTROL, false); + ctrlPressed = true; + } else if (!isCtrl && ctrlPressed) { + fillKiStruct(ips[ii++], VK_CONTROL, true); + ctrlPressed = false; + } + if (isAlt && !altPressed) { + fillKiStruct(ips[ii++], VK_MENU, false); + altPressed = true; + } else if (!isAlt && altPressed) { + fillKiStruct(ips[ii++], VK_MENU, true); + altPressed = false; + } + fillKiStruct(ips[ii++], c, false); + fillKiStruct(ips[ii++], c, true); + } + if (shiftPressed) { + fillKiStruct(ips[ii++], VK_SHIFT, true); + shiftPressed = false; + } + if (ctrlPressed) { + fillKiStruct(ips[ii++], VK_CONTROL, true); + ctrlPressed = false; + } + if (altPressed) { + fillKiStruct(ips[ii++], VK_MENU, true); + altPressed = false; + } + if (!SendInput(ii, ips, sizeof(INPUT))) { + char *err; + auto errCode = GetLastError(); + if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + errCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language + (LPTSTR)&err, + 0, + NULL)){ + LOG(ERROR) << "Error calling SendInput(): Could not get error message (" << errCode << ")"; + } else { + LOG(ERROR) << "Error calling SendInput(): " << err; + } + } + delete ips; + } +} + +void KeyboardInputWindows::sendKeyboardEnter() +{ + LPINPUT ips = new INPUT[2]; + fillKiStruct(ips[0], VK_RETURN, false); + fillKiStruct(ips[1], VK_RETURN, true); + if (!SendInput(2, ips, sizeof(INPUT))) { + char *err; + auto errCode = GetLastError(); + if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + errCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language + (LPTSTR)&err, + 0, + NULL)) { + LOG(ERROR) << "Error calling SendInput(): Could not get error message (" << errCode << ")"; + } else { + LOG(ERROR) << "Error calling SendInput(): " << err; + } + } + delete ips; +} + +void KeyboardInputWindows::sendKeyboardBackspace(int count) +{ + if (count > 0) { + LPINPUT ips = new INPUT[count * 2]; + for (int i = 0; i < count; i++) { + fillKiStruct(ips[2 * i], VK_BACK, false); + fillKiStruct(ips[2 * i + 1], VK_BACK, true); + } + if (!SendInput(2 * count, ips, sizeof(INPUT))) { + char *err; + auto errCode = GetLastError(); + if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + errCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language + (LPTSTR)&err, + 0, + NULL)) { + LOG(ERROR) << "Error calling SendInput(): Could not get error message (" << errCode << ")"; + } else { + LOG(ERROR) << "Error calling SendInput(): " << err; + } + } + delete ips; + } +} + +} diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.h b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.h new file mode 100644 index 0000000..70318a5 --- /dev/null +++ b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.h @@ -0,0 +1,19 @@ +#ifndef KEYBOARDINPUTWINDOWS_H +#define KEYBOARDINPUTWINDOWS_H + +#include "../KeyboardInput.h" + +// application namespace +namespace advsettings { + +class KeyboardInputWindows : public KeyboardInput +{ +public: + virtual void sendKeyboardInput(QString input) override; + virtual void sendKeyboardEnter() override; + virtual void sendKeyboardBackspace(int count) override; +}; + +} + +#endif // KEYBOARDINPUTWINDOWS_H