Fix: prevent mobile web remote desktop freeze on Safari app-switch
by forcing clean WS reconnect on foreground return; add 30-second grace period on server to avoid cold-start on quick reconnects
This commit is contained in:
@@ -1814,6 +1814,16 @@ bool CWebService::StartRemoteDesktop(uint64_t device_id) {
|
||||
context* ctx = m_pParentDlg->FindHost(device_id);
|
||||
if (!ctx) return false;
|
||||
|
||||
// Cancel any pending grace-period close so the existing session stays alive.
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(m_PendingCloseMutex);
|
||||
auto it = m_PendingCloseTimers.find(device_id);
|
||||
if (it != m_PendingCloseTimers.end()) {
|
||||
it->second->store(true);
|
||||
m_PendingCloseTimers.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
// 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
|
||||
@@ -1854,11 +1864,36 @@ void CWebService::StopRemoteDesktop(uint64_t device_id) {
|
||||
}
|
||||
}
|
||||
|
||||
// If no more web clients watching, close only the Web session dialog
|
||||
// MFC dialogs remain open
|
||||
// If no more web clients watching, defer close by 30 s so a quick
|
||||
// mobile reconnect (e.g. switching to a TOTP app) reuses the existing
|
||||
// CScreenSpyDlg without a full cold-start.
|
||||
if (watchingCount == 0) {
|
||||
ClearWebTriggered(device_id);
|
||||
m_pParentDlg->CloseWebRemoteDesktopByClientID(device_id);
|
||||
auto cancelled = std::make_shared<std::atomic<bool>>(false);
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(m_PendingCloseMutex);
|
||||
auto it = m_PendingCloseTimers.find(device_id);
|
||||
if (it != m_PendingCloseTimers.end())
|
||||
it->second->store(true);
|
||||
m_PendingCloseTimers[device_id] = cancelled;
|
||||
}
|
||||
std::thread([this, device_id, cancelled]() {
|
||||
std::this_thread::sleep_for(std::chrono::seconds(30));
|
||||
if (cancelled->load()) return;
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(m_PendingCloseMutex);
|
||||
m_PendingCloseTimers.erase(device_id);
|
||||
}
|
||||
int count = 0;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_ClientsMutex);
|
||||
for (const auto& [ws, client] : m_Clients)
|
||||
if (client.watch_device_id == device_id) count++;
|
||||
}
|
||||
if (count == 0 && m_pParentDlg) {
|
||||
ClearWebTriggered(device_id);
|
||||
m_pParentDlg->CloseWebRemoteDesktopByClientID(device_id);
|
||||
}
|
||||
}).detach();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user