From: jNullj <15849761+jNullj@users.noreply.github.com> Date: Mon, 6 May 2024 21:39:12 +0000 (+0300) Subject: Add pause functionality to replay X-Git-Tag: v2.42-start~317^2~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3727ae82d577d87023741753cdc2e85c6965a72d;p=thirdparty%2Futil-linux.git Add pause functionality to replay Adds pause to replay_setup. Adds functions to toggle and get pause state. Adds stdin keys read - looks for space for pause toggle. Adds replay pause to replay render loop. --- diff --git a/term-utils/script-playutils.c b/term-utils/script-playutils.c index 1dec1afc8..854d95252 100644 --- a/term-utils/script-playutils.c +++ b/term-utils/script-playutils.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "c.h" #include "xalloc.h" @@ -59,6 +60,7 @@ struct replay_setup { size_t nlogs; struct replay_step step; /* current step */ + bool pause; FILE *timing_fp; const char *timing_filename; @@ -102,7 +104,10 @@ static inline void timerinc(struct timeval *a, struct timeval *b) struct replay_setup *replay_new_setup(void) { - return xcalloc(1, sizeof(struct replay_setup)); + struct replay_setup *ret; + ret = xcalloc(1, sizeof(struct replay_setup)); + ret->pause = false; + return ret; } void replay_free_setup(struct replay_setup *stp) @@ -297,6 +302,17 @@ int replay_step_is_empty(struct replay_step *step) return step->size == 0 && step->type == 0; } +bool replay_get_is_paused(struct replay_setup *setup) +{ + assert(setup); + return setup->pause; +} + +void replay_toggle_pause(struct replay_setup *setup) +{ + assert(setup); + setup->pause = !setup->pause; +} static int read_multistream_step(struct replay_step *step, FILE *f, char type) { diff --git a/term-utils/script-playutils.h b/term-utils/script-playutils.h index 53b3fd287..f3bce5fe4 100644 --- a/term-utils/script-playutils.h +++ b/term-utils/script-playutils.h @@ -1,6 +1,8 @@ #ifndef UTIL_LINUX_SCRIPT_PLAYUTILS_H #define UTIL_LINUX_SCRIPT_PLAYUTILS_H +#include + #include "c.h" #include "debug.h" @@ -47,4 +49,7 @@ int replay_get_next_step(struct replay_setup *stp, char *streams, struct replay_ int replay_emit_step_data(struct replay_setup *stp, struct replay_step *step, int fd); +bool replay_get_is_paused(struct replay_setup *setup); +void replay_toggle_pause(struct replay_setup *setup); + #endif /* UTIL_LINUX_SCRIPT_PLAYUTILS_H */ diff --git a/term-utils/scriptreplay.c b/term-utils/scriptreplay.c index ab3581eed..d08b87345 100644 --- a/term-utils/scriptreplay.c +++ b/term-utils/scriptreplay.c @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include "c.h" #include "xalloc.h" @@ -149,12 +151,14 @@ int main(int argc, char *argv[]) { static const struct timeval mindelay = { .tv_sec = 0, .tv_usec = 100 }; + static const struct timeval inputDelay = { .tv_sec = 0, .tv_usec = 100000 }; struct timeval maxdelay; int isterm; int saved_flag; struct termios saved; + wint_t c; struct replay_setup *setup = NULL; struct replay_step *step = NULL; char streams[6] = {0}; /* IOSI - in, out, signal,info */ @@ -318,6 +322,19 @@ main(int argc, char *argv[]) isterm = setterm(&saved, &saved_flag); do { + c = fgetwc(stdin); + switch (c) { + case ' ': + replay_toggle_pause(setup); + break; + } + + if (replay_get_is_paused(setup)) + { + delay_for(&inputDelay); + continue; + } + rc = replay_get_next_step(setup, streams, &step); if (rc) break;