#pragma once #include "../../GraphicsBase.h" #include "../Window.h" #include "Base.h" #include #include #include #include namespace cru::platform::gui::xcb { class XcbUiApplication; class XcbCursor; class XcbWindow : public XcbResource, public virtual INativeWindow { friend XcbUiApplication; public: explicit XcbWindow(XcbUiApplication* application); ~XcbWindow() override; bool IsCreated() override; void Close() override; INativeWindow* GetParent() override; void SetParent(INativeWindow* parent) override; WindowStyleFlag GetStyleFlag() override; void SetStyleFlag(WindowStyleFlag flag) override; String GetTitle() override; void SetTitle(String title) override; WindowVisibilityType GetVisibility() override; void SetVisibility(WindowVisibilityType visibility) override; Size GetClientSize() override; void SetClientSize(const Size& size) override; Rect GetClientRect() override; void SetClientRect(const Rect& rect) override; Rect GetWindowRect() override; void SetWindowRect(const Rect& rect) override; bool RequestFocus() override; Point GetMousePosition() override; bool CaptureMouse() override; bool ReleaseMouse() override; void SetCursor(std::shared_ptr cursor) override; void SetToForeground() override; void RequestRepaint() override; std::unique_ptr BeginPaint() override; IEvent* CreateEvent() override; IEvent* DestroyEvent() override; IEvent* PaintEvent() override; IEvent* VisibilityChangeEvent() override; IEvent* ResizeEvent() override; IEvent* FocusEvent() override; IEvent* MouseEnterLeaveEvent() override; IEvent* MouseMoveEvent() override; IEvent* MouseDownEvent() override; IEvent* MouseUpEvent() override; IEvent* MouseWheelEvent() override; IEvent* KeyDownEvent() override; IEvent* KeyUpEvent() override; IInputMethodContext* GetInputMethodContext() override; public: std::optional GetXcbWindow(); private: xcb_window_t DoCreateWindow(); void HandleEvent(xcb_generic_event_t* event); static std::optional GetEventWindow(xcb_generic_event_t* event); void DoSetParent(xcb_window_t window); void DoSetStyleFlags(xcb_window_t window); void DoSetTitle(xcb_window_t window); void DoSetClientRect(xcb_window_t window, const Rect& rect); void DoSetCursor(xcb_window_t window, XcbCursor* cursor); void* XcbGetProperty(xcb_window_t window, xcb_atom_t property, xcb_atom_t type, std::uint32_t offset, std::uint32_t length, std::uint32_t* out_length = nullptr); // Relative to screen lefttop. Point GetXcbWindowPosition(xcb_window_t window); std::optional Get_NET_FRAME_EXTENTS(xcb_window_t window); private: XcbUiApplication* application_; std::optional xcb_window_; cairo_surface_t* cairo_surface_; Size current_size_; WindowStyleFlag style_; std::string title_; bool mapped_; std::shared_ptr cursor_; XcbWindow* parent_; Event create_event_; Event destroy_event_; Event paint_event_; Event visibility_change_event_; Event resize_event_; Event focus_event_; Event mouse_enter_leave_event_; Event mouse_move_event_; Event mouse_down_event_; Event mouse_up_event_; Event mouse_wheel_event_; Event key_down_event_; Event key_up_event_; }; } // namespace cru::platform::gui::xcb