[comp.sources.atari.st] v02i023: uw -- Unix Windows windowing terminal software part05/05

koreth@ssyx.ucsc.edu (Steven Grimm) (03/03/89)

Submitted-by: sun.com!laidbak!katzung (Brian Katzung)
Posting-number: Volume 2, Issue 23
Archive-name: uw/part05

#!/bin/sh
# this is part 5 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file WINSUBR.C continued
#
CurArch=5
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> WINSUBR.C
X	    ++ scrolled;
X	  }
X	  break;
X
X	case '\036':	/* Home */
X	  cur_x = X0;
X	  cur_y = wp->top_y;
X	  break;
X
X	case '\013':	/* Cursor Up */
X	  if (cur_y!=wp->top_y) {
X	    cur_y -= inc_y;
X	  }
X	  break;
X
X	case '\014':	/* Cursor Right */
X	  if (cur_x < (xsiz - 1) * inc_x) cur_x += inc_x;
X	  break;
X
X	case '\032':	/* Clear Screen */
X	  wp->inverse = wp->insmode = 0;
X	  cur_x = X0;
X	  cur_y = Y0;
X	  wp->top_y = Y0;
X	  lineerase(wp, 0, ysiz - 1 + MAXSCROLLED);
X	  ++ scrolled;
X	  break;
X
X	case '\t':	/* Tab */
X	  cur_x = ((cur_x/inc_x/8+1))*inc_x*8+X0;
X	  break;
X
X	case '\033':	/* ESC */
X	  state = S_ESC;
X	  count = 0; /* count is used for insert or delete line */
X	  break;
X	}
X	f_x = cur_x;
X	f_y = cur_y;
X      }
X      break;
X
X    case S_ESC:
X      if (ch >= '0' && ch <= '9') {
X        count = count * 10 + ch - '0';
X	break;
X      }
X      switch (ch)
X      {
X      case '*':		/* Clear Screen */
X	f_x = cur_x = X0;
X	wp->top_y = f_y = cur_y = Y0;
X	wp->inverse = wp->insmode = 0;
X	lineerase(wp, 0, ysiz - 1 + MAXSCROLLED);
X	++ scrolled;
X	state = S_NORMAL;
X	break;
X
X      case 'Y':		/* Clear to End of Screen */
X	lineerase(wp, cur_y / inc_y + 1, ysiz - 1 + wp->top_y / inc_y);
X	if (! scrolled)
X	  w_update(wdes, FM_COPY, X0, cur_y + inc_y, xsiz*inc_x, ysiz*inc_y);
X	/* fall through */
X      case 'T':		/* Clear to End of Line */
X#ifdef	KOPY
X	x = cur_x + wp->m_off;
X	cnt = wp->wi_mf.wwords >> 1;
X	tfbmr((short *) 0, 0, 0, 0, wp->wi_mf.ptr, x, cur_y, cnt,
X	  X0 + xsiz * inc_x + wp->m_off - x, inc_y, 0);
X#else
X	t[0] = t[4] = cur_x + wp->m_off;
X	t[1] = t[5] = cur_y;
X	t[2] = t[6] = X0-1 + xsiz*inc_x +wp->m_off;
X	t[3] = t[7] = cur_y+inc_y-1;
X	vro_cpyfm(handle, 0, t, &wp->wi_mf, &wp->wi_mf);
X#endif
X	if (! scrolled)
X	  w_update(wdes, FM_COPY, cur_x, cur_y, xsiz * inc_x - cur_x, inc_y);
X	state = S_NORMAL;
X	break;
X
X      case 'E':		/* Add Line */
X      case 'R':		/* Delete Line */
X        if (count == 0) {
X	  count = 1;
X	  /* Look ahead for contiguous insert/delete line operations */
X	  while (*ptr == '\033' && ptr[1] == ch) {
X	    ptr +=2;
X	    count ++;
X	  }
X	}
X	if (ch == 'E')
X	  scrolldn(wp, cur_y/inc_y, ysiz-(cur_y-wp->top_y+Y0)/inc_y-count, count);
X	else
X	  scrollup(wp, cur_y / inc_y,
X	    ysiz - (cur_y - wp->top_y + Y0)/inc_y - count, count);
X	if (! scrolled)
X	  w_update(wdes, FM_COPY, X0, cur_y, xsiz * inc_x,
X	    ysiz * inc_y - cur_y + wp->top_y - Y0);
X	state = S_NORMAL;
X	break;
X
X      case 'q':		/* Insert Mode */
X	wp->insmode = 1;
X	state = S_NORMAL;
X	break;
X
X      case 'r':		/* End Insert */
X	wp->insmode = 0;
X	state = S_NORMAL;
X	break;
X
X      case 'W':		/* Delete Character */
X#ifdef	KOPY
X	x = cur_x + wp->m_off;
X	w = X0 + xsiz * inc_x + wp->m_off - x;
X	cnt = wp->wi_mf.wwords >> 1;
X	cpbmr(wp->wi_mf.ptr, x + inc_x, cur_y, cnt,
X	  wp->wi_mf.ptr, x, cur_y, cnt, w, inc_y);
X	tfbmr((short *) 0, 0, 0, 0,
X	  wp->wi_mf.ptr, X0 + (xsiz - 1) * inc_x + wp->m_off, cur_y, cnt,
X	  inc_x, inc_y, 0);
X#else
X	t[0] = cur_x + inc_x + wp->m_off;
X	t[1] = t[5] = cur_y;
X	t[2] = X0 - 1 + xsiz * inc_x + wp->m_off;
X	t[3] = t[7] = cur_y+inc_y - 1;
X	t[4] = t[0] - inc_x;
X	t[6] = t[2] - inc_x;
X	vro_cpyfm(handle, 3, t, &wp->wi_mf, &wp->wi_mf);
X	t[0] = t[4] = X0 + (xsiz - 1) * inc_x + wp->m_off;
X	t[2] = t[6] = t[0] + inc_x - 1;
X	vro_cpyfm(handle, 0, t, &wp->wi_mf, &wp->wi_mf);
X#endif
X	if (! scrolled)
X	  w_update(wdes, FM_COPY, cur_x, cur_y, xsiz * inc_x - (cur_x - X0),
X	    inc_y);
X	state = S_NORMAL;
X	break;
X
X      case '=':		/* Cursor Movement */
X	state = S_ESC1;
X	break;
X
X      case 'G':		/* Switch Inverse/Normal */
X	state = S_ESC2;
X	break;
X
X      case 'S':		/* Change Status Line */
X	state = S_STATUS;
X	wp->nuptr = 0;
X	break;
X	
X      case '[':		/* ascii escape */
X        state = S_ESCA;
X	wp->nuptr = 0;
X	break;
X
X      default:		/* Unknown escape sequence */
X	state = S_NORMAL;
X      }
X      break;
X
X    case S_ESC1:	/* get line number */
X      if (ch < ' ' || ch >= ' ' + ysiz) ch = ' ';
X      f_y = cur_y = (ch-' ')*inc_y + wp->top_y;
X      state = S_ESC3;
X      break;
X
X    case S_ESC3:	/* get column number */
X      if (ch < ' ' || ch >= ' ' + xsiz) ch = ' ';
X      f_x = cur_x = (ch-' ')*inc_x +X0;
X      state = S_NORMAL;
X      break;
X
X    case S_ESC2:	/* get normal/inverse state */
X      wp->inverse = ch&1;
X      state = S_NORMAL;
X      break;
X
X    case S_STATUS:
X      if (ch == '\r')
X      {
X	wp->nuname[wp->nuptr] = '\0';
X	w_rename(wdes, wp->nuname);
X	state = S_NORMAL;
X      } else if (wp->nuptr < 72)
X      {
X	wp->nuname[wp->nuptr++] = ch;
X      }
X      break;
X    case S_ESCA:
X      if (ch >= '0' && ch <= '9')
X        wp->nuptr = ch - '0' + 10 * wp->nuptr;
X      else if (ch == 't')
X      {
X        if (wp-> nuptr == 18)
X	{
X	  char posstr[20];
X	  
X	  sprintf(posstr, "\033[8;%d;%dt", ysiz, xsiz);
X	  proto_out(find_port(wdes), posstr, strlen(posstr));
X	}
X	state = S_NORMAL;
X      }
X      else state = S_NORMAL;
X      break;
X    } /* end switch on state */
X
X    if (scrolled >= MAXSCROLLED)
X    {
X      if (wp->top_y != Y0) {
X        scrollup(wp, 0, ysiz, wp->top_y/inc_y);
X	wp->top_y = Y0;
X        f_y = cur_y = Y0 + (ysiz - 1) * inc_y;
X      }
X      w_redraw(wdes, FM_COPY, wp->x, wp->y, wp->w, wp->h);
X      scrolled = 0;
X    }
X  } /* end while loop for each character */
X
X  if (wp->ptr_status & LOG_BOTOM) {
X    ptr = savptr;
X    while ((ch = *ptr++) && (wp->ptr_status & LOG_BOTOM))
X      if (Cprnout(ch) == 0) wp->ptr_status = LOG_NONE;
X  }
X
X  if (wp->wi_lfd) {
X    while (ch = *savptr++)
X      putc(ch, wp->wi_lfd);
X  }
X
X  if (scrolled) {
X    if (scrolled >= MAXSCROLLED) {
X      if (wp->top_y != Y0) {
X        scrollup(wp, 0, ysiz, wp->top_y/inc_y);
X        wp->top_y = Y0;
X        cur_y = Y0 + (ysiz - 1) * inc_y;
X      }
X    }
X    w_redraw(wdes, FM_COPY, wp->x, wp->y, wp->w, wp->h);
X  }
X  else
X    if (f_mod)
X    {
X      if (!wp->insmode)
X        w_update(wdes, FM_COPY, f_x, f_y, cur_x - f_x, inc_y);
X      else
X        w_update(wdes, FM_COPY, f_x, f_y, xsiz * inc_x-f_x, inc_y);
X    }
X  wp->cur_x = cur_x;
X  wp->cur_y = cur_y;
X  wp->state = state;
X#ifdef DEBUG
X  printf ("calling w_flash\n");
X#endif
X  w_flash(wdes, 1);
X}
X
Xlineerase(wp, first, last)
Xregister struct wi_str *wp;
X{
X  register int *p;
X  long count;
X  long linespace = wp->wi_mf.wwords*wp->font->inc_y;
X
X  p = wp->wi_mf.ptr + first*linespace + Y0*wp->wi_mf.wwords - 1;
X  count = (last-first+1)*linespace;
X  while (count > 7)
X  {
X    *(((long *)p)++) = 0;
X    *(((long *)p)++) = 0;
X    *(((long *)p)++) = 0;
X    *(((long *)p)++) = 0;
X    count -= 8;
X  }
X  while (--count >= 0)
X    *++p = 0;
X}
X
Xscrollup(wp, first, nlines, amount)
Xregister struct wi_str *wp;
X{
X  register int *p1, *p2;
X  register long count;
X  int linespace = wp->wi_mf.wwords*wp->font->inc_y;
X
X  p1 = wp->wi_mf.ptr + first*linespace + Y0*wp->wi_mf.wwords;
X  p2 = p1 + linespace * amount;
X  count = (long)(nlines)*linespace;
X  while (count > 15)
X  {
X    *(((long *)p1)++) = *(((long *)p2)++);
X    *(((long *)p1)++) = *(((long *)p2)++);
X    *(((long *)p1)++) = *(((long *)p2)++);
X    *(((long *)p1)++) = *(((long *)p2)++);
X    *(((long *)p1)++) = *(((long *)p2)++);
X    *(((long *)p1)++) = *(((long *)p2)++);
X    *(((long *)p1)++) = *(((long *)p2)++);
X    *(((long *)p1)++) = *(((long *)p2)++);
X    count -= 16;
X  }
X  while (--count >= 0)
X    *(p1++) = *(p2++);
X  count = linespace * amount;
X  while (count > 7)
X  {
X    *(((long *)p1)++) = 0;
X    *(((long *)p1)++) = 0;
X    *(((long *)p1)++) = 0;
X    *(((long *)p1)++) = 0;
X    count -= 8;
X  }
X  while (--count >= 0)
X    *(p1++) = 0;
X}
X
Xscrolldn(wp, first, nlines, amount)
Xregister struct wi_str *wp;
X{
X  register int *p1, *p2;
X  register long count;
X  long linespace = wp->wi_mf.wwords*wp->font->inc_y;
X
X  p1 = wp->wi_mf.ptr + (nlines+first+amount)*linespace + Y0*wp->wi_mf.wwords;
X
X  p2 = p1 - linespace * amount;
X  count = (long)(nlines)*linespace;
X  while (count > 15)
X  {
X    *--(long *)p1 = *--(long *)p2;
X    *--(long *)p1 = *--(long *)p2;
X    *--(long *)p1 = *--(long *)p2;
X    *--(long *)p1 = *--(long *)p2;
X    *--(long *)p1 = *--(long *)p2;
X    *--(long *)p1 = *--(long *)p2;
X    *--(long *)p1 = *--(long *)p2;
X    *--(long *)p1 = *--(long *)p2;
X    count -= 16;
X  }
X  while (--count >= 0)
X    *--p1 = *--p2;
X  count = linespace * amount;
X  while (count > 7)
X  {
X    *--(long *)p1 = 0L;
X    *--(long *)p1 = 0L;
X    *--(long *)p1 = 0L;
X    *--(long *)p1 = 0L;
X    count -= 8;
X  }
X  while (--count >= 0)
X    *--p1 = 0;
X}
SHAR_EOF
chmod 0600 WINSUBR.C || echo "restore of WINSUBR.C fails"
rm -f s2_seq_.tmp
echo "You have unpacked the last part"
exit 0