aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-12-07 21:10:18 +0800
committerYuqian Yang <crupest@crupest.life>2025-12-07 21:10:18 +0800
commitf16bfe4b1acf1718aeaff311ed23278834a8a17b (patch)
tree8d05798ed1c0ebca10e43d5dc9d966aa0bd24289
parentb3b68c704926b71afc923f392b0cc91107717112 (diff)
downloadcru-f16bfe4b1acf1718aeaff311ed23278834a8a17b.tar.gz
cru-f16bfe4b1acf1718aeaff311ed23278834a8a17b.tar.bz2
cru-f16bfe4b1acf1718aeaff311ed23278834a8a17b.zip
Lower timer priority (including rendering) in SDL.
-rw-r--r--include/cru/base/Timer.h16
-rw-r--r--src/platform/gui/sdl/UiApplication.cpp33
-rw-r--r--src/platform/gui/sdl/Window.cpp2
3 files changed, 31 insertions, 20 deletions
diff --git a/include/cru/base/Timer.h b/include/cru/base/Timer.h
index 5508bccf..52c8386d 100644
--- a/include/cru/base/Timer.h
+++ b/include/cru/base/Timer.h
@@ -30,19 +30,23 @@ class TimerRegistry : public Object {
repeat(repeat),
data(std::move(data)) {}
+ std::chrono::steady_clock::time_point NextTrigger() const {
+ return interval == std::chrono::milliseconds::zero()
+ ? last_check
+ : last_check - (last_check - created) % interval + interval;
+ }
+
std::chrono::milliseconds NextTimeout(
std::chrono::steady_clock::time_point now) const {
- return interval == std::chrono::milliseconds::zero()
+ auto next_trigger = NextTrigger();
+ return now >= next_trigger
? std::chrono::milliseconds::zero()
: std::chrono::duration_cast<std::chrono::milliseconds>(
- interval - (now - created) % interval);
+ next_trigger - now);
}
bool Update(std::chrono::steady_clock::time_point now) {
- auto next_trigger =
- interval == std::chrono::milliseconds::zero()
- ? last_check
- : last_check - (last_check - created) % interval + interval;
+ auto next_trigger = NextTrigger();
if (now >= next_trigger) {
last_check = next_trigger;
return true;
diff --git a/src/platform/gui/sdl/UiApplication.cpp b/src/platform/gui/sdl/UiApplication.cpp
index edf1e20c..4bcfc5a5 100644
--- a/src/platform/gui/sdl/UiApplication.cpp
+++ b/src/platform/gui/sdl/UiApplication.cpp
@@ -47,29 +47,36 @@ SdlUiApplication::~SdlUiApplication() {
int SdlUiApplication::Run() {
while (true) {
- if (auto result = timers_.Update(std::chrono::steady_clock::now())) {
- result->data();
- continue;
- }
-
auto timeout = timers_.NextTimeout(std::chrono::steady_clock::now());
SDL_Event event;
+ bool has_event = false;
if (timeout) {
- SDL_WaitEventTimeout(&event, timeout->count());
+ if (*timeout == std::chrono::milliseconds::zero()) {
+ has_event = SDL_PollEvent(&event);
+ } else {
+ has_event = SDL_WaitEventTimeout(&event, timeout->count());
+ }
} else {
CheckSdlReturn(SDL_WaitEvent(&event));
+ has_event = true;
}
- if (event.type == SDL_EVENT_QUIT) {
- break;
- }
+ if (has_event) {
+ if (event.type == SDL_EVENT_QUIT) {
+ break;
+ }
- // char buf[512];
- // SDL_GetEventDescription(&event, buf, sizeof(buf) / sizeof(*buf));
- // CruLogDebug(kLogTag, "{}", buf);
+ // char buf[512];
+ // SDL_GetEventDescription(&event, buf, sizeof(buf) / sizeof(*buf));
+ // CruLogDebug(kLogTag, "{}", buf);
- DispatchEvent(event);
+ DispatchEvent(event);
+ } else {
+ if (auto result = timers_.Update(std::chrono::steady_clock::now())) {
+ result->data();
+ }
+ }
delete_later_pool_.Clean();
}
diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp
index 35d33172..44860ae3 100644
--- a/src/platform/gui/sdl/Window.cpp
+++ b/src/platform/gui/sdl/Window.cpp
@@ -280,7 +280,7 @@ void SdlWindow::DoCreateWindow() {
client_rect_.top));
}
- if (!IsWayland() || !sdl_is_popup_) {
+ if (!sdl_is_popup_) {
CheckSdlReturn(SDL_SetWindowParent(
sdl_window_, parent_ == nullptr ? nullptr : parent_->sdl_window_));
}