From 321f9ecbe2afdf86f5d981c354ea6af906f93fbb Mon Sep 17 00:00:00 2001 From: nick black Date: Thu, 26 Aug 2021 05:14:04 -0400 Subject: [PATCH] allow cursor enable/disable without a true tty --- src/lib/render.c | 34 +++++++++++++--------------------- src/poc/cursor.c | 33 ++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/lib/render.c b/src/lib/render.c index 014dd17c8..d0cecd090 100644 --- a/src/lib/render.c +++ b/src/lib/render.c @@ -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; diff --git a/src/poc/cursor.c b/src/poc/cursor.c index 9f1de7c9f..89f1fd6f9 100644 --- a/src/poc/cursor.c +++ b/src/poc/cursor.c @@ -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; }