From f761d4ef25ab0e695c79ae5c2ede1f850f1607af Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Tue, 9 Sep 2025 19:10:14 +0800 Subject: Develop some xcb window. --- include/cru/platform/gui/xcb/UiApplication.h | 8 +++++++- include/cru/platform/gui/xcb/Window.h | 20 +++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) (limited to 'include/cru/platform') diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h index 42d63609..3fce8efa 100644 --- a/include/cru/platform/gui/xcb/UiApplication.h +++ b/include/cru/platform/gui/xcb/UiApplication.h @@ -17,8 +17,14 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { XcbUiApplication(); ~XcbUiApplication(); + public: void CheckXcbConnectionError(); + xcb_connection_t* GetXcbConnection(); + + // This API is weird, but before we have correct screen API, we still use it. + xcb_screen_t* GetFirstXcbScreen(); + public: int Run() override; void RequestQuit(int quit_code) override; @@ -66,7 +72,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { void UnregisterWindow(XcbWindow* window); private: - xcb_connection_t* xcb_; + xcb_connection_t* xcb_connection_; xcb_screen_t* screen_; cru::platform::unix::UnixEventLoop event_loop_; diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h index 2d5651e7..1676dced 100644 --- a/include/cru/platform/gui/xcb/Window.h +++ b/include/cru/platform/gui/xcb/Window.h @@ -4,11 +4,14 @@ #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; @@ -66,8 +69,8 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { virtual IEvent* ResizeEvent() = 0; virtual IEvent* FocusEvent() = 0; - virtual IEvent* MouseEnterLeaveEvent() = 0; - virtual IEvent* MouseMoveEvent() = 0; + IEvent* MouseEnterLeaveEvent() override; + IEvent* MouseMoveEvent() override; virtual IEvent* MouseDownEvent() = 0; virtual IEvent* MouseUpEvent() = 0; virtual IEvent* MouseWheelEvent() = 0; @@ -76,8 +79,19 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { 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_; - xcb_window_t xcb_window_; + std::optional xcb_window_; + + Event mouse_enter_leave_event_; + Event mouse_move_event_; }; } // namespace cru::platform::gui::xcb -- cgit v1.2.3