mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-14 05:33:59 -04:00
term: ptmx: cancel, and don't re-arm, delay timers when refresh has been disabled
This commit is contained in:
parent
7b27fa857f
commit
84f836c0c8
1 changed files with 39 additions and 27 deletions
66
terminal.c
66
terminal.c
|
|
@ -186,36 +186,48 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data)
|
||||||
* has any effect when the renderer is idle.
|
* has any effect when the renderer is idle.
|
||||||
*/
|
*/
|
||||||
if (term->window->frame_callback == NULL) {
|
if (term->window->frame_callback == NULL) {
|
||||||
/* First timeout - reset each time we receive input. */
|
if (term->render.refresh_prohibited) {
|
||||||
|
timerfd_settime(
|
||||||
#if PTMX_TIMING
|
term->delayed_render_timer.lower_fd, 0,
|
||||||
struct timespec now;
|
&(struct itimerspec){{0}}, NULL);
|
||||||
|
|
||||||
clock_gettime(1, &now);
|
|
||||||
if (last.tv_sec > 0 || last.tv_nsec > 0) {
|
|
||||||
struct timeval diff;
|
|
||||||
struct timeval l = {last.tv_sec, last.tv_nsec / 1000};
|
|
||||||
struct timeval n = {now.tv_sec, now.tv_nsec / 1000};
|
|
||||||
|
|
||||||
timersub(&n, &l, &diff);
|
|
||||||
LOG_INFO("waited %lu µs for more input", diff.tv_usec);
|
|
||||||
}
|
|
||||||
last = now;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
timerfd_settime(
|
|
||||||
term->delayed_render_timer.lower_fd, 0,
|
|
||||||
&(struct itimerspec){.it_value = {.tv_nsec = 500000}},
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
/* Second timeout - only reset when we render. Set to one
|
|
||||||
* frame (assuming 60Hz) */
|
|
||||||
if (!term->delayed_render_timer.is_armed) {
|
|
||||||
timerfd_settime(
|
timerfd_settime(
|
||||||
term->delayed_render_timer.upper_fd, 0,
|
term->delayed_render_timer.upper_fd, 0,
|
||||||
&(struct itimerspec){.it_value = {.tv_nsec = 16666666 / 2}},
|
&(struct itimerspec){{0}}, NULL);
|
||||||
|
term->render.refresh_needed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
/* First timeout - reset each time we receive input. */
|
||||||
|
|
||||||
|
#if PTMX_TIMING
|
||||||
|
struct timespec now;
|
||||||
|
|
||||||
|
clock_gettime(1, &now);
|
||||||
|
if (last.tv_sec > 0 || last.tv_nsec > 0) {
|
||||||
|
struct timeval diff;
|
||||||
|
struct timeval l = {last.tv_sec, last.tv_nsec / 1000};
|
||||||
|
struct timeval n = {now.tv_sec, now.tv_nsec / 1000};
|
||||||
|
|
||||||
|
timersub(&n, &l, &diff);
|
||||||
|
LOG_INFO("waited %lu µs for more input", diff.tv_usec);
|
||||||
|
}
|
||||||
|
last = now;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
timerfd_settime(
|
||||||
|
term->delayed_render_timer.lower_fd, 0,
|
||||||
|
&(struct itimerspec){.it_value = {.tv_nsec = 500000}},
|
||||||
NULL);
|
NULL);
|
||||||
term->delayed_render_timer.is_armed = true;
|
|
||||||
|
/* Second timeout - only reset when we render. Set to one
|
||||||
|
* frame (assuming 60Hz) */
|
||||||
|
if (!term->delayed_render_timer.is_armed) {
|
||||||
|
timerfd_settime(
|
||||||
|
term->delayed_render_timer.upper_fd, 0,
|
||||||
|
&(struct itimerspec){.it_value = {.tv_nsec = 16666666 / 2}},
|
||||||
|
NULL);
|
||||||
|
term->delayed_render_timer.is_armed = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
term->render.pending = true;
|
term->render.pending = true;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue