allow cursor enable/disable without a true tty

pull/2122/head
nick black 3 years ago
parent a07650c494
commit 321f9ecbe2

@ -1629,9 +1629,6 @@ int notcurses_cursor_enable(notcurses* nc, int y, int x){
if(nc->cursory == y && nc->cursorx == x){
return 0;
}
if(nc->tcache.ttyfd < 0){
return -1;
}
fbuf f = {};
if(fbuf_init_small(&f)){
return -1;
@ -1641,17 +1638,14 @@ int notcurses_cursor_enable(notcurses* nc, int y, int x){
fbuf_free(&f);
return -1;
}
if(fbuf_finalize(&f, nc->ttyfp)){
return -1;
}
// if we were already positive, we're already visible, no need to write cnorm
if(nc->cursory >= 0 && nc->cursorx >= 0){
nc->cursory = y;
nc->cursorx = x;
return 0;
if(nc->cursory < 0){ // we weren't visible before, need cnorm
const char* cnorm = get_escape(&nc->tcache, ESCAPE_CNORM);
if(!cnorm || fbuf_emit(&f, cnorm)){
fbuf_free(&f);
return -1;
}
}
const char* cnorm = get_escape(&nc->tcache, ESCAPE_CNORM);
if(!cnorm || tty_emit(cnorm, nc->tcache.ttyfd)){
if(fbuf_finalize(&f, nc->ttyfp)){
return -1;
}
nc->cursory = y;
@ -1664,14 +1658,12 @@ int notcurses_cursor_disable(notcurses* nc){
logerror("Cursor is not enabled\n");
return -1;
}
if(nc->tcache.ttyfd >= 0){
const char* cinvis = get_escape(&nc->tcache, ESCAPE_CIVIS);
if(cinvis){
if(!tty_emit(cinvis, nc->tcache.ttyfd) && !ncflush(nc->ttyfp)){
nc->cursory = -1;
nc->cursorx = -1;
return 0;
}
const char* cinvis = get_escape(&nc->tcache, ESCAPE_CIVIS);
if(cinvis){
if(!tty_emit(cinvis, nc->tcache.ttyfd) && !ncflush(nc->ttyfp)){
nc->cursory = -1;
nc->cursorx = -1;
return 0;
}
}
return -1;

@ -3,17 +3,34 @@
static int
rendered_cursor(void){
struct notcurses* nc = notcurses_init(NULL, NULL);
notcurses_cursor_enable(nc, 10, 10);
struct notcurses_options opts = {
.loglevel = NCLOGLEVEL_TRACE,
};
struct notcurses* nc = notcurses_init(&opts, NULL);
if(nc == NULL){
return -1;
}
if(notcurses_cursor_enable(nc, 10, 10)){
notcurses_stop(nc);
fprintf(stderr, "couldn't enable cursor\n");
return -1;
}
sleep(1);
notcurses_render(nc);
if(notcurses_render(nc)){
notcurses_stop(nc);
fprintf(stderr, "couldn't render\n");
return -1;
}
sleep(1);
notcurses_stop(nc);
return 0;
return notcurses_stop(nc);
}
int main(void){
struct ncdirect* n = ncdirect_core_init(NULL, stdout, 0);
if(rendered_cursor()){
return EXIT_FAILURE;
}
uint64_t flags = NCDIRECT_OPTION_VERY_VERBOSE;
struct ncdirect* n = ncdirect_core_init(NULL, stdout, flags);
if(n == NULL){
return EXIT_FAILURE;
}
@ -25,12 +42,10 @@ int main(void){
int dimy = ncdirect_dim_y(n);
printf("Cursor: column %d/%d row %d/%d\n", x, dimx, y, dimy);
ncdirect_stop(n);
if(rendered_cursor()){
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
err:
fprintf(stderr, "direct mode cursor lookup failed\n");
ncdirect_stop(n);
return EXIT_FAILURE;
}

Loading…
Cancel
Save