mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:22:43 +00:00 
			
		
		
		
	 57fe316e01
			
		
	
	
		57fe316e01
		
	
	
	
	
		
			
			This will be comfortable enough while I'm still developing with emulators. QEMU keeps eating my "Alt" key presses and it's making things difficult.
		
			
				
	
	
		
			515 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			515 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <SharedGraphics/Point.h>
 | |
| #include <SharedGraphics/Rect.h>
 | |
| #include <AK/AKString.h>
 | |
| #include <AK/Types.h>
 | |
| #include <Kernel/KeyCode.h>
 | |
| 
 | |
| class WSMessage {
 | |
| public:
 | |
|     enum Type {
 | |
|         Invalid = 0,
 | |
|         WM_DeferredCompose,
 | |
|         WM_ClientDisconnected,
 | |
|         MouseMove,
 | |
|         MouseDown,
 | |
|         MouseUp,
 | |
|         WindowEntered,
 | |
|         WindowLeft,
 | |
|         KeyDown,
 | |
|         KeyUp,
 | |
|         WindowActivated,
 | |
|         WindowDeactivated,
 | |
|         WindowCloseRequest,
 | |
|         WindowResized,
 | |
| 
 | |
|         __Begin_API_Client_Requests,
 | |
|         APICreateMenubarRequest,
 | |
|         APIDestroyMenubarRequest,
 | |
|         APIAddMenuToMenubarRequest,
 | |
|         APISetApplicationMenubarRequest,
 | |
|         APICreateMenuRequest,
 | |
|         APIDestroyMenuRequest,
 | |
|         APIAddMenuItemRequest,
 | |
|         APIAddMenuSeparatorRequest,
 | |
|         APICreateWindowRequest,
 | |
|         APIDestroyWindowRequest,
 | |
|         APISetWindowTitleRequest,
 | |
|         APIGetWindowTitleRequest,
 | |
|         APISetWindowRectRequest,
 | |
|         APIGetWindowRectRequest,
 | |
|         APIInvalidateRectRequest,
 | |
|         APIDidFinishPaintingNotification,
 | |
|         APIGetWindowBackingStoreRequest,
 | |
|         APISetGlobalCursorTrackingRequest,
 | |
|         APISetWindowOpacityRequest,
 | |
|         APISetWindowBackingStoreRequest,
 | |
|         __End_API_Client_Requests,
 | |
|     };
 | |
| 
 | |
|     WSMessage() { }
 | |
|     explicit WSMessage(Type type) : m_type(type) { }
 | |
|     virtual ~WSMessage() { }
 | |
| 
 | |
|     Type type() const { return m_type; }
 | |
| 
 | |
|     bool is_client_request() const { return m_type > __Begin_API_Client_Requests && m_type < __End_API_Client_Requests; }
 | |
|     bool is_mouse_event() const { return m_type == MouseMove || m_type == MouseDown || m_type == MouseUp; }
 | |
|     bool is_key_event() const { return m_type == KeyUp || m_type == KeyDown; }
 | |
| 
 | |
| private:
 | |
|     Type m_type { Invalid };
 | |
| };
 | |
| 
 | |
