#pragma once #include #include #include #include #include #include #include class WSWindow; class WSMenu; class WSMenuBar; struct WSAPI_ServerMessage; class WSClientConnection final : public WSMessageReceiver { public: explicit WSClientConnection(int fd); virtual ~WSClientConnection() override; static WSClientConnection* from_client_id(int client_id); static void for_each_client(Function); void post_message(const WSAPI_ServerMessage&); int client_id() const { return m_client_id; } WSMenuBar* app_menubar() { return m_app_menubar.ptr(); } int fd() const { return m_fd; } pid_t pid() const { return m_pid; } bool is_showing_modal_window() const; void set_client_pid(pid_t pid) { m_pid = pid; } template void for_each_window_matching(Matching, Callback); template void for_each_window(Callback); private: virtual void on_message(const WSMessage&) override; void on_request(const WSAPIClientRequest&); void handle_request(const WSAPICreateMenubarRequest&); void handle_request(const WSAPIDestroyMenubarRequest&); void handle_request(const WSAPICreateMenuRequest&); void handle_request(const WSAPIDestroyMenuRequest&); void handle_request(const WSAPISetApplicationMenubarRequest&); void handle_request(const WSAPIAddMenuToMenubarRequest&); void handle_request(const WSAPIAddMenuItemRequest&); void handle_request(const WSAPIAddMenuSeparatorRequest&); void handle_request(const WSAPISetWindowTitleRequest&); void handle_request(const WSAPIGetWindowTitleRequest&); void handle_request(const WSAPISetWindowRectRequest&); void handle_request(const WSAPIGetWindowRectRequest&); void handle_request(const WSAPISetClipboardContentsRequest&); void handle_request(const WSAPIGetClipboardContentsRequest&); void handle_request(const WSAPICreateWindowRequest&); void handle_request(const WSAPIDestroyWindowRequest&); void handle_request(const WSAPIInvalidateRectRequest&); void handle_request(const WSAPIDidFinishPaintingNotification&); void handle_request(const WSAPIGetWindowBackingStoreRequest&); void handle_request(const WSAPISetWindowBackingStoreRequest&); void handle_request(const WSAPISetGlobalCursorTrackingRequest&); void handle_request(const WSAPISetWindowOpacityRequest&); void handle_request(const WSAPISetWallpaperRequest&); void handle_request(const WSAPIGetWallpaperRequest&); void handle_request(const WSAPISetWindowOverrideCursorRequest&); void post_error(const String&); int m_client_id { 0 }; int m_fd { -1 }; pid_t m_pid { -1 }; HashMap> m_windows; HashMap> m_menubars; HashMap> m_menus; WeakPtr m_app_menubar; int m_next_menubar_id { 10000 }; int m_next_menu_id { 20000 }; int m_next_window_id { 1982 }; RetainPtr m_last_sent_clipboard_content; }; template void WSClientConnection::for_each_window_matching(Matching matching, Callback callback) { for (auto& it : m_windows) { if (matching(*it.value)) { if (callback(*it.value) == IterationDecision::Abort) return; } } } template void WSClientConnection::for_each_window(Callback callback) { for (auto& it : m_windows) { if (callback(*it.value) == IterationDecision::Abort) return; } }