Fix: Ensure MFC and Web remote desktop sessions are fully independent
This commit is contained in:
@@ -1652,9 +1652,13 @@ bool CWebService::StartRemoteDesktop(uint64_t device_id) {
|
||||
context* ctx = m_pParentDlg->FindHost(device_id);
|
||||
if (!ctx) return false;
|
||||
|
||||
// Close any existing remote desktop for this device first
|
||||
// This prevents duplicate dialogs when user reconnects quickly
|
||||
m_pParentDlg->CloseRemoteDesktopByClientID(device_id);
|
||||
// Check if there's already a Web session for this device
|
||||
// Only reuse if Web has already triggered AND a Web dialog exists
|
||||
// This ensures MFC and Web have independent dialogs
|
||||
if (IsWebTriggered(device_id) && HasActiveSession(device_id)) {
|
||||
Mprintf("[WebService] Reusing existing Web session for device %llu\n", device_id);
|
||||
return true; // Web session exists, new web user joins watching
|
||||
}
|
||||
|
||||
// Mark as web-triggered (dialog should be hidden)
|
||||
{
|
||||
@@ -1663,7 +1667,8 @@ bool CWebService::StartRemoteDesktop(uint64_t device_id) {
|
||||
}
|
||||
|
||||
// Send COMMAND_SCREEN_SPY with H264 algorithm
|
||||
// Format: [COMMAND_SCREEN_SPY:1][DXGI:1][Algorithm:1][MultiScreen:1]
|
||||
// If client is already capturing (MFC opened first), it will re-send TOKEN_BITMAPINFO
|
||||
// This creates a new hidden Web dialog while MFC dialog remains visible
|
||||
BYTE bToken[32] = { 0 };
|
||||
bToken[0] = COMMAND_SCREEN_SPY;
|
||||
bToken[1] = 0; // DXGI mode: 0=GDI
|
||||
@@ -1687,10 +1692,11 @@ void CWebService::StopRemoteDesktop(uint64_t device_id) {
|
||||
}
|
||||
}
|
||||
|
||||
// If no more web clients watching, close the remote desktop
|
||||
// If no more web clients watching, close only the Web session dialog
|
||||
// MFC dialogs remain open
|
||||
if (watchingCount == 0) {
|
||||
ClearWebTriggered(device_id);
|
||||
m_pParentDlg->CloseRemoteDesktopByClientID(device_id);
|
||||
m_pParentDlg->CloseWebRemoteDesktopByClientID(device_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1706,10 +1712,13 @@ void CWebService::RegisterScreenContext(uint64_t device_id, CONTEXT_OBJECT* ctx)
|
||||
}
|
||||
|
||||
void CWebService::UnregisterScreenContext(uint64_t device_id) {
|
||||
if (!m_bRunning) return;
|
||||
// Always clean up, even if WebService is stopping
|
||||
// This prevents stale pointers in m_ScreenContexts
|
||||
std::lock_guard<std::mutex> lock(m_ScreenContextsMutex);
|
||||
m_ScreenContexts.erase(device_id);
|
||||
Mprintf("[WebService] Unregistered screen context for device %llu\n", device_id);
|
||||
if (m_bRunning) {
|
||||
Mprintf("[WebService] Unregistered screen context for device %llu\n", device_id);
|
||||
}
|
||||
}
|
||||
|
||||
CONTEXT_OBJECT* CWebService::GetScreenContext(uint64_t device_id) {
|
||||
@@ -1809,6 +1818,26 @@ void CWebService::ClearWebTriggered(uint64_t device_id) {
|
||||
m_WebTriggeredDevices.erase(device_id);
|
||||
}
|
||||
|
||||
void CWebService::SetMfcTriggered(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_MfcTriggeredMutex);
|
||||
m_MfcTriggeredDevices.insert(device_id);
|
||||
}
|
||||
|
||||
bool CWebService::IsMfcTriggered(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_MfcTriggeredMutex);
|
||||
return m_MfcTriggeredDevices.find(device_id) != m_MfcTriggeredDevices.end();
|
||||
}
|
||||
|
||||
void CWebService::ClearMfcTriggered(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_MfcTriggeredMutex);
|
||||
m_MfcTriggeredDevices.erase(device_id);
|
||||
}
|
||||
|
||||
bool CWebService::HasActiveSession(uint64_t device_id) {
|
||||
std::lock_guard<std::mutex> lock(m_ScreenContextsMutex);
|
||||
return m_ScreenContexts.find(device_id) != m_ScreenContexts.end();
|
||||
}
|
||||
|
||||
void CWebService::NotifyDeviceUpdate(uint64_t device_id, const std::string& rtt, const std::string& activeWindow) {
|
||||
if (!m_bRunning || m_bStopping) return;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user