Fix Windows

This commit is contained in:
Lord-Grey 2023-11-02 22:11:33 +01:00
parent 7d3f13c7b5
commit b1c8534cb7
2 changed files with 59 additions and 37 deletions

View File

@ -5,14 +5,28 @@
#include <QJsonObject> #include <QJsonObject>
#include <hyperion/HyperionIManager.h> #include <hyperion/HyperionIManager.h>
#include <utils/Logger.h>
#include <iostream> #include <iostream>
#if defined(_WIN32)
#include <QCoreApplication>
#include <QWidget>
#include <windows.h>
#include <wtsapi32.h>
#pragma comment( lib, "wtsapi32.lib" )
#endif
SuspendHandlerBase::SuspendHandlerBase() SuspendHandlerBase::SuspendHandlerBase()
: _isSuspendEnabled(false) : _isSuspendEnabled(false)
, _isLockEnabled(false) , _isLockEnabled(false)
, _isSuspendApiEnabled(false)
, _isIdleApiEnabled(false)
, _isSuspendOnLock(false) , _isSuspendOnLock(false)
, _isSuspendRegistered(false) , _isSuspendRegistered(false)
, _isLockRegistered(false) , _isLockRegistered(false)
, _isSuspendApiRegistered(false)
, _isIdleApiRegistered(false)
, _isSuspended(false) , _isSuspended(false)
, _isIdle(false) , _isIdle(false)
, _isLocked (false) , _isLocked (false)
@ -90,11 +104,10 @@ void SuspendHandlerBase::handleSettingsUpdate(settings::type type, const QJsonDo
bool SuspendHandlerBase::registerSuspendHandler() bool SuspendHandlerBase::registerSuspendHandler()
{ {
Debug(_log, "_isSuspendRegistered: %d", _isSuspendRegistered);
if (!_isSuspendRegistered) if (!_isSuspendRegistered)
{ {
connect(this, &SuspendHandlerBase::suspendEvent, HyperionIManager::getInstance(), &HyperionIManager::suspend); QObject::connect(this, &SuspendHandlerBase::suspendEvent, HyperionIManager::getInstance(), &HyperionIManager::suspend);
connect(this, &SuspendHandlerBase::resumeEvent, HyperionIManager::getInstance(), &HyperionIManager::resume); QObject::connect(this, &SuspendHandlerBase::resumeEvent, HyperionIManager::getInstance(), &HyperionIManager::resume);
Info(_log, "Registered for suspend/resume events."); Info(_log, "Registered for suspend/resume events.");
_isSuspendRegistered = true; _isSuspendRegistered = true;
} }
@ -105,8 +118,8 @@ void SuspendHandlerBase::unregisterSuspendHandler()
{ {
if (_isSuspendRegistered) if (_isSuspendRegistered)
{ {
disconnect(this, &SuspendHandlerBase::suspendEvent, HyperionIManager::getInstance(), &HyperionIManager::suspend); QObject::disconnect(this, &SuspendHandlerBase::suspendEvent, HyperionIManager::getInstance(), &HyperionIManager::suspend);
disconnect(this, &SuspendHandlerBase::resumeEvent, HyperionIManager::getInstance(), &HyperionIManager::resume); QObject::disconnect(this, &SuspendHandlerBase::resumeEvent, HyperionIManager::getInstance(), &HyperionIManager::resume);
Info(_log, "Unregistered for suspend/resume events."); Info(_log, "Unregistered for suspend/resume events.");
_isSuspendRegistered = false; _isSuspendRegistered = false;
} }
@ -114,16 +127,16 @@ void SuspendHandlerBase::unregisterSuspendHandler()
bool SuspendHandlerBase::registerLockHandler() bool SuspendHandlerBase::registerLockHandler()
{ {
disconnect(this, &SuspendHandlerBase::lockedEvent,nullptr, nullptr); QObject::disconnect(this, &SuspendHandlerBase::lockedEvent,nullptr, nullptr);
if (_isSuspendOnLock) if (_isSuspendOnLock)
{ {
connect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleSuspend); QObject::connect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleSuspend);
} }
else else
{ {
connect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle); QObject::connect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle);
} }
connect(this, &SuspendHandlerBase::idleEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle); QObject::connect(this, &SuspendHandlerBase::idleEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle);
Info(_log, "Registered for lock/unlock events. %s on lock event.", _isSuspendOnLock ? "Suspend" : "Idle"); Info(_log, "Registered for lock/unlock events. %s on lock event.", _isSuspendOnLock ? "Suspend" : "Idle");
_isLockRegistered = true; _isLockRegistered = true;
return true; return true;
@ -133,9 +146,9 @@ void SuspendHandlerBase::unregisterLockHandler()
{ {
if (_isLockRegistered) if (_isLockRegistered)
{ {
disconnect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleSuspend); QObject::disconnect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleSuspend);
disconnect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle); QObject::disconnect(this, &SuspendHandlerBase::lockedEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle);
disconnect(this, &SuspendHandlerBase::idleEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle); QObject::disconnect(this, &SuspendHandlerBase::idleEvent, HyperionIManager::getInstance(), &HyperionIManager::toggleIdle);
Info(_log, "Unregistered for lock/unlock events."); Info(_log, "Unregistered for lock/unlock events.");
_isLockRegistered = false; _isLockRegistered = false;
} }
@ -146,8 +159,8 @@ bool SuspendHandlerBase::registerSuspendApiHandler()
{ {
if (!_isSuspendApiRegistered) if (!_isSuspendApiRegistered)
{ {
connect(HyperionIManager::getInstance(), &HyperionIManager::triggerSuspend, this, QOverload<bool>::of(&SuspendHandler::suspend)); QObject::connect(HyperionIManager::getInstance(), &HyperionIManager::triggerSuspend, this, QOverload<bool>::of(&SuspendHandler::suspend));
connect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleSuspend, this, &SuspendHandler::toggleSuspend); QObject::connect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleSuspend, this, &SuspendHandler::toggleSuspend);
Info(_log, "Registered for suspend/resume API events."); Info(_log, "Registered for suspend/resume API events.");
_isSuspendApiRegistered = true; _isSuspendApiRegistered = true;
} }
@ -158,8 +171,8 @@ void SuspendHandlerBase::unregisterSuspendApiHandler()
{ {
if (_isSuspendApiRegistered) if (_isSuspendApiRegistered)
{ {
disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerSuspend, this, QOverload<bool>::of(&SuspendHandler::suspend)); QObject::disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerSuspend, this, QOverload<bool>::of(&SuspendHandler::suspend));
disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleSuspend, this, &SuspendHandler::toggleSuspend); QObject::disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleSuspend, this, &SuspendHandler::toggleSuspend);
Info(_log, "Unregistered for suspend/resume API events."); Info(_log, "Unregistered for suspend/resume API events.");
_isSuspendApiRegistered = false; _isSuspendApiRegistered = false;
} }
@ -169,8 +182,8 @@ bool SuspendHandlerBase::registerIdleApiHandler()
{ {
if (!_isIdleApiRegistered) if (!_isIdleApiRegistered)
{ {
connect(HyperionIManager::getInstance(), &HyperionIManager::triggerIdle, this, &SuspendHandler::idle); QObject::connect(HyperionIManager::getInstance(), &HyperionIManager::triggerIdle, this, &SuspendHandler::idle);
connect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleIdle, this, &SuspendHandler::toggleIdle); QObject::connect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleIdle, this, &SuspendHandler::toggleIdle);
Info(_log, "Registered for idle API events."); Info(_log, "Registered for idle API events.");
_isIdleApiRegistered = true; _isIdleApiRegistered = true;
} }
@ -181,8 +194,8 @@ void SuspendHandlerBase::unregisterIdleApiHandler()
{ {
if (_isIdleApiRegistered) if (_isIdleApiRegistered)
{ {
disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerIdle, this, &SuspendHandler::idle); QObject::disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerIdle, this, &SuspendHandler::idle);
disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleIdle, this, &SuspendHandler::toggleIdle); QObject::disconnect(HyperionIManager::getInstance(), &HyperionIManager::triggerToggleIdle, this, &SuspendHandler::toggleIdle);
Info(_log, "Unregistered for idle API events."); Info(_log, "Unregistered for idle API events.");
_isIdleApiRegistered = false; _isIdleApiRegistered = false;
} }
@ -314,14 +327,9 @@ void SuspendHandlerBase::lock(bool isLocked)
} }
#if defined(_WIN32) #if defined(_WIN32)
#include <QCoreApplication>
#include <QWidget>
#include <windows.h>
#include <wtsapi32.h>
#pragma comment( lib, "wtsapi32.lib" )
SuspendHandlerWindows::SuspendHandlerWindows() SuspendHandlerWindows::SuspendHandlerWindows()
: _notifyHandle(NULL)
{ {
} }
@ -374,7 +382,7 @@ bool SuspendHandlerWindows::nativeEventFilter(const QByteArray& eventType, void*
bool SuspendHandlerWindows::registerSuspendHandler() bool SuspendHandlerWindows::registerSuspendHandler()
{ {
bool isRegistered {false}; bool isRegistered{ _isSuspendRegistered };
if (!_isSuspendRegistered) if (!_isSuspendRegistered)
{ {
auto handle = reinterpret_cast<HWND> (_widget.winId()); auto handle = reinterpret_cast<HWND> (_widget.winId());
@ -382,12 +390,16 @@ bool SuspendHandlerWindows::registerSuspendHandler()
if (_notifyHandle != NULL) if (_notifyHandle != NULL)
{ {
QCoreApplication::instance()->installNativeEventFilter(this); QCoreApplication::instance()->installNativeEventFilter(this);
isRegistered = SuspendHandlerBase::registerSuspendHandler();
} }
else else
{ {
Error(_log, "Could not register for suspend/resume events!"); Error(_log, "Could not register for suspend/resume events!");
} }
if (isRegistered)
{
isRegistered = SuspendHandlerBase::registerSuspendHandler();
}
} }
return isRegistered; return isRegistered;
} }
@ -408,18 +420,25 @@ void SuspendHandlerWindows::unregisterSuspendHandler()
bool SuspendHandlerWindows::registerLockHandler() bool SuspendHandlerWindows::registerLockHandler()
{ {
bool isRegistered {false}; bool isRegistered{ _isLockRegistered };
if (!_isLockRegistered) if (!_isLockRegistered)
{ {
auto handle = reinterpret_cast<HWND> (_widget.winId()); auto handle = reinterpret_cast<HWND> (_widget.winId());
if (WTSRegisterSessionNotification(handle, NOTIFY_FOR_THIS_SESSION)) if (WTSRegisterSessionNotification(handle, NOTIFY_FOR_THIS_SESSION))
{ {
isRegistered = SuspendHandlerBase::registerLockHandler(); isRegistered = true;
} }
else else
{ {
Error(_log, "Could not register for lock/unlock events!"); Error(_log, "Could not register for lock/unlock events!");
} }
}
if (isRegistered)
{
isRegistered = SuspendHandlerBase::registerLockHandler();
} }
return isRegistered; return isRegistered;
} }

View File

@ -3,6 +3,13 @@
#include <QObject> #include <QObject>
#include <QJsonDocument> #include <QJsonDocument>
#if defined(_WIN32)
#include <QAbstractNativeEventFilter>
#include <QAbstractEventDispatcher>
#include <QWidget>
#include <windows.h>
#endif
#include <utils/settings.h> #include <utils/settings.h>
class Logger; class Logger;
@ -12,7 +19,7 @@ class SuspendHandlerBase : public QObject {
public: public:
SuspendHandlerBase(); SuspendHandlerBase();
virtual ~SuspendHandlerBase() override; ~SuspendHandlerBase() override;
public slots: public slots:
@ -69,10 +76,6 @@ private:
}; };
#if defined(_WIN32) #if defined(_WIN32)
#include <QAbstractNativeEventFilter>
#include <QAbstractEventDispatcher>
#include <QWidget>
#include <windows.h>
class SuspendHandlerWindows : public SuspendHandlerBase, public QAbstractNativeEventFilter { class SuspendHandlerWindows : public SuspendHandlerBase, public QAbstractNativeEventFilter {
@ -90,8 +93,8 @@ protected:
private: private:
bool registerSuspendHandler() override; bool registerSuspendHandler() override;
bool unregisterSuspendHandler() override; void unregisterSuspendHandler() override;
void registerLockHandler() override; bool registerLockHandler() override;
void unregisterLockHandler() override; void unregisterLockHandler() override;
QWidget _widget; QWidget _widget;