diff options
| author | Berke Güzel <wenekar1@gmail.com> | 2026-10-12 00:29:34 +0300 |
|---|---|---|
| committer | Berke Güzel <wenekar1@gmail.com> | 2026-10-12 00:29:34 +0300 |
| commit | f7fa0930cb46046f995fa1ab927aef62466e995e (patch) | |
| tree | f5ac4e1579811b5d69498a19d0bdfbf128a1d62b /src/common/backend.c | |
| parent | 624d1371304a5ae4b3429ad5e4267aac7cd03dfd (diff) | |
feat: add SDL3-style surface, display, and loop timer API for X11, Wayland, and Cocoa
Diffstat (limited to 'src/common/backend.c')
| -rw-r--r-- | src/common/backend.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/common/backend.c b/src/common/backend.c index 214854b..27ab297 100644 --- a/src/common/backend.c +++ b/src/common/backend.c @@ -181,6 +181,7 @@ void yasl_surface_destroy(struct yasl_surface *s) { if (!s || !s->display->ops->surface_destroy) return; + yasl_surface_clear_timers(s); s->display->ops->surface_destroy(s); } @@ -368,3 +369,108 @@ void *yasl_surface_get_native_handle(struct yasl_surface *s) return 0; return s->display->ops->surface_get_native_handle(s); } + +void yasl_surface_clear_timers(struct yasl_surface *s) +{ + if (!s || !s->timers) return; + struct yasl_loop *loop = s->display ? s->display->loop : NULL; + for (int i = 0; i < s->timer_count; i++) { + if (loop && s->timers[i]) { + yasl_loop_del_timer(loop, s->timers[i]); + } + } + free(s->timers); + s->timers = NULL; + s->timer_count = 0; + s->timer_capacity = 0; +} + +yasl_timer_id yasl_surface_add_timer(struct yasl_surface *s, uint64_t interval_ns, + yasl_timer_cb cb, void *ud) +{ + if (!s || !s->display || !s->display->loop || !cb || interval_ns == 0) + return 0; + + yasl_timer_id id = yasl_loop_add_timer(s->display->loop, interval_ns, cb, ud); + if (!id) return 0; + + if (s->timer_count >= s->timer_capacity) { + int new_cap = s->timer_capacity ? s->timer_capacity * 2 : 4; + yasl_timer_id *nt = realloc(s->timers, (size_t)new_cap * sizeof(*nt)); + if (!nt) { + yasl_loop_del_timer(s->display->loop, id); + return 0; + } + s->timers = nt; + s->timer_capacity = new_cap; + } + s->timers[s->timer_count++] = id; + return id; +} + +yasl_timer_id yasl_surface_add_timer_ms(struct yasl_surface *s, uint32_t interval_ms, + yasl_timer_ms_cb cb, void *ud) +{ + if (!s || !s->display || !s->display->loop || !cb || interval_ms == 0) + return 0; + + yasl_timer_id id = yasl_loop_add_timer_ms(s->display->loop, interval_ms, cb, ud); + if (!id) return 0; + + if (s->timer_count >= s->timer_capacity) { + int new_cap = s->timer_capacity ? s->timer_capacity * 2 : 4; + yasl_timer_id *nt = realloc(s->timers, (size_t)new_cap * sizeof(*nt)); + if (!nt) { + yasl_loop_del_timer(s->display->loop, id); + return 0; + } + s->timers = nt; + s->timer_capacity = new_cap; + } + s->timers[s->timer_count++] = id; + return id; +} + +bool yasl_surface_del_timer(struct yasl_surface *s, yasl_timer_id id) +{ + if (!s || id == 0) return false; + for (int i = 0; i < s->timer_count; i++) { + if (s->timers[i] == id) { + s->timers[i] = 0; + if (s->display && s->display->loop) + yasl_loop_del_timer(s->display->loop, id); + return true; + } + } + return false; +} + +yasl_timer_id yasl_display_add_timer(struct yasl_display *d, uint64_t interval_ns, + yasl_timer_cb cb, void *ud) +{ + if (!d || !d->loop) return 0; + return yasl_loop_add_timer(d->loop, interval_ns, cb, ud); +} + +yasl_timer_id yasl_display_add_timer_ms(struct yasl_display *d, uint32_t interval_ms, + yasl_timer_ms_cb cb, void *ud) +{ + if (!d || !d->loop) return 0; + return yasl_loop_add_timer_ms(d->loop, interval_ms, cb, ud); +} + +bool yasl_display_del_timer(struct yasl_display *d, yasl_timer_id id) +{ + if (!d || !d->loop) return false; + return yasl_loop_del_timer(d->loop, id); +} + +struct yasl_loop *yasl_display_loop(struct yasl_display *d) +{ + return d ? d->loop : NULL; +} + +struct yasl_loop *yasl_surface_loop(struct yasl_surface *s) +{ + return (s && s->display) ? s->display->loop : NULL; +} |
