Fix: Wake display on remote desktop start when macOS is locked

This commit is contained in:
yuanyuanxiang
2026-05-02 00:42:23 +02:00
parent fd3838a151
commit 8ed9ba8426

View File

@@ -5,6 +5,7 @@
#import "../common/commands.h" #import "../common/commands.h"
#import "Permissions.h" #import "Permissions.h"
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#import <chrono>
#import <CoreGraphics/CoreGraphics.h> #import <CoreGraphics/CoreGraphics.h>
#import <ApplicationServices/ApplicationServices.h> #import <ApplicationServices/ApplicationServices.h>
#import <mach/mach_time.h> #import <mach/mach_time.h>
@@ -104,6 +105,51 @@ bool ScreenHandler::init()
m_currFrame.resize(m_bmpHeader.biSizeImage, 0); m_currFrame.resize(m_bmpHeader.biSizeImage, 0);
m_diffBuffer.resize(1 + 1 + 8 + 1 + m_bmpHeader.biSizeImage * 2); m_diffBuffer.resize(1 + 1 + 8 + 1 + m_bmpHeader.biSizeImage * 2);
// Wake display if needed (do this early, before sending TOKEN_BITMAPINFO)
bool wasAsleep = CGDisplayIsAsleep(m_displayID);
bool isLocked = false;
CFDictionaryRef sessionInfo = CGSessionCopyCurrentDictionary();
if (sessionInfo) {
CFBooleanRef screenLocked = (CFBooleanRef)CFDictionaryGetValue(
sessionInfo, CFSTR("CGSSessionScreenIsLocked"));
if (screenLocked && CFBooleanGetValue(screenLocked)) {
isLocked = true;
}
CFRelease(sessionInfo);
}
if (wasAsleep || isLocked) {
NSLog(@"Waking display in init (asleep=%d, locked=%d)...", wasAsleep, isLocked);
// Create NoDisplaySleep assertion - this wakes the display
if (m_displayAssertionID == 0) {
IOReturn result = IOPMAssertionCreateWithName(
kIOPMAssertionTypeNoDisplaySleep,
kIOPMAssertionLevelOn,
CFSTR("SimpleRemoter - remote desktop session active"),
&m_displayAssertionID
);
if (result == kIOReturnSuccess) {
NSLog(@"Display assertion created (ID: %u)", m_displayAssertionID);
}
}
// Declare user activity to ensure wake
IOPMAssertionID wakeAssertionID = 0;
IOPMAssertionDeclareUserActivity(
CFSTR("SimpleRemoter - waking display"),
kIOPMUserActiveLocal,
&wakeAssertionID
);
if (wakeAssertionID) {
IOPMAssertionRelease(wakeAssertionID);
}
// Brief wait for loginwindow to render
std::this_thread::sleep_for(std::chrono::milliseconds(500));
NSLog(@"Display wake complete");
}
NSLog(@"ScreenHandler initialized: %dx%d", m_width, m_height); NSLog(@"ScreenHandler initialized: %dx%d", m_width, m_height);
return true; return true;
} }
@@ -116,7 +162,7 @@ void ScreenHandler::start(IOCPClient* client, uint64_t clientID)
m_clientID = clientID; m_clientID = clientID;
m_running = true; m_running = true;
// Prevent display sleep during remote desktop session // Display wake was already done in init(), just ensure assertion exists
if (m_displayAssertionID == 0) { if (m_displayAssertionID == 0) {
IOReturn result = IOPMAssertionCreateWithName( IOReturn result = IOPMAssertionCreateWithName(
kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionTypeNoDisplaySleep,
@@ -125,9 +171,7 @@ void ScreenHandler::start(IOCPClient* client, uint64_t clientID)
&m_displayAssertionID &m_displayAssertionID
); );
if (result == kIOReturnSuccess) { if (result == kIOReturnSuccess) {
NSLog(@"Display sleep disabled for remote desktop (ID: %u)", m_displayAssertionID); NSLog(@"Display sleep disabled (ID: %u)", m_displayAssertionID);
} else {
NSLog(@"Warning: Failed to prevent display sleep (error: 0x%x)", result);
} }
} }