mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
add macos lock/unlock handler
This commit is contained in:
@@ -1,31 +1,28 @@
|
||||
# Define the current source/header locations
|
||||
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/events)
|
||||
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/events)
|
||||
|
||||
add_library(events
|
||||
${CURRENT_HEADER_DIR}/EventEnum.h
|
||||
${CURRENT_HEADER_DIR}/EventHandler.h
|
||||
${CURRENT_SOURCE_DIR}/EventHandler.cpp
|
||||
${CURRENT_HEADER_DIR}/OsEventHandler.h
|
||||
${CURRENT_SOURCE_DIR}/OsEventHandler.cpp
|
||||
${CMAKE_SOURCE_DIR}/include/events/EventEnum.h
|
||||
${CMAKE_SOURCE_DIR}/include/events/EventHandler.h
|
||||
${CMAKE_SOURCE_DIR}/include/events/OsEventHandler.h
|
||||
${CMAKE_SOURCE_DIR}/libsrc/events/EventHandler.cpp
|
||||
${CMAKE_SOURCE_DIR}/libsrc/events/OsEventHandler.cpp
|
||||
)
|
||||
|
||||
if (UNIX)
|
||||
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS DBus QUIET )
|
||||
if (Qt${QT_VERSION_MAJOR}DBus_FOUND)
|
||||
if(UNIX AND NOT APPLE)
|
||||
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS DBus QUIET)
|
||||
if(Qt${QT_VERSION_MAJOR}DBus_FOUND)
|
||||
target_link_libraries(events Qt${QT_VERSION_MAJOR}::DBus)
|
||||
if (NOT APPLE)
|
||||
target_compile_definitions(events PUBLIC HYPERION_HAS_DBUS)
|
||||
endif()
|
||||
target_compile_definitions(events PRIVATE HYPERION_HAS_DBUS)
|
||||
endif()
|
||||
endif(UNIX)
|
||||
endif()
|
||||
|
||||
target_link_libraries(events hyperion-utils)
|
||||
|
||||
if(APPLE)
|
||||
# find_library(FOUNDATION_LIBRARY Foundation REQUIRED)
|
||||
set_source_files_properties(OsEventHandler.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++")
|
||||
# target_link_libraries(events ${FOUNDATION_LIBRARY})
|
||||
# target_include_directories(events PRIVATE ${FOUNDATION_LIBRARY})
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
target_include_directories(events PUBLIC
|
||||
${CURRENT_HEADER_DIR}
|
||||
)
|
||||
|
||||
target_link_libraries(events
|
||||
hyperion-utils
|
||||
Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Widgets
|
||||
)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#include "OsEventHandler.h"
|
||||
#include "events/OsEventHandler.h"
|
||||
|
||||
#include <QtGlobal>
|
||||
#include <QJsonDocument>
|
||||
@@ -16,6 +16,8 @@
|
||||
#include <wtsapi32.h>
|
||||
|
||||
#pragma comment( lib, "wtsapi32.lib" )
|
||||
#elif defined(__APPLE__)
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#endif
|
||||
|
||||
OsEventHandlerBase::OsEventHandlerBase()
|
||||
@@ -447,43 +449,152 @@ void OsEventHandlerLinux::unregisterLockHandler()
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
|
||||
OsEventHandlerMacOS* OsEventHandlerMacOS::getInstance()
|
||||
OsEventHandlerMacOS::OsEventHandlerMacOS()
|
||||
: _sleepEventHandler(nullptr)
|
||||
, _lockEventHandler(nullptr)
|
||||
{
|
||||
static OsEventHandlerMacOS instance;
|
||||
return &instance;
|
||||
}
|
||||
|
||||
void OsEventHandlerMacOS::handleSignal (CFStringRef lock_unlock)
|
||||
@interface SleepEvents : NSObject
|
||||
{
|
||||
if (CFEqual(lock_unlock, CFSTR("com.apple.screenIsLocked")))
|
||||
OsEventHandlerMacOS *_eventHandler;
|
||||
}
|
||||
- (id)initSleepEvents:(OsEventHandlerMacOS *)osEventHandler;
|
||||
@end
|
||||
|
||||
@implementation SleepEvents
|
||||
- (id)initSleepEvents:(OsEventHandlerMacOS *)osEventHandler
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
lock(true);
|
||||
_eventHandler = osEventHandler;
|
||||
id notifCenter = [[NSWorkspace sharedWorkspace] notificationCenter];
|
||||
[notifCenter addObserver:self selector:@selector(receiveSleepWake:) name:NSWorkspaceWillSleepNotification object:nil];
|
||||
[notifCenter addObserver:self selector:@selector(receiveSleepWake:) name:NSWorkspaceDidWakeNotification object:nil];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
|
||||
_eventHandler = nullptr;
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) receiveSleepWake:(NSNotification*)notification
|
||||
{
|
||||
if (!_eventHandler) return;
|
||||
if (notification.name == NSWorkspaceWillSleepNotification)
|
||||
{
|
||||
_eventHandler->suspend(true);
|
||||
}
|
||||
else if (CFEqual(lock_unlock, CFSTR("com.apple.screenIsUnlocked")))
|
||||
else if (notification.name == NSWorkspaceDidWakeNotification)
|
||||
{
|
||||
_eventHandler->suspend(false);
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
||||
bool OsEventHandlerMacOS::registerOsEventHandler()
|
||||
{
|
||||
bool isRegistered {_isSuspendRegistered};
|
||||
if (!_isSuspendRegistered)
|
||||
{
|
||||
lock(false);
|
||||
_sleepEventHandler = [[SleepEvents alloc] initSleepEvents:this];
|
||||
if (_sleepEventHandler)
|
||||
{
|
||||
Debug(_log, "Registered for suspend/resume events");
|
||||
isRegistered = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Error(_log, "Could not register for suspend/resume events");
|
||||
}
|
||||
|
||||
if (isRegistered)
|
||||
{
|
||||
_isSuspendRegistered = true;
|
||||
}
|
||||
}
|
||||
return isRegistered;
|
||||
}
|
||||
|
||||
void OsEventHandlerMacOS::unregisterOsEventHandler()
|
||||
{
|
||||
if (_isSuspendRegistered && _sleepEventHandler)
|
||||
{
|
||||
[(SleepEvents *)_sleepEventHandler release], _sleepEventHandler = nil;
|
||||
if (!_sleepEventHandler)
|
||||
{
|
||||
Debug(_log, "Unregistered for suspend/resume events");
|
||||
_isSuspendRegistered = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Error(_log, "Could not unregister for suspend/resume events");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@interface LockEvents : NSObject
|
||||
{
|
||||
OsEventHandlerMacOS *_eventHandler;
|
||||
}
|
||||
- (id)initLockEvents:(OsEventHandlerMacOS *)osEventHandler;
|
||||
@end
|
||||
|
||||
@implementation LockEvents
|
||||
- (id)initLockEvents:(OsEventHandlerMacOS *)osEventHandler
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
_eventHandler = osEventHandler;
|
||||
id defCenter = [NSDistributedNotificationCenter defaultCenter];
|
||||
[defCenter addObserver:self selector:@selector(receiveLockUnlock:) name:@"com.apple.screenIsLocked" object:nil];
|
||||
[defCenter addObserver:self selector:@selector(receiveLockUnlock:) name:@"com.apple.screenIsUnlocked" object:nil];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
|
||||
_eventHandler = nullptr;
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) receiveLockUnlock:(NSNotification*)notification
|
||||
{
|
||||
if (!_eventHandler) return;
|
||||
if (CFEqual(notification.name, CFSTR("com.apple.screenIsLocked")))
|
||||
{
|
||||
_eventHandler->lock(true);
|
||||
}
|
||||
else if (CFEqual(notification.name, CFSTR("com.apple.screenIsUnlocked")))
|
||||
{
|
||||
_eventHandler->lock(false);
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
||||
bool OsEventHandlerMacOS::registerLockHandler()
|
||||
{
|
||||
bool isRegistered{ _isLockRegistered };
|
||||
if (!_isLockRegistered)
|
||||
{
|
||||
CFNotificationCenterRef distCenter;
|
||||
|
||||
distCenter = CFNotificationCenterGetDistributedCenter();
|
||||
if (distCenter != nullptr)
|
||||
_lockEventHandler = [[LockEvents alloc] initLockEvents:this];
|
||||
if (_lockEventHandler)
|
||||
{
|
||||
CFNotificationCenterAddObserver(distCenter, this, &OsEventHandlerMacOS::notificationCenterCallBack, lockSignal, nullptr, CFNotificationSuspensionBehaviorDeliverImmediately);
|
||||
CFNotificationCenterAddObserver(distCenter, this, &OsEventHandlerMacOS::notificationCenterCallBack, unlockSignal, nullptr, CFNotificationSuspensionBehaviorDeliverImmediately);
|
||||
Debug(_log, "Registered for lock/unlock events");
|
||||
isRegistered = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Error(_log, "Could not register for lock/unlock events!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (isRegistered)
|
||||
@@ -495,10 +606,18 @@ bool OsEventHandlerMacOS::registerLockHandler()
|
||||
|
||||
void OsEventHandlerMacOS::unregisterLockHandler()
|
||||
{
|
||||
if (_isLockRegistered)
|
||||
if (_isLockRegistered && _lockEventHandler)
|
||||
{
|
||||
CFNotificationCenterRemoveEveryObserver(CFNotificationCenterGetDistributedCenter(), this);
|
||||
_isLockRegistered = false;
|
||||
[(LockEvents *)_lockEventHandler release], _lockEventHandler = nil;
|
||||
if (!_lockEventHandler)
|
||||
{
|
||||
Debug(_log, "Unregistered for lock/unlock events");
|
||||
_isLockRegistered = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Error(_log, "Could not unregister for lock/unlock events");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user