aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/gui
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/platform/gui')
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h8
-rw-r--r--include/cru/platform/gui/xcb/Window.h20
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