aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-09 02:21:04 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-09 02:21:04 +0800
commit2f1ea611385b5bf8985a5b0571eb71976b9a8e52 (patch)
treeaf428a29eb9881b37ea407f0bb0ad662dee88231
parentf66b3de048daca9869e097926ed3fecb76647c7a (diff)
downloadcru-2f1ea611385b5bf8985a5b0571eb71976b9a8e52.tar.gz
cru-2f1ea611385b5bf8985a5b0571eb71976b9a8e52.tar.bz2
cru-2f1ea611385b5bf8985a5b0571eb71976b9a8e52.zip
Init xcb window.
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h7
-rw-r--r--include/cru/platform/gui/xcb/Window.h11
-rw-r--r--src/platform/gui/xcb/UiApplication.cpp8
-rw-r--r--src/platform/gui/xcb/Window.cpp12
4 files changed, 36 insertions, 2 deletions
diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h
index fc20a4e2..42d63609 100644
--- a/include/cru/platform/gui/xcb/UiApplication.h
+++ b/include/cru/platform/gui/xcb/UiApplication.h
@@ -11,6 +11,8 @@ namespace cru::platform::gui::xcb {
class XcbWindow;
class XcbUiApplication : public XcbResource, public virtual IUiApplication {
+ friend XcbWindow;
+
public:
XcbUiApplication();
~XcbUiApplication();
@@ -57,9 +59,12 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication {
virtual std::optional<std::vector<String>> ShowOpenDialog(
OpenDialogOptions options);
- private:
+ private:
void HandleXEvents();
+ void RegisterWindow(XcbWindow* window);
+ void UnregisterWindow(XcbWindow* window);
+
private:
xcb_connection_t* xcb_;
xcb_screen_t* screen_;
diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h
index 8d5c629e..2d5651e7 100644
--- a/include/cru/platform/gui/xcb/Window.h
+++ b/include/cru/platform/gui/xcb/Window.h
@@ -3,9 +3,16 @@
#include "../Window.h"
#include "Base.h"
+#include <xcb/xcb.h>
+
namespace cru::platform::gui::xcb {
+class XcbUiApplication;
+
class XcbWindow : public XcbResource, public virtual INativeWindow {
public:
+ explicit XcbWindow(XcbUiApplication* application);
+ ~XcbWindow() override;
+
virtual void Close() = 0;
virtual INativeWindow* GetParent() = 0;
@@ -68,5 +75,9 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
virtual IEvent<NativeKeyEventArgs>* KeyUpEvent() = 0;
virtual IInputMethodContext* GetInputMethodContext() = 0;
+
+ private:
+ XcbUiApplication* application_;
+ xcb_window_t xcb_window_;
};
} // namespace cru::platform::gui::xcb
diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp
index d64fc9da..139a5422 100644
--- a/src/platform/gui/xcb/UiApplication.cpp
+++ b/src/platform/gui/xcb/UiApplication.cpp
@@ -79,4 +79,12 @@ void XcbUiApplication::HandleXEvents() {
NotImplemented();
}
}
+
+void XcbUiApplication::RegisterWindow(XcbWindow *window) {
+ windows_.push_back(window);
+}
+
+void XcbUiApplication::UnregisterWindow(XcbWindow *window) {
+ std::erase(windows_, window);
+}
} // namespace cru::platform::gui::xcb
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp
index 92772acf..cf4e059d 100644
--- a/src/platform/gui/xcb/Window.cpp
+++ b/src/platform/gui/xcb/Window.cpp
@@ -1 +1,11 @@
-#include <cru/platform/gui/xcb/Window.h>
+#include "cru/platform/gui/xcb/Window.h"
+#include "cru/platform/gui/xcb/UiApplication.h"
+
+namespace cru::platform::gui::xcb {
+XcbWindow::XcbWindow(XcbUiApplication* application)
+ : application_(application) {
+ application->RegisterWindow(this);
+}
+
+XcbWindow::~XcbWindow() { application_->UnregisterWindow(this); }
+} // namespace cru::platform::gui::xcb