From 8759572632189b968fc2d7400ad98840a4af023a Mon Sep 17 00:00:00 2001 From: nick black Date: Mon, 10 Aug 2020 01:33:44 -0400 Subject: [PATCH] zoo demo: smooth out delays in mselect input #835 --- src/demo/zoo.c | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/demo/zoo.c b/src/demo/zoo.c index fced30846..0e38a55d1 100644 --- a/src/demo/zoo.c +++ b/src/demo/zoo.c @@ -57,7 +57,7 @@ static struct ncmselector_item mselect_items[] = { static struct ncmultiselector* multiselector_demo(struct ncplane* n, struct ncplane* under, int dimx, - int y, pthread_mutex_t* lock, int* res){ + int y, pthread_mutex_t* lock, int* ret){ struct notcurses* nc = ncplane_notcurses(n); ncmultiselector_options mopts = { .maxdisplay = 8, @@ -89,20 +89,38 @@ multiselector_demo(struct ncplane* n, struct ncplane* under, int dimx, pthread_mutex_unlock(lock); ncinput ni; for(int i = -length + 1 ; i < dimx - (length + 1) ; ++i){ - if( (*res = locked_demo_render(nc, lock)) ){ - ncmultiselector_destroy(mselector); - return NULL; - } - ncplane_move_yx(mplane, y, i); - char32_t wc = demo_getc(nc, &swoopdelay, &ni); - if(wc == (char32_t)-1){ - ncmultiselector_destroy(mselector); - return NULL; - }else if(wc){ - ncmultiselector_offer_input(mselector, &ni); - } + struct timespec now, deadline; + clock_gettime(CLOCK_MONOTONIC, &now); + ns_to_timespec(timespec_to_ns(&swoopdelay) + timespec_to_ns(&now), &deadline); + do{ + pthread_mutex_lock(lock); + *ret = demo_render(nc); + ncplane_move_yx(mplane, y, i); + pthread_mutex_unlock(lock); + if(*ret){ + ncmultiselector_destroy(mselector); + return NULL; + } + struct timespec iterdelay; + ns_to_timespec(timespec_subtract_ns(&deadline, &now), &iterdelay); + char32_t wc = demo_getc(nc, &iterdelay, &ni); + if(wc == (char32_t)-1){ + ncmultiselector_destroy(mselector); + return NULL; + }else if(wc){ + pthread_mutex_lock(lock); + ncmultiselector_offer_input(mselector, &ni); + *ret = demo_render(nc); + pthread_mutex_unlock(lock); + if(*ret){ + ncmultiselector_destroy(mselector); + return NULL; + } + } + clock_gettime(CLOCK_MONOTONIC, &now); + }while(timespec_to_ns(&now) < timespec_to_ns(&deadline)); } - if( (*res = locked_demo_render(nc, lock)) ){ + if( (*ret = locked_demo_render(nc, lock)) ){ ncmultiselector_destroy(mselector); return NULL; }