ncdirect_cursor_move_yx: only use cursor_yx_get with a real terminal #1486

dankamongmen/thirdpass
nick black 3 years ago
parent afeed4d075
commit 21de64f65b
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC

@ -185,22 +185,31 @@ cursor_yx_get(int ttyfd, int* y, int* x){
return 0; return 0;
} }
// if we're lacking hpa/vpa, *and* -1 is passed for one of x/y, *and* we've
// not got a real ctermfd, we're pretty fucked. we just punt and substitute
// 0 for that case, which hopefully only happens when running headless unit
// tests under TERM=vt100. if we need to truly rigourize things, we could
// cub/cub1 the width or cuu/cuu1 the height, then cuf/cub back? FIXME
int ncdirect_cursor_move_yx(ncdirect* n, int y, int x){ int ncdirect_cursor_move_yx(ncdirect* n, int y, int x){
if(y == -1){ // keep row the same, horizontal move only if(y == -1){ // keep row the same, horizontal move only
if(n->tcache.hpa){ if(n->tcache.hpa){
return term_emit(tiparm(n->tcache.hpa, x), n->ttyfp, false); return term_emit(tiparm(n->tcache.hpa, x), n->ttyfp, false);
}else{ }else if(n->ctermfd >= 0){
if(cursor_yx_get(n->ctermfd, &y, NULL)){ if(cursor_yx_get(n->ctermfd, &y, NULL)){
return -1; return -1;
} }
}else{
y = 0;
} }
}else if(x == -1){ // keep column the same, vertical move only }else if(x == -1){ // keep column the same, vertical move only
if(!n->tcache.vpa){ if(!n->tcache.vpa){
return term_emit(tiparm(n->tcache.vpa, y), n->ttyfp, false); return term_emit(tiparm(n->tcache.vpa, y), n->ttyfp, false);
}else{ }else if(n->ctermfd >= 0){
if(cursor_yx_get(n->ctermfd, NULL, &x)){ if(cursor_yx_get(n->ctermfd, NULL, &x)){
return -1; return -1;
} }
}else{
x = 0;
} }
} }
if(n->tcache.cup){ if(n->tcache.cup){
@ -387,6 +396,9 @@ ncdirect_dump_plane(ncdirect* n, const ncplane* np, int xoff){
ncplane_dim_yx(np, &dimy, &dimx); ncplane_dim_yx(np, &dimy, &dimx);
if(np->sprite){ if(np->sprite){
if(xoff){ if(xoff){
// doing an x-move without specifying the y coordinate requires asking
// the terminal where the cursor currently is. this will obviously only
// work on a real terminal
if(ncdirect_cursor_move_yx(n, -1, xoff)){ if(ncdirect_cursor_move_yx(n, -1, xoff)){
return -1; return -1;
} }
@ -396,7 +408,7 @@ ncdirect_dump_plane(ncdirect* n, const ncplane* np, int xoff){
} }
return 0; return 0;
} }
//fprintf(stderr, "rasterizing %dx%d+%d\n", dimy, dimx, xoff); fprintf(stderr, "rasterizing %dx%d+%d\n", dimy, dimx, xoff);
// save the existing style and colors // save the existing style and colors
const bool fgdefault = ncdirect_fg_default_p(n); const bool fgdefault = ncdirect_fg_default_p(n);
const bool bgdefault = ncdirect_bg_default_p(n); const bool bgdefault = ncdirect_bg_default_p(n);

Loading…
Cancel
Save