From 1b197ca9997eb407407e508eb199b1e6fae78926 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Tue, 2 Sep 2025 17:35:47 +0800 Subject: Override Run and AddOnQuitHandler. --- include/cru/platform/gui/xcb/UiApplication.h | 8 ++++++-- src/platform/gui/xcb/UiApplication.cpp | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h index d8702087..9b3545c2 100644 --- a/include/cru/platform/gui/xcb/UiApplication.h +++ b/include/cru/platform/gui/xcb/UiApplication.h @@ -3,6 +3,7 @@ #include "Base.h" #include +#include namespace cru::platform::gui::xcb { class XcbUiApplication : public XcbResource, public virtual IUiApplication { @@ -12,12 +13,12 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { void CheckXcbConnectionError(); - virtual int Run() = 0; + int Run() override; // Post a quit message with given quit code. virtual void RequestQuit(int quit_code) = 0; - virtual void AddOnQuitHandler(std::function handler) = 0; + void AddOnQuitHandler(std::function handler) override; virtual bool IsQuitOnAllWindowClosed() = 0; virtual void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) = 0; @@ -61,5 +62,8 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { private: xcb_connection_t* xcb_; xcb_screen_t* screen_; + + std::vector> quit_handlers_; + int exit_code_; }; } // namespace cru::platform::gui::xcb diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp index 6cd0a177..fefc1335 100644 --- a/src/platform/gui/xcb/UiApplication.cpp +++ b/src/platform/gui/xcb/UiApplication.cpp @@ -3,7 +3,7 @@ #include namespace cru::platform::gui::xcb { -XcbUiApplication::XcbUiApplication() { +XcbUiApplication::XcbUiApplication() : exit_code_(0) { int screen_num; xcb_connection_t *connection = xcb_connect(NULL, &screen_num); this->CheckXcbConnectionError(); @@ -20,4 +20,19 @@ void XcbUiApplication::CheckXcbConnectionError() { throw XcbException("xcb_connection_has_error returned non-zero."); } } + +int XcbUiApplication::Run() { + + // TODO: A Big Implement. + + for (const auto &handler : this->quit_handlers_) { + handler(); + } + + return exit_code_; +} + +void XcbUiApplication::AddOnQuitHandler(std::function handler) { + this->quit_handlers_.push_back(std::move(handler)); +} } // namespace cru::platform::gui::xcb -- cgit v1.2.3