diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-09 01:51:01 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-09 01:51:01 +0800 |
commit | 5fde4557b2e8f9052634055d95932b95d1eb9c41 (patch) | |
tree | 25d3d83822c6b3e05281543104e99fe1e94ce4f2 | |
parent | 429905d4e893f91618908773166ba867970c9a17 (diff) | |
download | cru-5fde4557b2e8f9052634055d95932b95d1eb9c41.tar.gz cru-5fde4557b2e8f9052634055d95932b95d1eb9c41.tar.bz2 cru-5fde4557b2e8f9052634055d95932b95d1eb9c41.zip |
Implement timers on XcbUiApplication.
-rw-r--r-- | include/cru/platform/gui/xcb/UiApplication.h | 21 | ||||
-rw-r--r-- | 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 <cru/base/platform/unix/EventLoop.h> + #include <xcb/xcb.h> #include <functional> @@ -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<void()> 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<void()> action) = 0; - virtual long long SetTimeout(std::chrono::milliseconds milliseconds, - std::function<void()> action) = 0; - virtual long long SetInterval(std::chrono::milliseconds milliseconds, - std::function<void()> 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<void()> action) override; + long long SetTimeout(std::chrono::milliseconds milliseconds, + std::function<void()> action) override; + long long SetInterval(std::chrono::milliseconds milliseconds, + std::function<void()> action) override; + void CancelTimer(long long id) override; virtual std::vector<INativeWindow*> 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<std::function<void()>> 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<void()> handler) { this->quit_handlers_.push_back(std::move(handler)); } + +long long XcbUiApplication::SetImmediate(std::function<void()> action) { + return event_loop_.SetImmediate(std::move(action)); +} + +long long XcbUiApplication::SetTimeout(std::chrono::milliseconds milliseconds, + std::function<void()> action) { + return event_loop_.SetTimeout(std::move(action), std::move(milliseconds)); +} + +long long XcbUiApplication::SetInterval(std::chrono::milliseconds milliseconds, + std::function<void()> action) { + return event_loop_.SetInterval(std::move(action), std::move(milliseconds)); +} + +void XcbUiApplication::CancelTimer(long long id) { + return event_loop_.CancelTimer(static_cast<int>(id)); +} } // namespace cru::platform::gui::xcb |