aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-09 01:51:01 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-09 01:51:01 +0800
commit5fde4557b2e8f9052634055d95932b95d1eb9c41 (patch)
tree25d3d83822c6b3e05281543104e99fe1e94ce4f2
parent429905d4e893f91618908773166ba867970c9a17 (diff)
downloadcru-5fde4557b2e8f9052634055d95932b95d1eb9c41.tar.gz
cru-5fde4557b2e8f9052634055d95932b95d1eb9c41.tar.bz2
cru-5fde4557b2e8f9052634055d95932b95d1eb9c41.zip
Implement timers on XcbUiApplication.
-rw-r--r--include/cru/platform/gui/xcb/UiApplication.h21
-rw-r--r--src/platform/gui/xcb/UiApplication.cpp18
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