/* interprets a 'move cursor' (CUP) escape sequence */ static void interpret_csi_CUP(RoteTerm *rt, int param[], int pcount) { if (pcount == 0) { /* special case */ rt->crow = rt->ccol = 0; return; } else if (pcount < 2) return; /* malformed */ rt->crow = param[0] - 1; /* convert from 1-based to 0-based */ rt->ccol = param[1] - 1; /* convert from 1-based to 0-based */ rt->curpos_dirty = true; clamp_cursor_to_bounds(rt); }
void vterm_resize(vterm_t *vterm,unsigned int width,unsigned int height) { struct winsize ws={.ws_xpixel=0,.ws_ypixel=0}; unsigned int i; int delta_x, delta_y, start_x, start_y; if(vterm==NULL) return; if(width==0 || height==0) return; delta_x=width-vterm->cols; delta_y=height-vterm->rows; start_x=vterm->cols; start_y=vterm->rows; vterm->cells=(vterm_cell_t**)realloc(vterm->cells, sizeof(vterm_cell_t*)*height); for(i=0;i < height;i++) { // realloc() does not initlize new elements if((delta_y > 0) && (i > vterm->rows-1)) vterm->cells[i]=NULL; vterm->cells[i]=(vterm_cell_t*)realloc(vterm->cells[i], sizeof(vterm_cell_t)*width); } vterm->rows=height; vterm->cols=width; if(!(vterm->state & STATE_SCROLL_SHORT)) { vterm->scroll_max=height-1; } ws.ws_row=height; ws.ws_col=width; clamp_cursor_to_bounds(vterm); if(delta_x > 0) vterm_erase_cols(vterm,start_x); if(delta_y > 0) vterm_erase_rows(vterm,start_y); ioctl(vterm->pty_fd,TIOCSWINSZ,&ws); kill(vterm->child_pid,SIGWINCH); return; }
/* Interpret the 'relative mode' sequences: CUU, CUD, CUF, CUB, CNL, * CPL, CHA, HPR, VPA, VPR, HPA */ static void interpret_csi_C(RoteTerm *rt, char verb, int param[], int pcount) { int n = (pcount && param[0] > 0) ? param[0] : 1; switch (verb) { case 'A': rt->crow -= n; break; case 'B': case 'e': rt->crow += n; break; case 'C': case 'a': rt->ccol += n; break; case 'D': rt->ccol -= n; break; case 'E': rt->crow += n; rt->ccol = 0; break; case 'F': rt->crow -= n; rt->ccol = 0; break; case 'G': case '`': rt->ccol = param[0] - 1; break; case 'd': rt->crow = param[0] - 1; break; } rt->curpos_dirty = true; clamp_cursor_to_bounds(rt); }
/* interprets a 'move cursor' (CUP) escape sequence */ void interpret_csi_CUP(vterm_t *vterm, int param[], int pcount) { if (pcount == 0) { /* special case */ vterm->crow=0; vterm->ccol=0; return; } else if (pcount < 2) return; // malformed vterm->crow=param[0]-1; // convert from 1-based to 0-based. vterm->ccol=param[1]-1; // convert from 1-based to 0-based. // vterm->state |= STATE_DIRTY_CURSOR; clamp_cursor_to_bounds(vterm); }
/* Interpret the 'relative mode' sequences: CUU, CUD, CUF, CUB, CNL, * CPL, CHA, HPR, VPA, VPR, HPA */ void interpret_csi_CUx(vterm_t *vterm,char verb,int param[],int pcount) { int n=1; if(pcount && param[0]>0) n=param[0]; switch (verb) { case 'A': vterm->crow -= n; break; case 'B': case 'e': vterm->crow += n; break; case 'C': case 'a': vterm->ccol += n; break; case 'D': vterm->ccol -= n; break; case 'E': { vterm->crow += n; vterm->ccol = 0; break; } case 'F': { vterm->crow -= n; vterm->ccol = 0; break; } case 'G': case '`': vterm->ccol=param[0]-1; break; case 'd': vterm->crow=param[0]-1; break; } // vterm->state |= STATE_DIRTY_CURSOR; clamp_cursor_to_bounds(vterm); return; }