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