From 5fde4557b2e8f9052634055d95932b95d1eb9c41 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Tue, 9 Sep 2025 01:51:01 +0800 Subject: Implement timers on XcbUiApplication. --- include/cru/platform/gui/xcb/UiApplication.h | 21 +++++++++------------ src/platform/gui/xcb/UiApplication.cpp | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h index 9b3545c2..af1c40f4 100644 --- a/include/cru/platform/gui/xcb/UiApplication.h +++ b/include/cru/platform/gui/xcb/UiApplication.h @@ -2,6 +2,8 @@ #include "../UiApplication.h" #include "Base.h" +#include + #include #include @@ -15,7 +17,6 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { int Run() override; - // Post a quit message with given quit code. virtual void RequestQuit(int quit_code) = 0; void AddOnQuitHandler(std::function handler) override; @@ -23,17 +24,12 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { virtual bool IsQuitOnAllWindowClosed() = 0; virtual void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) = 0; - // Timer id should always be positive (not 0) and never the same. So it's ok - // to use negative value (or 0) to represent no timer. - virtual long long SetImmediate(std::function action) = 0; - virtual long long SetTimeout(std::chrono::milliseconds milliseconds, - std::function action) = 0; - virtual long long SetInterval(std::chrono::milliseconds milliseconds, - std::function action) = 0; - // Implementation should guarantee calls on timer id already canceled have no - // effects and do not crash. Also canceling negative id or 0 should always - // result in no-op. - virtual void CancelTimer(long long id) = 0; + long long SetImmediate(std::function action) override; + long long SetTimeout(std::chrono::milliseconds milliseconds, + std::function action) override; + long long SetInterval(std::chrono::milliseconds milliseconds, + std::function action) override; + void CancelTimer(long long id) override; virtual std::vector GetAllWindow() = 0; @@ -63,6 +59,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { xcb_connection_t* xcb_; xcb_screen_t* screen_; + cru::platform::unix::UnixEventLoop event_loop_; std::vector> quit_handlers_; int exit_code_; }; diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp index fefc1335..17111e0c 100644 --- a/src/platform/gui/xcb/UiApplication.cpp +++ b/src/platform/gui/xcb/UiApplication.cpp @@ -35,4 +35,22 @@ int XcbUiApplication::Run() { void XcbUiApplication::AddOnQuitHandler(std::function handler) { this->quit_handlers_.push_back(std::move(handler)); } + +long long XcbUiApplication::SetImmediate(std::function action) { + return event_loop_.SetImmediate(std::move(action)); +} + +long long XcbUiApplication::SetTimeout(std::chrono::milliseconds milliseconds, + std::function action) { + return event_loop_.SetTimeout(std::move(action), std::move(milliseconds)); +} + +long long XcbUiApplication::SetInterval(std::chrono::milliseconds milliseconds, + std::function action) { + return event_loop_.SetInterval(std::move(action), std::move(milliseconds)); +} + +void XcbUiApplication::CancelTimer(long long id) { + return event_loop_.CancelTimer(static_cast(id)); +} } // namespace cru::platform::gui::xcb -- cgit v1.2.3