| class WSClientDisconnectedNotification : public WSMessage {
 | |
| public:
 | |
|     explicit WSClientDisconnectedNotification(int client_id)
 | |
|         : WSMessage(WM_ClientDisconnected)
 | |
|         , m_client_id(client_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPIClientRequest : public WSMessage {
 | |
| public:
 | |
|     WSAPIClientRequest(Type type, int client_id)
 | |
|         : WSMessage(type)
 | |
|         , m_client_id(client_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPISetGlobalCursorTrackingRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPISetGlobalCursorTrackingRequest(int client_id, int window_id, bool value)
 | |
|         : WSAPIClientRequest(WSMessage::APISetGlobalCursorTrackingRequest, client_id)
 | |
|         , m_window_id(window_id)
 | |
|         , m_value(value)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int window_id() const { return m_window_id; }
 | |
|     bool value() const { return m_value; }
 | |
| 
 | |
| private:
 | |
|     int m_window_id { 0 };
 | |
|     bool m_value { false };
 | |
| };
 | |
| 
 | |
| class WSAPICreateMenubarRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPICreateMenubarRequest(int client_id)
 | |
|         : WSAPIClientRequest(WSMessage::APICreateMenubarRequest, client_id)
 | |
|     {
 | |
|     }
 | |
| };
 | |
| 
 | |
| class WSAPIDestroyMenubarRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPIDestroyMenubarRequest(int client_id, int menubar_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIDestroyMenubarRequest, client_id)
 | |
|         , m_menubar_id(menubar_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int menubar_id() const { return m_menubar_id; }
 | |
| 
 | |
| private:
 | |
|     int m_menubar_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPISetApplicationMenubarRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPISetApplicationMenubarRequest(int client_id, int menubar_id)
 | |
|         : WSAPIClientRequest(WSMessage::APISetApplicationMenubarRequest, client_id)
 | |
|         , m_menubar_id(menubar_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int menubar_id() const { return m_menubar_id; }
 | |
| 
 | |
| private:
 | |
|     int m_menubar_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPIAddMenuToMenubarRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPIAddMenuToMenubarRequest(int client_id, int menubar_id, int menu_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIAddMenuToMenubarRequest, client_id)
 | |
|         , m_menubar_id(menubar_id)
 | |
|         , m_menu_id(menu_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int menubar_id() const { return m_menubar_id; }
 | |
|     int menu_id() const { return m_menu_id; }
 | |
| 
 | |
| private:
 | |
|     int m_menubar_id { 0 };
 | |
|     int m_menu_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPICreateMenuRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPICreateMenuRequest(int client_id, const String& text)
 | |
|         : WSAPIClientRequest(WSMessage::APICreateMenuRequest, client_id)
 | |
|         , m_text(text)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     String text() const { return m_text; }
 | |
| 
 | |
| private:
 | |
|     String m_text;
 | |
| };
 | |
| 
 | |
| class WSAPIDestroyMenuRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPIDestroyMenuRequest(int client_id, int menu_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIDestroyMenuRequest, client_id)
 | |
|         , m_menu_id(menu_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int menu_id() const { return m_menu_id; }
 | |
| 
 | |
| private:
 | |
|     int m_menu_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPIAddMenuItemRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPIAddMenuItemRequest(int client_id, int menu_id, unsigned identifier, const String& text, const String& shortcut_text)
 | |
|         : WSAPIClientRequest(WSMessage::APIAddMenuItemRequest, client_id)
 | |
|         , m_menu_id(menu_id)
 | |
|         , m_identifier(identifier)
 | |
|         , m_text(text)
 | |
|         , m_shortcut_text(shortcut_text)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int menu_id() const { return m_menu_id; }
 | |
|     unsigned identifier() const { return m_identifier; }
 | |
|     String text() const { return m_text; }
 | |
|     String shortcut_text() const { return m_shortcut_text; }
 | |
| 
 | |
| private:
 | |
|     int m_menu_id { 0 };
 | |
|     unsigned m_identifier { 0 };
 | |
|     String m_text;
 | |
|     String m_shortcut_text;
 | |
| };
 | |
| 
 | |
| class WSAPIAddMenuSeparatorRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPIAddMenuSeparatorRequest(int client_id, int menu_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIAddMenuSeparatorRequest, client_id)
 | |
|         , m_menu_id(menu_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int menu_id() const { return m_menu_id; }
 | |
| 
 | |
| private:
 | |
|     int m_menu_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPISetWindowTitleRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPISetWindowTitleRequest(int client_id, int window_id, String&& title)
 | |
|         : WSAPIClientRequest(WSMessage::APISetWindowTitleRequest, client_id)
 | |
|         , m_client_id(client_id)
 | |
|         , m_window_id(window_id)
 | |
|         , m_title(move(title))
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
|     int window_id() const { return m_window_id; }
 | |
|     String title() const { return m_title; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
|     int m_window_id { 0 };
 | |
|     String m_title;
 | |
| };
 | |
| 
 | |
| class WSAPIGetWindowTitleRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPIGetWindowTitleRequest(int client_id, int window_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIGetWindowTitleRequest, client_id)
 | |
|         , m_client_id(client_id)
 | |
|         , m_window_id(window_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
|     int window_id() const { return m_window_id; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
|     int m_window_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPISetWindowOpacityRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPISetWindowOpacityRequest(int client_id, int window_id, float opacity)
 | |
|         : WSAPIClientRequest(WSMessage::APISetWindowOpacityRequest, client_id)
 | |
|         , m_client_id(client_id)
 | |
|         , m_window_id(window_id)
 | |
|         , m_opacity(opacity)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
|     int window_id() const { return m_window_id; }
 | |
|     float opacity() const { return m_opacity; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
|     int m_window_id { 0 };
 | |
|     float m_opacity { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPISetWindowBackingStoreRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPISetWindowBackingStoreRequest(int client_id, int window_id, int shared_buffer_id, const Size& size, size_t bpp, size_t pitch, bool has_alpha_channel)
 | |
|         : WSAPIClientRequest(WSMessage::APISetWindowBackingStoreRequest, client_id)
 | |
|         , m_client_id(client_id)
 | |
|         , m_window_id(window_id)
 | |
|         , m_shared_buffer_id(shared_buffer_id)
 | |
|         , m_size(size)
 | |
|         , m_bpp(bpp)
 | |
|         , m_pitch(pitch)
 | |
|         , m_has_alpha_channel(has_alpha_channel)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
|     int window_id() const { return m_window_id; }
 | |
|     int shared_buffer_id() const { return m_shared_buffer_id; }
 | |
|     Size size() const { return m_size; }
 | |
|     size_t bpp() const { return m_bpp; }
 | |
|     size_t pitch() const { return m_pitch; }
 | |
|     bool has_alpha_channel() const { return m_has_alpha_channel; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
|     int m_window_id { 0 };
 | |
|     int m_shared_buffer_id { 0 };
 | |
|     Size m_size;
 | |
|     size_t m_bpp;
 | |
|     size_t m_pitch;
 | |
|     bool m_has_alpha_channel;
 | |
| };
 | |
| 
 | |
| class WSAPISetWindowRectRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPISetWindowRectRequest(int client_id, int window_id, const Rect& rect)
 | |
|         : WSAPIClientRequest(WSMessage::APISetWindowRectRequest, client_id)
 | |
|         , m_client_id(client_id)
 | |
|         , m_window_id(window_id)
 | |
|         , m_rect(rect)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
|     int window_id() const { return m_window_id; }
 | |
|     Rect rect() const { return m_rect; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
|     int m_window_id { 0 };
 | |
|     Rect m_rect;
 | |
| };
 | |
| 
 | |
| class WSAPIGetWindowRectRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPIGetWindowRectRequest(int client_id, int window_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIGetWindowRectRequest, client_id)
 | |
|         , m_client_id(client_id)
 | |
|         , m_window_id(window_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int client_id() const { return m_client_id; }
 | |
|     int window_id() const { return m_window_id; }
 | |
| 
 | |
| private:
 | |
|     int m_client_id { 0 };
 | |
|     int m_window_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPICreateWindowRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPICreateWindowRequest(int client_id, const Rect& rect, const String& title, bool has_alpha_channel, float opacity, const Size& base_size, const Size& size_increment)
 | |
|         : WSAPIClientRequest(WSMessage::APICreateWindowRequest, client_id)
 | |
|         , m_rect(rect)
 | |
|         , m_title(title)
 | |
|         , m_opacity(opacity)
 | |
|         , m_has_alpha_channel(has_alpha_channel)
 | |
|         , m_size_increment(size_increment)
 | |
|         , m_base_size(base_size)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Rect rect() const { return m_rect; }
 | |
|     String title() const { return m_title; }
 | |
|     bool has_alpha_channel() const { return m_has_alpha_channel; }
 | |
|     float opacity() const { return m_opacity; }
 | |
|     Size size_increment() const { return m_size_increment; }
 | |
|     Size base_size() const { return m_base_size; }
 | |
| 
 | |
| private:
 | |
|     Rect m_rect;
 | |
|     String m_title;
 | |
|     float m_opacity { 0 };
 | |
|     bool m_has_alpha_channel { false };
 | |
|     Size m_size_increment;
 | |
|     Size m_base_size;
 | |
| };
 | |
| 
 | |
| class WSAPIDestroyWindowRequest : public WSAPIClientRequest {
 | |
| public:
 | |
|     WSAPIDestroyWindowRequest(int client_id, int window_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIDestroyWindowRequest, client_id)
 | |
|         , m_window_id(window_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int window_id() const { return m_window_id; }
 | |
| 
 | |
| private:
 | |
|     int m_window_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPIInvalidateRectRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPIInvalidateRectRequest(int client_id, int window_id, const Rect& rect)
 | |
|         : WSAPIClientRequest(WSMessage::APIInvalidateRectRequest, client_id)
 | |
|         , m_window_id(window_id)
 | |
|         , m_rect(rect)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int window_id() const { return m_window_id; }
 | |
|     Rect rect() const { return m_rect; }
 | |
| 
 | |
| private:
 | |
|     int m_window_id { 0 };
 | |
|     Rect m_rect;
 | |
| };
 | |
| 
 | |
| class WSAPIGetWindowBackingStoreRequest final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPIGetWindowBackingStoreRequest(int client_id, int window_id)
 | |
|         : WSAPIClientRequest(WSMessage::APIGetWindowBackingStoreRequest, client_id)
 | |
|         , m_window_id(window_id)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int window_id() const { return m_window_id; }
 | |
| 
 | |
| private:
 | |
|     int m_window_id { 0 };
 | |
| };
 | |
| 
 | |
| class WSAPIDidFinishPaintingNotification final : public WSAPIClientRequest {
 | |
| public:
 | |
|     explicit WSAPIDidFinishPaintingNotification(int client_id, int window_id, const Rect& rect)
 | |
|         : WSAPIClientRequest(WSMessage::APIDidFinishPaintingNotification, client_id)
 | |
|         , m_window_id(window_id)
 | |
|         , m_rect(rect)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int window_id() const { return m_window_id; }
 | |
|     Rect rect() const { return m_rect; }
 | |
| 
 | |
| private:
 | |
|     int m_window_id { 0 };
 | |
|     Rect m_rect;
 | |
| };
 | |
| 
 | |
| enum class MouseButton : byte {
 | |
|     None = 0,
 | |
|     Left = 1,
 | |
|     Right = 2,
 | |
|     Middle = 4,
 | |
| };
 | |
| 
 | |
| class WSKeyEvent final : public WSMessage {
 | |
| public:
 | |
|     WSKeyEvent(Type type, int key, char character, byte modifiers)
 | |
|         : WSMessage(type)
 | |
|         , m_key(key)
 | |
|         , m_character(character)
 | |
|         , m_modifiers(modifiers)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int key() const { return m_key; }
 | |
|     bool ctrl() const { return m_modifiers & Mod_Ctrl; }
 | |
|     bool alt() const { return m_modifiers & Mod_Alt; }
 | |
|     bool shift() const { return m_modifiers & Mod_Shift; }
 | |
|     bool logo() const { return m_modifiers & Mod_Logo; }
 | |
|     byte modifiers() const { return m_modifiers; }
 | |
|     char character() const { return m_character; }
 | |
| 
 | |
| private:
 | |
|     friend class WSMessageLoop;
 | |
|     friend class WSScreen;
 | |
|     int m_key { 0 };
 | |
|     char m_character { 0 };
 | |
|     byte m_modifiers { 0 };
 | |
| };
 | |
| 
 | |
| class WSMouseEvent final : public WSMessage {
 | |
| public:
 | |
|     WSMouseEvent(Type type, const Point& position, unsigned buttons, MouseButton button = MouseButton::None)
 | |
|         : WSMessage(type)
 | |
|         , m_position(position)
 | |
|         , m_buttons(buttons)
 | |
|         , m_button(button)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Point position() const { return m_position; }
 | |
|     int x() const { return m_position.x(); }
 | |
|     int y() const { return m_position.y(); }
 | |
|     MouseButton button() const { return m_button; }
 | |
|     unsigned buttons() const { return m_buttons; }
 | |
| 
 | |
| private:
 | |
|     Point m_position;
 | |
|     unsigned m_buttons { 0 };
 | |
|     MouseButton m_button { MouseButton::None };
 | |
| };
 | |
| 
 | |
| class WSResizeEvent final : public WSMessage {
 | |
| public:
 | |
|     WSResizeEvent(const Rect& old_rect, const Rect& rect)
 | |
|         : WSMessage(WSMessage::WindowResized)
 | |
|         , m_old_rect(old_rect)
 | |
|         , m_rect(rect)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Rect old_rect() const { return m_old_rect; }
 | |
|     Rect rect() const { return m_rect; }
 | |
| 
 | |
| private:
 | |
|     Rect m_old_rect;
 | |
|     Rect m_rect;
 | |
| };
 |