merged IceWind's most recent changes

This commit is contained in:
ykeara
2018-11-25 20:46:29 -06:00
17 changed files with 787 additions and 135 deletions
+14 -3
View File
@@ -28,6 +28,8 @@ namespace advsettings {
std::unique_ptr<OverlayController> 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);
+2 -1
View File
@@ -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();
+9 -1
View File
@@ -2,14 +2,22 @@
#include <QQuickWindow>
#include <QApplication>
#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();
@@ -1,6 +1,7 @@
#include "ChaperoneTabController.h"
#include <QQuickWindow>
#include "../overlaycontroller.h"
#include <math.h>
// application namespace
namespace advsettings {
+22
View File
@@ -0,0 +1,22 @@
#pragma once
#include <vector>
#include <QString>
// 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;
};
}
+13 -123
View File
@@ -2,8 +2,12 @@
#include <QQuickWindow>
#include <QApplication>
#include "../overlaycontroller.h"
#include <Windows.h>
#include <thread>
#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);
}
@@ -4,6 +4,8 @@
#include <QObject>
#include <QTime>
#include <openvr.h>
#include <memory>
#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> keyboardInput;
public:
void initStage1();
void initStage2(OverlayController* parent, QQuickWindow* widget);
@@ -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<std::pair<std::string, std::string> > AudioManagerDummy::getRecordingDevices()
{
return {};
}
std::vector<std::pair<std::string, std::string> > AudioManagerDummy::getPlaybackDevices()
{
return {};
}
}
@@ -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<std::pair<std::string, std::string>> getRecordingDevices() override;
virtual std::vector<std::pair<std::string, std::string>> getPlaybackDevices() override;
};
}
#endif // AUDIOMANAGERLINUX_H
@@ -1,10 +1,10 @@
#pragma once
#include "../audiomanager.h"
#include "../AudioManager.h"
#include <Mmdeviceapi.h>
#include <Functiondiscoverykeys_devpkey.h>
#include <Endpointvolume.h>
#include <mmdeviceapi.h>
#include <functiondiscoverykeys_devpkey.h>
#include <endpointvolume.h>
#include "IPolicyConfig.h"
#include <mutex>
@@ -26,7 +26,7 @@ private:
IPolicyConfig* policyConfig = nullptr;
public:
~AudioManagerWindows();
~AudioManagerWindows() override;
virtual void init(AudioTabController* controller) override;
@@ -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
}
}
@@ -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
@@ -0,0 +1,141 @@
#include "KeyboardInputWindows.h"
#include <Windows.h>
#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;
}
}
}
@@ -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
+1
View File
@@ -1,6 +1,7 @@
#include "ChaperoneUtils.h"
#include <iostream>
#include <math.h>
namespace utils {