zoo demo: smooth out delays in mselect input #835

pull/873/head
nick black 4 years ago
parent e5d17fd20c
commit 8759572632
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC

@ -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;
}

Loading…
Cancel
Save