[feat] add macOS privacy screen and keep remote sessions running

This commit is contained in:
kunkundi
2026-09-13 00:38:40 +08:00
parent 23bf2ff8b8
commit a6e325f190
38 changed files with 1161 additions and 1046 deletions
@@ -18,38 +18,33 @@ struct PrivacyControlState {
bool enabled = false;
bool off = false;
bool unsupported = false;
bool warning = false;
bool stale = false;
bool timeout = false;
bool can_toggle = false;
};
// Use the same host-confirmed state for presentation and command admission.
// An engaged or failed screen can still be disabled when its status goes stale.
// Missing confirmation or a failure makes only this toolbar control unavailable.
inline PrivacyControlState GetPrivacyControlState(
const PrivacyStatus& status, bool received, bool command_pending,
uint64_t status_age_ms, uint64_t command_age_ms) {
PrivacyControlState result;
result.timeout = command_pending && command_age_ms > 15000;
result.stale = received && status_age_ms > 5000;
const bool request_pending = command_pending && !result.timeout;
const bool fresh = received && !result.stale;
const bool timeout = command_pending && command_age_ms > 15000;
result.unsupported = timeout ||
(received && (status_age_ms > 5000 || !status.supported ||
status.state == PrivacyState::failed));
if (result.unsupported) return result;
result.active = status.overlay_active || status.remote_paused ||
status.state == PrivacyState::on ||
status.state == PrivacyState::starting ||
status.state == PrivacyState::stopping ||
status.state == PrivacyState::failed;
// A command in flight only gates repeated clicks; it adds no display state.
result.enabled = fresh && !result.timeout &&
result.enabled = received &&
status.state == PrivacyState::on && status.overlay_active &&
!status.remote_paused;
result.off = fresh && !result.timeout &&
result.off = received &&
status.state == PrivacyState::off && !result.active;
result.unsupported = received && !status.supported;
result.warning = result.timeout || result.stale ||
(received && status.state == PrivacyState::failed);
result.can_toggle = !request_pending &&
(result.active || (fresh && status.supported));
result.can_toggle = !command_pending && (result.active || received);
return result;
}