예제 #1
0
/* 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);
}
예제 #2
0
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;
}
예제 #3
0
/* 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);
}
예제 #4
0
/* 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);
}
예제 #5
0
/* 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;
}