#ifndef CROSSDESK_GUI_RUNTIME_H_ #define CROSSDESK_GUI_RUNTIME_H_ #include #include #include "features/clipboard/clipboard_controller.h" #include "features/devices/session_device_manager.h" #include "features/file_transfer/file_transfer_manager.h" #include "features/input/keyboard_controller.h" #include "runtime/gui_state.h" #include "runtime/peer_event_handler.h" #include "features/settings/settings_manager.h" namespace crossdesk { // Shared GUI runtime. It owns subsystem controllers and cross-cutting session // state, but no window lifecycle, ImGui view, or transport callback methods. class GuiRuntime : protected gui_detail::GuiState { protected: using FileTransferState = gui_detail::FileTransferState; using RemoteSession = gui_detail::RemoteSession; enum class RemoteUnlockState { none, service_unavailable, lock_screen, credential_ui, secure_desktop, }; GuiRuntime(); ~GuiRuntime(); static void SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len); static void SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len); int CreateConnectionPeer(); int ConnectTo(const std::string &remote_id, const char *password, bool remember_password, bool bypass_presence_check = false); int RequestSingleDevicePresence(const std::string &remote_id, const char *password, bool remember_password); void UpdateLabels(); void HandleRecentConnections(); void HandleConnectionStatusChange(); void HandlePendingPresenceProbe(); void HandleConnectionTimeouts(); void HandleWindowsServiceIntegration(); void CloseRemoteSession(std::shared_ptr props); void CloseAllRemoteSessions(); void ResetRemoteSessionResources( std::shared_ptr props); void WaitForThumbnailSaveTasks(); std::shared_ptr FindRemoteSession(const std::string &remote_id); void ResetRemoteServiceStatus(RemoteSession &props); void ApplyRemoteServiceStatus(RemoteSession &props, const ServiceStatus &status); RemoteUnlockState GetRemoteUnlockState(const RemoteSession &props) const; #if _WIN32 void ResetLocalWindowsServiceState(bool clear_pending_sas); #endif #ifdef __APPLE__ bool CheckScreenRecordingPermission(); bool CheckAccessibilityPermission(); void OpenScreenRecordingPreferences(); void OpenAccessibilityPreferences(); void RefreshMacPermissionStatus(bool force); bool EnsureMacScreenRecordingPermission(); bool EnsureMacAccessibilityPermission(); #endif ClipboardController clipboard_; SessionDeviceManager devices_; FileTransferManager transfers_; SettingsManager settings_; KeyboardController keyboard_; PeerEventHandler peer_events_; private: friend class ClipboardController; friend class SessionDeviceManager; friend class FileTransferManager; friend class SettingsManager; friend class KeyboardController; friend class PeerEventHandler; }; } // namespace crossdesk #endif // CROSSDESK_GUI_RUNTIME_H_