#pragma once #include "../Window.h" #include "Base.h" #include #include namespace cru::platform::gui::xcb { class XcbUiApplication; class XcbWindow : public XcbResource, public virtual INativeWindow { friend XcbUiApplication; public: explicit XcbWindow(XcbUiApplication* application); ~XcbWindow() override; virtual void Close() = 0; virtual INativeWindow* GetParent() = 0; virtual void SetParent(INativeWindow* parent) = 0; virtual WindowStyleFlag GetStyleFlag() = 0; virtual void SetStyleFlag(WindowStyleFlag flag) = 0; virtual String GetTitle() = 0; virtual void SetTitle(String title) = 0; virtual WindowVisibilityType GetVisibility() = 0; virtual void SetVisibility(WindowVisibilityType visibility) = 0; virtual Size GetClientSize() = 0; virtual void SetClientSize(const Size& size) = 0; virtual Rect GetClientRect() = 0; virtual void SetClientRect(const Rect& rect) = 0; // Get the rect of the window containing frame. // The lefttop of the rect is relative to screen lefttop. virtual Rect GetWindowRect() = 0; // Set the rect of the window containing frame. // The lefttop of the rect is relative to screen lefttop. virtual void SetWindowRect(const Rect& rect) = 0; virtual bool RequestFocus() = 0; // Relative to client lefttop. virtual Point GetMousePosition() = 0; virtual bool CaptureMouse() = 0; virtual bool ReleaseMouse() = 0; virtual void SetCursor(std::shared_ptr cursor) = 0; virtual void SetToForeground() = 0; virtual void RequestRepaint() = 0; // Remember to call EndDraw on return value and destroy it. virtual std::unique_ptr BeginPaint() = 0; virtual IEvent* CreateEvent() = 0; virtual IEvent* DestroyEvent() = 0; virtual IEvent* PaintEvent() = 0; virtual IEvent* VisibilityChangeEvent() = 0; virtual IEvent* ResizeEvent() = 0; virtual IEvent* FocusEvent() = 0; IEvent* MouseEnterLeaveEvent() override; IEvent* MouseMoveEvent() override; virtual IEvent* MouseDownEvent() = 0; virtual IEvent* MouseUpEvent() = 0; virtual IEvent* MouseWheelEvent() = 0; virtual IEvent* KeyDownEvent() = 0; virtual IEvent* KeyUpEvent() = 0; virtual IInputMethodContext* GetInputMethodContext() = 0; 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); private: XcbUiApplication* application_; std::optional xcb_window_; Event mouse_enter_leave_event_; Event mouse_move_event_; }; } // namespace cru::platform::gui::xcb