summaryrefslogtreecommitdiff
path: root/Servers/WindowServer/WSClientConnection.h
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-03-20 04:34:14 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-03-20 04:34:14 +0100
commitd17a91f1851e8f0b3a3353d677ad8d1f51e921b7 (patch)
tree30316253f23ab99c106832deeb6c7d36adab27fc /Servers/WindowServer/WSClientConnection.h
parent9120b05a4044b346be397b0ae5b9b7e9a8cbd0b1 (diff)
downloadserenity-d17a91f1851e8f0b3a3353d677ad8d1f51e921b7.zip
Move WindowServer into Servers.
Diffstat (limited to 'Servers/WindowServer/WSClientConnection.h')
-rw-r--r--Servers/WindowServer/WSClientConnection.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/Servers/WindowServer/WSClientConnection.h b/Servers/WindowServer/WSClientConnection.h
new file mode 100644
index 0000000000..06e643ed37
--- /dev/null
+++ b/Servers/WindowServer/WSClientConnection.h
@@ -0,0 +1,101 @@
+#pragma once
+
+#include <AK/HashMap.h>
+#include <AK/OwnPtr.h>
+#include <AK/WeakPtr.h>
+#include <AK/Function.h>
+#include <SharedGraphics/GraphicsBitmap.h>
+#include <WindowServer/WSMessageReceiver.h>
+#include <WindowServer/WSMessage.h>
+
+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(WSClientConnection&)>);
+
+ void post_message(const WSAPI_ServerMessage&);
+ RetainPtr<GraphicsBitmap> create_shared_bitmap(GraphicsBitmap::Format, const Size&);
+
+ 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;
+
+ template<typename Matching, typename Callback> void for_each_window_matching(Matching, Callback);
+ template<typename Callback> void for_each_window(Callback);
+
+private:
+ virtual void on_message(WSMessage&) override;
+
+ void on_request(WSAPIClientRequest&);
+ void handle_request(WSAPICreateMenubarRequest&);
+ void handle_request(WSAPIDestroyMenubarRequest&);
+ void handle_request(WSAPICreateMenuRequest&);
+ void handle_request(WSAPIDestroyMenuRequest&);
+ void handle_request(WSAPISetApplicationMenubarRequest&);
+ void handle_request(WSAPIAddMenuToMenubarRequest&);
+ void handle_request(WSAPIAddMenuItemRequest&);
+ void handle_request(WSAPIAddMenuSeparatorRequest&);
+ void handle_request(WSAPISetWindowTitleRequest&);
+ void handle_request(WSAPIGetWindowTitleRequest&);
+ void handle_request(WSAPISetWindowRectRequest&);
+ void handle_request(WSAPIGetWindowRectRequest&);
+ void handle_request(WSAPISetClipboardContentsRequest&);
+ void handle_request(WSAPIGetClipboardContentsRequest&);
+ void handle_request(WSAPICreateWindowRequest&);
+ void handle_request(WSAPIDestroyWindowRequest&);
+ void handle_request(WSAPIInvalidateRectRequest&);
+ void handle_request(WSAPIDidFinishPaintingNotification&);
+ void handle_request(WSAPIGetWindowBackingStoreRequest&);
+ void handle_request(WSAPISetWindowBackingStoreRequest&);
+ void handle_request(WSAPISetGlobalCursorTrackingRequest&);
+ void handle_request(WSAPISetWindowOpacityRequest&);
+
+ void post_error(const String&);
+
+ int m_client_id { 0 };
+ int m_fd { -1 };
+ pid_t m_pid { 0 };
+
+ HashMap<int, OwnPtr<WSWindow>> m_windows;
+ HashMap<int, OwnPtr<WSMenuBar>> m_menubars;
+ HashMap<int, OwnPtr<WSMenu>> m_menus;
+ WeakPtr<WSMenuBar> m_app_menubar;
+
+ int m_next_menubar_id { 10000 };
+ int m_next_menu_id { 20000 };
+ int m_next_window_id { 1982 };
+
+ RetainPtr<SharedBuffer> m_last_sent_clipboard_content;
+};
+
+template<typename Matching, typename Callback>
+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<typename Callback>
+void WSClientConnection::for_each_window(Callback callback)
+{
+ for (auto& it : m_windows) {
+ if (callback(*it.value) == IterationDecision::Abort)
+ return;
+ }
+}