diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-09 19:10:14 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-09 19:10:14 +0800 |
commit | f761d4ef25ab0e695c79ae5c2ede1f850f1607af (patch) | |
tree | e6b674fd33d7ef3660e8c114473aa290ea3c3a4c /include/cru/platform/gui | |
parent | 2f1ea611385b5bf8985a5b0571eb71976b9a8e52 (diff) | |
download | cru-f761d4ef25ab0e695c79ae5c2ede1f850f1607af.tar.gz cru-f761d4ef25ab0e695c79ae5c2ede1f850f1607af.tar.bz2 cru-f761d4ef25ab0e695c79ae5c2ede1f850f1607af.zip |
Develop some xcb window.
Diffstat (limited to 'include/cru/platform/gui')
-rw-r--r-- | include/cru/platform/gui/xcb/UiApplication.h | 8 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/Window.h | 20 |
2 files changed, 24 insertions, 4 deletions
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 <xcb/xcb.h> +#include <optional> 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<Size>* ResizeEvent() = 0; virtual IEvent<FocusChangeType>* FocusEvent() = 0; - virtual IEvent<MouseEnterLeaveType>* MouseEnterLeaveEvent() = 0; - virtual IEvent<Point>* MouseMoveEvent() = 0; + IEvent<MouseEnterLeaveType>* MouseEnterLeaveEvent() override; + IEvent<Point>* MouseMoveEvent() override; virtual IEvent<NativeMouseButtonEventArgs>* MouseDownEvent() = 0; virtual IEvent<NativeMouseButtonEventArgs>* MouseUpEvent() = 0; virtual IEvent<NativeMouseWheelEventArgs>* MouseWheelEvent() = 0; @@ -76,8 +79,19 @@ class XcbWindow : public XcbResource, public virtual INativeWindow { virtual IInputMethodContext* GetInputMethodContext() = 0; + public: + std::optional<xcb_window_t> GetXcbWindow(); + + private: + xcb_window_t DoCreateWindow(); + void HandleEvent(xcb_generic_event_t* event); + static std::optional<xcb_window_t> GetEventWindow(xcb_generic_event_t* event); + private: XcbUiApplication* application_; - xcb_window_t xcb_window_; + std::optional<xcb_window_t> xcb_window_; + + Event<MouseEnterLeaveType> mouse_enter_leave_event_; + Event<Point> mouse_move_event_; }; } // namespace cru::platform::gui::xcb |