From ac0df69c9b3e2c724737961458aefe0c5c58f580 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 8 Nov 2018 15:05:37 +0100 Subject: [PATCH 1/5] add dummy audio manager for non windows platforms --- advancedSettings.pro | 21 ++-- src/tabcontrollers/AudioTabController.cpp | 10 +- .../audiomanager/AudioManagerDummy.cpp | 118 ++++++++++++++++++ .../audiomanager/AudioManagerDummy.h | 42 +++++++ .../audiomanager/AudioManagerWindows.h | 2 +- 5 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 src/tabcontrollers/audiomanager/AudioManagerDummy.cpp create mode 100644 src/tabcontrollers/audiomanager/AudioManagerDummy.h diff --git a/advancedSettings.pro b/advancedSettings.pro index 43b9009..733fb36 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -22,11 +22,11 @@ SOURCES += src/main.cpp\ src/tabcontrollers/StatisticsTabController.cpp \ src/tabcontrollers/SteamVRTabController.cpp \ src/tabcontrollers/ReviveTabController.cpp \ - src/tabcontrollers/UtilitiesTabController.cpp \ - src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \ - src/tabcontrollers/PttController.cpp \ - src/tabcontrollers/AccessibilityTabController.cpp \ - src/utils/ChaperoneUtils.cpp + src/tabcontrollers/UtilitiesTabController.cpp \ + src/tabcontrollers/PttController.cpp \ + src/tabcontrollers/AccessibilityTabController.cpp \ + src/utils/ChaperoneUtils.cpp \ + src/tabcontrollers/audiomanager/AudioManagerDummy.cpp HEADERS += src/overlaycontroller.h \ src/logging.h \ @@ -39,12 +39,17 @@ HEADERS += src/overlaycontroller.h \ src/tabcontrollers/SteamVRTabController.h \ src/tabcontrollers/ReviveTabController.h \ src/tabcontrollers/UtilitiesTabController.h \ - src/tabcontrollers/AudioManager.h \ - src/tabcontrollers/audiomanager/AudioManagerWindows.h \ + src/tabcontrollers/AudioManager.h \ src/tabcontrollers/PttController.h \ src/tabcontrollers/AccessibilityTabController.h \ src/utils/Matrix.h \ - src/utils/ChaperoneUtils.h + src/utils/ChaperoneUtils.h \ + src/tabcontrollers/audiomanager/AudioManagerDummy.h + +win32 { + SOURCES += src/tabcontrollers/audiomanager/AudioManagerWindows.h + HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h +} INCLUDEPATH += third-party/openvr/headers \ third-party/easylogging++ diff --git a/src/tabcontrollers/AudioTabController.cpp b/src/tabcontrollers/AudioTabController.cpp index ce14633..fd82dc7 100644 --- a/src/tabcontrollers/AudioTabController.cpp +++ b/src/tabcontrollers/AudioTabController.cpp @@ -2,14 +2,22 @@ #include #include #include "../overlaycontroller.h" -#include "audiomanager/AudioManagerWindows.h" +#ifdef _WIN32 + #include "audiomanager/AudioManagerWindows.h" +#else + #include "audiomanager/AudioManagerDummy.h" +#endif // application namespace namespace advsettings { void AudioTabController::initStage1() { vr::EVRSettingsError vrSettingsError; + #ifdef _WIN32 audioManager.reset(new AudioManagerWindows()); + #else + audioManager.reset(new AudioManagerDummy()); + #endif audioManager->init(this); m_playbackDevices = audioManager->getPlaybackDevices(); m_recordingDevices = audioManager->getRecordingDevices(); diff --git a/src/tabcontrollers/audiomanager/AudioManagerDummy.cpp b/src/tabcontrollers/audiomanager/AudioManagerDummy.cpp new file mode 100644 index 0000000..2c3a612 --- /dev/null +++ b/src/tabcontrollers/audiomanager/AudioManagerDummy.cpp @@ -0,0 +1,118 @@ +#include "AudioManagerDummy.h" + +// application namespace +namespace advsettings { + +void AudioManagerDummy::init(AudioTabController *controller) +{ + // noop +} + +void AudioManagerDummy::setPlaybackDevice(const std::string &id, bool notify) +{ + // noop +} + +std::string AudioManagerDummy::getPlaybackDevName() +{ + return "dummy"; +} + +std::string AudioManagerDummy::getPlaybackDevId() +{ + return "dummy"; +} + +void AudioManagerDummy::setMirrorDevice(const std::string &id, bool notify) +{ + // noop +} + +bool AudioManagerDummy::isMirrorValid() +{ + return false; +} + +std::string AudioManagerDummy::getMirrorDevName() +{ + return "dummy"; +} + +std::string AudioManagerDummy::getMirrorDevId() +{ + return "dummy"; +} + +float AudioManagerDummy::getMirrorVolume() +{ + return 0; +} + +bool AudioManagerDummy::setMirrorVolume(float value) +{ + return false; +} + +bool AudioManagerDummy::getMirrorMuted() +{ + return true; +} + +bool AudioManagerDummy::setMirrorMuted(bool value) +{ + return false; +} + +bool AudioManagerDummy::isMicValid() +{ + return false; +} + +void AudioManagerDummy::setMicDevice(const std::string &id, bool notify) +{ + // noop +} + +std::string AudioManagerDummy::getMicDevName() +{ + return "dummy"; +} + +std::string AudioManagerDummy::getMicDevId() +{ + return "dummy"; +} + +float AudioManagerDummy::getMicVolume() +{ + return 0; +} + +bool AudioManagerDummy::setMicVolume(float value) +{ + return false; +} + +bool AudioManagerDummy::getMicMuted() +{ + return true; +} + +bool AudioManagerDummy::setMicMuted(bool value) +{ + return false; +} + +std::vector > AudioManagerDummy::getRecordingDevices() +{ + return {}; +} + +std::vector > AudioManagerDummy::getPlaybackDevices() +{ + return {}; +} + + + +} diff --git a/src/tabcontrollers/audiomanager/AudioManagerDummy.h b/src/tabcontrollers/audiomanager/AudioManagerDummy.h new file mode 100644 index 0000000..5094f10 --- /dev/null +++ b/src/tabcontrollers/audiomanager/AudioManagerDummy.h @@ -0,0 +1,42 @@ +#ifndef AUDIOMANAGERLINUX_H +#define AUDIOMANAGERLINUX_H + +#include "../AudioManager.h" + +// application namespace +namespace advsettings { + +class AudioManagerDummy : public AudioManager +{ +public: + + virtual void init(AudioTabController* controller) override; + + virtual void setPlaybackDevice(const std::string& id, bool notify = true) override; + virtual std::string getPlaybackDevName() override; + virtual std::string getPlaybackDevId() override; + + virtual void setMirrorDevice(const std::string& id, bool notify = true) override; + virtual bool isMirrorValid() override; + virtual std::string getMirrorDevName() override; + virtual std::string getMirrorDevId() override; + virtual float getMirrorVolume() override; + virtual bool setMirrorVolume(float value) override; + virtual bool getMirrorMuted() override; + virtual bool setMirrorMuted(bool value) override; + + virtual bool isMicValid() override; + virtual void setMicDevice(const std::string& id, bool notify = true) override; + virtual std::string getMicDevName() override; + virtual std::string getMicDevId() override; + virtual float getMicVolume() override; + virtual bool setMicVolume(float value) override; + virtual bool getMicMuted() override; + virtual bool setMicMuted(bool value) override; + + virtual std::vector> getRecordingDevices() override; + virtual std::vector> getPlaybackDevices() override; +}; + +} +#endif // AUDIOMANAGERLINUX_H diff --git a/src/tabcontrollers/audiomanager/AudioManagerWindows.h b/src/tabcontrollers/audiomanager/AudioManagerWindows.h index f0dba1a..d624564 100644 --- a/src/tabcontrollers/audiomanager/AudioManagerWindows.h +++ b/src/tabcontrollers/audiomanager/AudioManagerWindows.h @@ -1,6 +1,6 @@ #pragma once -#include "../audiomanager.h" +#include "../AudioManager.h" #include #include From 0c6a7ff498c61bced477a814aed63d1745ea75bc Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 8 Nov 2018 17:04:04 +0100 Subject: [PATCH 2/5] split keyboard input logic into platform specific code --- advancedSettings.pro | 69 +++++---- src/tabcontrollers/KeyboardInput.h | 22 +++ src/tabcontrollers/UtilitiesTabController.cpp | 136 ++--------------- src/tabcontrollers/UtilitiesTabController.h | 4 + .../keyboardinput/KeyboardInputDummy.cpp | 20 +++ .../keyboardinput/KeyboardInputDummy.h | 19 +++ .../keyboardinput/KeyboardInputWindows.cpp | 140 ++++++++++++++++++ .../keyboardinput/KeyboardInputWindows.h | 19 +++ 8 files changed, 274 insertions(+), 155 deletions(-) create mode 100644 src/tabcontrollers/KeyboardInput.h create mode 100644 src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp create mode 100644 src/tabcontrollers/keyboardinput/KeyboardInputDummy.h create mode 100644 src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp create mode 100644 src/tabcontrollers/keyboardinput/KeyboardInputWindows.h 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 From 20853df59493eacd5bca4157bb6aee0c5b4cbf05 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 8 Nov 2018 17:05:15 +0100 Subject: [PATCH 3/5] fix building under linux --- advancedSettings.pro | 7 ++++--- src/overlaycontroller.cpp | 2 ++ src/tabcontrollers/ChaperoneTabController.cpp | 1 + src/utils/ChaperoneUtils.cpp | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/advancedSettings.pro b/advancedSettings.pro index be0e6fa..faf9b2d 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -59,8 +59,9 @@ win32 { INCLUDEPATH += third-party/openvr/headers \ third-party/easylogging++ -win32:LIBS += -L"$$PWD/third-party/openvr/lib/win64" +win32:LIBS += -L"$$PWD/third-party/openvr/lib/win64" -luser32 -lole32 unix:LIBS += -L"$$PWD/third-party/openvr/lib/linux64" -LIBS += -lopenvr_api -luser32 -lole32 +LIBS += -lopenvr_api -DESTDIR = bin/win64/AdvancedSettings +win32:DESTDIR = bin/win64/AdvancedSettings +unix:DESTDIR = bin/linux/AdvancedSettings diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 134434b..bba2a2d 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -28,6 +28,8 @@ namespace advsettings { std::unique_ptr OverlayController::singleton; +constexpr const char* OverlayController::applicationVersionString; + QSettings* OverlayController::_appSettings = nullptr; OverlayController::~OverlayController() { diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index 9895d86..cbde2e2 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -1,6 +1,7 @@ #include "ChaperoneTabController.h" #include #include "../overlaycontroller.h" +#include // application namespace namespace advsettings { diff --git a/src/utils/ChaperoneUtils.cpp b/src/utils/ChaperoneUtils.cpp index 21476dd..a0cbf6c 100644 --- a/src/utils/ChaperoneUtils.cpp +++ b/src/utils/ChaperoneUtils.cpp @@ -1,6 +1,7 @@ #include "ChaperoneUtils.h" #include +#include namespace utils { From 93b7baff388697ff5e77757dbc42a32efe6148a0 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 8 Nov 2018 19:11:18 +0100 Subject: [PATCH 4/5] fix windows build --- advancedSettings.pro | 2 +- advancedSettings.pro.user.e9f45e7 | 318 ++++++++++++++++++ .../audiomanager/AudioManagerWindows.h | 8 +- .../keyboardinput/KeyboardInputWindows.cpp | 1 + 4 files changed, 324 insertions(+), 5 deletions(-) create mode 100644 advancedSettings.pro.user.e9f45e7 diff --git a/advancedSettings.pro b/advancedSettings.pro index faf9b2d..c6ac0e2 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -29,7 +29,7 @@ SOURCES += src/main.cpp\ src/tabcontrollers/audiomanager/AudioManagerDummy.cpp \ src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp -HEADERS += src/overlaycontroller.h \ +HEADERS += src/overlaycontroller.h \ src/logging.h \ src/tabcontrollers/AudioTabController.h \ src/tabcontrollers/ChaperoneTabController.h \ diff --git a/advancedSettings.pro.user.e9f45e7 b/advancedSettings.pro.user.e9f45e7 new file mode 100644 index 0000000..ab2fa5e --- /dev/null +++ b/advancedSettings.pro.user.e9f45e7 @@ -0,0 +1,318 @@ + + + + + + EnvironmentId + {e9f45e75-3f05-4ad6-a0dc-8a090aa48e0b} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.10.1 MSVC2017 64bit + Desktop Qt 5.10.1 MSVC2017 64bit + qt.qt5.5101.win64_msvc2017_64_kit + 0 + 0 + 0 + + C:/Users/robin/Documents/build-advancedSettings-Desktop_Qt_5_10_1_MSVC2017_64bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + C:/Users/robin/Documents/build-advancedSettings-Desktop_Qt_5_10_1_MSVC2017_64bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + C:/Users/robin/Documents/build-advancedSettings-Desktop_Qt_5_10_1_MSVC2017_64bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + advancedSettings + advancedSettings2 + Qt4ProjectManager.Qt4RunConfiguration://192.168.1.165/win10/OpenVR-AdvancedSettings/advancedSettings.pro + true + + advancedSettings.pro + false + + C:/Users/robin/Documents/build-advancedSettings-Desktop_Qt_5_10_1_MSVC2017_64bit-Debug/bin/win64/AdvancedSettings + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/src/tabcontrollers/audiomanager/AudioManagerWindows.h b/src/tabcontrollers/audiomanager/AudioManagerWindows.h index d624564..78c1541 100644 --- a/src/tabcontrollers/audiomanager/AudioManagerWindows.h +++ b/src/tabcontrollers/audiomanager/AudioManagerWindows.h @@ -2,9 +2,9 @@ #include "../AudioManager.h" -#include -#include -#include +#include +#include +#include #include "IPolicyConfig.h" #include @@ -26,7 +26,7 @@ private: IPolicyConfig* policyConfig = nullptr; public: - ~AudioManagerWindows(); + ~AudioManagerWindows() override; virtual void init(AudioTabController* controller) override; diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp index 8410b65..dfa1518 100644 --- a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp +++ b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp @@ -1,5 +1,6 @@ #include "KeyboardInputWindows.h" #include +#include "../../logging.h" namespace advsettings { From dcf33f1384421ccfb252cd98621e606579b95f75 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 9 Nov 2018 00:58:38 +0100 Subject: [PATCH 5/5] fix mouse coordinates under linux --- src/overlaycontroller.cpp | 15 ++++++++++++--- src/overlaycontroller.h | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index bba2a2d..ed7bdcb 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -330,6 +330,15 @@ bool OverlayController::pollNextEvent(vr::VROverlayHandle_t ulOverlayHandle, vr: } } +QPoint OverlayController::getMousePositionForEvent(vr::VREvent_Mouse_t mouse) { + float y = mouse.y; +#ifdef __linux__ + float h = (float) m_pWindow->height(); + y = h - y; +#endif + return QPoint(mouse.x, y); +} + void OverlayController::OnTimeoutPumpEvents() { if (!vr::VRSystem()) return; @@ -339,7 +348,7 @@ void OverlayController::OnTimeoutPumpEvents() { while (pollNextEvent(m_ulOverlayHandle, &vrEvent)) { switch (vrEvent.eventType) { case vr::VREvent_MouseMove: { - QPoint ptNewMouse(vrEvent.data.mouse.x, vrEvent.data.mouse.y); + QPoint ptNewMouse = getMousePositionForEvent(vrEvent.data.mouse); if (ptNewMouse != m_ptLastMouse) { QMouseEvent mouseEvent( QEvent::MouseMove, ptNewMouse, m_pWindow->mapToGlobal(ptNewMouse), Qt::NoButton, m_lastMouseButtons, 0 ); m_ptLastMouse = ptNewMouse; @@ -350,7 +359,7 @@ void OverlayController::OnTimeoutPumpEvents() { break; case vr::VREvent_MouseButtonDown: { - QPoint ptNewMouse(vrEvent.data.mouse.x, vrEvent.data.mouse.y); + QPoint ptNewMouse = getMousePositionForEvent(vrEvent.data.mouse); Qt::MouseButton button = vrEvent.data.mouse.button == vr::VRMouseButton_Right ? Qt::RightButton : Qt::LeftButton; m_lastMouseButtons |= button; QMouseEvent mouseEvent(QEvent::MouseButtonPress, ptNewMouse, m_pWindow->mapToGlobal(ptNewMouse), button, m_lastMouseButtons, 0); @@ -359,7 +368,7 @@ void OverlayController::OnTimeoutPumpEvents() { break; case vr::VREvent_MouseButtonUp: { - QPoint ptNewMouse(vrEvent.data.mouse.x, vrEvent.data.mouse.y); + QPoint ptNewMouse = getMousePositionForEvent(vrEvent.data.mouse); Qt::MouseButton button = vrEvent.data.mouse.button == vr::VRMouseButton_Right ? Qt::RightButton : Qt::LeftButton; m_lastMouseButtons &= ~button; QMouseEvent mouseEvent(QEvent::MouseButtonRelease, ptNewMouse, m_pWindow->mapToGlobal(ptNewMouse), button, m_lastMouseButtons, 0); diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h index f3aead5..257d0db 100644 --- a/src/overlaycontroller.h +++ b/src/overlaycontroller.h @@ -90,7 +90,8 @@ public: // I know it's an ugly hack to make them public to enable external acces AccessibilityTabController accessibilityTabController; private: - OverlayController(bool desktopMode, bool noSound) : QObject(), desktopMode(desktopMode), noSound(noSound) {} + OverlayController(bool desktopMode, bool noSound) : QObject(), desktopMode(desktopMode), noSound(noSound) {} + QPoint getMousePositionForEvent(vr::VREvent_Mouse_t mouse); public: virtual ~OverlayController();