diff options
-rw-r--r-- | include/cru/platform/gui/xcb/UiApplication.h | 7 | ||||
-rw-r--r-- | include/cru/platform/gui/xcb/Window.h | 11 | ||||
-rw-r--r-- | src/platform/gui/xcb/UiApplication.cpp | 8 | ||||
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 12 |
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 |