diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/tui.c | 8 | ||||
-rw-r--r-- | src/ui/tui.h | 1 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/ui/tui.c b/src/ui/tui.c index 16cef30..5f6acaa 100644 --- a/src/ui/tui.c +++ b/src/ui/tui.c @@ -1,6 +1,7 @@ #include "tui.h" #include <stdarg.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -513,10 +514,11 @@ bool widget_eqauls(const WIDGET *restrict left, const WIDGET *restrict right) { const int NANO_TO_SECOND = 1000000000; -void nano_sleep(long int nano_seconds) { +int64_t nano_sleep(long int nano_seconds) { struct timespec remaining, request = {nano_seconds / NANO_TO_SECOND, nano_seconds % NANO_TO_SECOND}; nanosleep(&request, &remaining); + return remaining.tv_sec * NANO_TO_SECOND + remaining.tv_nsec; } long int nano_time() { @@ -528,6 +530,7 @@ long int nano_time() { void tui_main_loop(TUI *tui, WIDGET_BUILDER widget_builder, int fps) { const long int frame_nano = (fps == FRAME_UNLIMITED) ? 0 : NANO_TO_SECOND / fps; + int64_t last_remaining = 0; while (1) { const long int start = nano_time(); tui_save_cursor(); @@ -546,8 +549,9 @@ void tui_main_loop(TUI *tui, WIDGET_BUILDER widget_builder, int fps) { tui_restore_cursor(); if (fps != FRAME_UNLIMITED) { const long int diff = nano_time() - start; - nano_sleep(frame_nano - diff); + last_remaining = nano_sleep(frame_nano - diff + last_remaining); } + tui->last_frame = nano_time() - start; if (kbhit()) { if (handle_input(tui)) { return; diff --git a/src/ui/tui.h b/src/ui/tui.h index 436e132..baf0c3a 100644 --- a/src/ui/tui.h +++ b/src/ui/tui.h @@ -62,6 +62,7 @@ typedef struct TUI { int init_cursor_x, init_cursor_y; TERMINAL_CELL *cells; size_t cells_length; + uint64_t last_frame; // in nanoseconds } TUI; typedef enum WIDGET_TYPE { |