diff --git a/advancedSettings.pro b/advancedSettings.pro
index f33e46d..88e2033 100644
--- a/advancedSettings.pro
+++ b/advancedSettings.pro
@@ -41,6 +41,7 @@ SOURCES += src/main.cpp\
release/moc_UtilitiesTabController.cpp \
src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \
src/tabcontrollers/AccessibilityTabController.cpp \
+ src/overlaycontroller.cpp \
src/tabcontrollers/AudioTabController.cpp \
src/tabcontrollers/ChaperoneTabController.cpp \
src/tabcontrollers/FixFloorTabController.cpp \
@@ -77,6 +78,19 @@ HEADERS += src/overlaycontroller.h \
src/tabcontrollers/audiomanager/IPolicyConfig.h \
src/tabcontrollers/AccessibilityTabController.h \
src/tabcontrollers/AudioManager.h \
+ 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 \
@@ -98,13 +112,34 @@ HEADERS += src/overlaycontroller.h \
third-party/openvr/headers/openvr.h \
third-party/openvr/headers/openvr_capi.h \
third-party/openvr/headers/openvr_driver.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.cpp \
+ src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp
+ HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h \
+ src/tabcontrollers/keyboardinput/KeyboardInputWindows.h
+}
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
@@ -143,3 +178,5 @@ DISTFILES += \
src/res/qml/StatisticsPage.qml \
src/res/qml/SteamVRPage.qml \
src/res/qml/UtilitiesPage.qml
+win32:DESTDIR = bin/win64/AdvancedSettings
+unix:DESTDIR = bin/linux/AdvancedSettings
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/overlaycontroller.cpp b/src/overlaycontroller.cpp
index 6f15ba0..f4ded03 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() {
@@ -328,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;
@@ -337,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;
@@ -348,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);
@@ -357,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();
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/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/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/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..78c1541 100644
--- a/src/tabcontrollers/audiomanager/AudioManagerWindows.h
+++ b/src/tabcontrollers/audiomanager/AudioManagerWindows.h
@@ -1,10 +1,10 @@
#pragma once
-#include "../audiomanager.h"
+#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/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..dfa1518
--- /dev/null
+++ b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp
@@ -0,0 +1,141 @@
+#include "KeyboardInputWindows.h"
+#include
+#include "../../logging.h"
+
+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
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 {