[comp.sys.sgi] panel06/06

dat@ORVILLE.NAS.NASA.GOV ("David A. Tristram") (08/19/88)

#!/bin/sh
# this is part 6 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file strip.c continued
#
CurArch=6
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' >> strip.c
X
X  color(pnl_outline_color);
X  x = xorg + radius * cos(theta);
X  y = yorg + radius * sin(theta);
X  linewidth(PNL_METER_LINEWIDTH);
X  move2(xorg,yorg);
X  draw2(x,y);
X  linewidth(oldwidth);
X
X  color(pnl_outline_color);
X  arc(xorg, yorg, radius, 0, 1800);
X  move2(xorg,yorg);
X  rmv2(-radius,0.0);
X  rdr2(2.0*radius,0.0);
X
X  color(pnl_outline_color);
X  rect(0.0, 0.0, a->w, a->h);
X
X  popmatrix();
X  if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawstripchart(a,p)
XActuator *a;
XPanel *p;
X{
X  Coord x, y;
X  Actuator temp_act;
X  char temp_label[20];
X  float xfactor, yfactor, yoffset, labelwidth;
X  Stripchart * dp = (Stripchart *)a->data;
X  int i;
X  long oldwidth = getlwidth();
X
X
X  pushmatrix();
X  labelwidth = strwidth(" ") * 8 / p->ppu;
X  translate(a->x,a->y,0.0);
X
X  color(pnl_normal_color);
X  rectf(0.0, 0.0, a->w - labelwidth, a->h);
X
X  color(pnl_outline_color);
X
X  if (!dp->Bind_High || !dp->Bind_Low)
X    _setrange(a);
X
X  if (dp->firstpt != dp->lastpt) {
X    xfactor = (a->w-labelwidth) / (PNL_STRIP_CHART_NPTS + 1);
X    yfactor = a->h / (a->maxval - a->minval);
X    yoffset = .03 * yfactor * ( a->maxval - a->minval);
X    yfactor = .94 * yfactor;
X    x = xfactor;
X    y = yoffset +
X      ((RANGE(dp->y[dp->firstpt],a->minval,a->maxval) - a->minval) * yfactor);
X    linewidth(PNL_STRIP_LINEWIDTH);
X    move2(x, y);
X    i = dp->firstpt + 1;
X    if (i >= PNL_STRIP_CHART_NPTS) i = 0;
X    while (i != dp->lastpt) {
X      x += xfactor;
X      y = yoffset
X	+ ((RANGE(dp->y[i],a->minval,a->maxval) - a->minval) * yfactor);
X      draw2(x,y);
X      i++;
X      if (i >= PNL_STRIP_CHART_NPTS) i = 0;
X    }
X    linewidth(oldwidth);
X  }
X
X  color(pnl_outline_color);
X  rect(0.0, 0.0, a->w-labelwidth, a->h);
X
X  popmatrix();
X  if (a->label) drawlabel(a, p);
X
X  temp_act.labeltype = PNL_LABEL_RIGHT;
X  temp_act.label = temp_label;
X
X  temp_act.x = a->x;
X  temp_act.y = a->y;
X  temp_act.lx = a->w -labelwidth + PNL_DIM_2;
X  temp_act.ly = 0.0;
X  sprintf(temp_label,"%.3g",a->minval);
X  temp_act.lw = labelwidth;
X  temp_act.lh = (float)getheight()/p->ppu;
X  temp_act.ld = (float)getdescender()/p->ppu;
X  drawlabel(&temp_act, p);
X  temp_act.ly = a->h - temp_act.lh;
X  sprintf(temp_label,"%.3g",a->maxval);
X  drawlabel(&temp_act, p);
X}
X
Xvoid
Xpnl_analog_meter(a)
XActuator *a;
X{
X    a->type=PNL_ANALOG_METER;
X
X    a->w=PNL_METER_WIDTH;
X    a->h=PNL_METER_HEIGHT;
X    a->labeltype=PNL_LABEL_BOTTOM;
X    a->selectable=FALSE;	/* output actuator only */
X    a->drawfunc=_drawanalogmeter;
X}
X
Xvoid
Xpnl_meter(a)
XActuator *a;
X{
X    pnl_analog_meter(a);
X    a->type=PNL_METER;
X}
X
Xvoid
Xpnl_analog_bar(a)
XActuator *a;
X{
X    pnl_analog_meter(a);
X
X    a->type=PNL_ANALOG_BAR;
X    a->drawfunc=_drawanalogbar;
X}
X
Xvoid
Xpnl_strip_chart(a)
XActuator *a;
X{
X    a->type=PNL_STRIP_CHART;
X
X    a->w=PNL_STRIP_WIDTH;
X    a->h=PNL_STRIP_HEIGHT;
X    a->labeltype=PNL_LABEL_BOTTOM;
X    a->selectable=FALSE;	/* output actuator only */
X    a->data = alloc(sizeof(Stripchart));
X    a->datasize=sizeof(Stripchart);
X    PNL_ACCESS(Stripchart, a, Bind_Low) = TRUE;
X    PNL_ACCESS(Stripchart, a, Bind_High) = TRUE;
X    a->addfunc=_addstripchart;
X    a->fixfunc=_fixstripchart;
X    a->newvalfunc=_newvalstripchart;
X    a->dumpfunc=_dumpstripchart;
X    a->drawfunc=_drawstripchart;
X}
X
Xvoid
Xpnl_scale_chart(a)
XActuator *a;
X{
X    pnl_strip_chart(a);
X
X    a->type=PNL_SCALE_CHART;
X    PNL_ACCESS(Stripchart, a, Bind_Low) = FALSE;
X    PNL_ACCESS(Stripchart, a, Bind_High) = FALSE;
X}
SHAR_EOF
chmod 0644 strip.c || echo "restore of strip.c fails"
sed 's/^X//' << 'SHAR_EOF' > typein.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <gl.h>
X#include "panel.h"
X
Xvoid _newvaltypein(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
X    if (!a->active) return;
X
X    frontbuffer(TRUE);	/* hack hack hack */
X    (*a->drawfunc)(a,p);
X    frontbuffer(FALSE);
X    cmov2((Coord)(a->x+PNL_DIM_3),
X	 (Coord)(a->y+PNL_DIM_3)+(Coord)getdescender()/p->ppu);
X    strcpy(PNL_ACCESS(Typein,a,str),
X	   g_getstring(pnl_white_color,
X		       pnl_highlight_color,
X		       pnl_normal_color,
X		       PNL_ACCESS(Typein,a,str),
X		       PNL_ACCESS(Typein,a,len)));
X#ifndef IRIS_4D
X    pnl_justup=TRUE;		/* hack hack hack */
X    setinactive(pnl_ca,pnl_cp); /* hackus maximus */
X    
X    /* the 4d version of g_gets() seems to preserve mouse up events
X       better than the 3000 does */
X#endif	IRIS_4D	
X}
X
Xvoid
X_addtypein(a, p)
XActuator *a;
XPanel *p;
X{
Xint len;
Xchar *str = alloc(PNL_TYPEIN_MAX_STRING);
X
X    if (PNL_ACCESS(Typein, a, str)) strcpy(str,PNL_ACCESS(Typein, a, str));
X    PNL_ACCESS(Typein, a, str)=str;
X
X    len = (PNL_ACCESS(Typein, a, len)?
X	      PNL_ACCESS(Typein, a, len):
X	      PNL_TYPEIN_LENGTH);
X    PNL_ACCESS(Typein, a, len)=len;
X    a->w=(float)len*(float)strwidth("a")/p->ppu+2.0*PNL_DIM_3;
X    a->h=2.0*PNL_DIM_3+(Coord)getheight()/p->ppu;
X    a->datasize=sizeof(Typein)+PNL_TYPEIN_MAX_STRING;
X}
X
Xvoid _dumptypein(a, fd)
XActuator *a;
Xint fd;
X{
XTypein *ad=(Typein *)a->data;
Xstatic int msgtype=PNL_MT_STATE;
X
X  write(fd, &msgtype, sizeof(msgtype));
X  write(fd, &a->id, sizeof(a->id));
X  write(fd, a, sizeof(Actuator));
X  write(fd, &a->datasize, sizeof(int));
X  write(fd, a->data, sizeof(Typein));
X  write(fd, ad->str, PNL_TYPEIN_MAX_STRING);
X}
X
Xvoid _loadtypein(a, fd)
XActuator *a;
Xint fd;
X{
XTypein *ad=(Typein *)a->data;
X
X  read(fd, a, sizeof(Actuator));
X  read(fd, &a->datasize, sizeof(int));
X  read(fd, a->data, sizeof(Typein));
X  read(fd, ad->str, PNL_TYPEIN_MAX_STRING);
X}
X
Xvoid
X_drawtypein(a, p)
XActuator *a;
XPanel *p;
X{
X    if (a->active) color(pnl_highlight_color);
X    else	   color(pnl_normal_color);
X    rectf(a->x,a->y,a->x+a->w,a->y+a->h);
X    color(pnl_outline_color);
X    rect(a->x,a->y,a->x+a->w,a->y+a->h);
X    if (a->active) color(pnl_white_color);
X    else	   color(pnl_outline_color);
X    cmov2(a->x+PNL_DIM_3,a->y+PNL_DIM_3+(Coord)getdescender()/p->ppu);
X    charstr(PNL_ACCESS(Typein,a,str));
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
Xpnl_typein(a)
XActuator *a;
X{
X    a->type=PNL_TYPEIN;
X
X    a->labeltype=PNL_LABEL_BOTTOM;
X    a->data = alloc(sizeof(Typein));
X    a->datasize=sizeof(Typein);
X    PNL_ACCESS(Typein, a, len) = 0;
X    PNL_ACCESS(Typein, a, str) = "";
X    a->addfunc=_addtypein;
X    a->newvalfunc=_newvaltypein;
X    a->dumpfunc=_dumptypein;
X    a->drawfunc=_drawtypein;
X}
X
X/*
X * this _drawlabel() draws the label actuator, not to be confused with
X * drawlabel() that draws labels for every kind of actuator, (including, 
X * of course, label actuators).
X *
X */
X
Xvoid
X_drawlabel(a, p)
XActuator *a;
XPanel *p;
X{
XScreencoord tx1,ty1,tx2,ty2;
X
X    color(pnl_background_color);
X    rectf(a->x,a->y,a->x+a->w,a->y+a->h);
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
Xpnl_label(a)
XActuator *a;
X{
X    a->type=PNL_LABEL;
X
X    a->labeltype=PNL_LABEL_NORMAL;
X    a->drawfunc=_drawlabel;
X}
X
SHAR_EOF
chmod 0644 typein.c || echo "restore of typein.c fails"
sed 's/^X//' << 'SHAR_EOF' > typeout.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <stdio.h>
X#include <math.h>
X#include <gl.h>
X#include "panel.h"
X
Xchar 
X*_forwardline(a,p)
XActuator *a;
Xchar *p;
X{
XTypeout *ad=(Typeout *)a->data;
Xchar *q=p;
X
X    p+=strcspn(p,"\n");
X    if (p-q>ad->col) {
X	p-=(p-q)%ad->col;
X    }
X    if (*p=='\n') p++;
X    return p;
X}
X
Xchar 
X*_backline(a,p)
XActuator *a;
Xchar *p;
X{
XTypeout *ad=(Typeout *)a->data;
Xchar *q=p;
Xchar *r;
Xint c;
X
X    if (p==ad->buf) return p;
X
X    if (*(p-1)=='\n'&&p!=ad->buf+1) p-=2;
X    for (;;p--) {
X	if (p<=ad->buf) break;
X	if (*p=='\n') {
X	    p++;
X	    break;
X	}
X	if (q-p>ad->col) {		    /* wrapped line */
X/*
X	    count chars to previous newline or bob,
X	    take that count mod line length to find chars from left margin
X	    back up that amount, unless its 0, otherwise back up line length.
X*/
X	    for (r=p;r>ad->buf&&*r!='\n';r--);
X	    c=(p-r)%ad->col;
X	    if (c) p=q-c;
X	    else   p=q-ad->col;
X	    break;
X	}
X    }
X    return p;
X}
X
Xscrollup(a)
XActuator *a;
X{
XTypeout *ad=(Typeout *)a->data;
Xchar *s=ad->buf+ad->start;
Xint n;
X
X/*    if (*(ad->buf+ad->start)>ad->len) return; */
X    s=_forwardline(a, ad->buf+ad->start);
X    ad->start=s-ad->buf;
X    return;
X}
X
Xscrolldown(a)
XActuator *a;
X{
Xint n;
XTypeout *ad=(Typeout *)a->data;
Xchar *s=ad->buf+ad->start;
X
X    if (s-ad->buf<2) return;
X    n=2;
X    while (s-n>ad->buf&&*(s-n)!='\n') n++;
X    if (n==ad->start) n++; /* pointing to first char */
X    if (n<ad->col+2) {  /* regular line */
X	ad->start-=n-1;    
X    } else {	    /* wrapped line */
X	ad->start-=n-ad->col-1;
X    }
X}
X
Xint
X_linelen(a,p)
XActuator *a;
Xchar *p;
X{
XTypeout *ad=(Typeout *)a->data;
Xint i;
Xchar *q=p;
X
X    while (p<ad->buf+ad->len&&*p!='\n') p++;
X    return p-q;
X}
X
Xint
X_postopnt(a,x,y)
XActuator *a;
Xint x,y;
X{
XTypeout *ad=(Typeout *)a->data;
Xint i;
Xchar *p,*q;
X
X    p=q=ad->buf+ad->start;
X
X    for (i=0;i<y;i++) p=_forwardline(a,p);
X    p+=MIN(x,_linelen(a,p));
X    return p-q;
X}
X
Xvoid
X_pnttopos(a,pnt,x,y)
XActuator *a;
Xint pnt;
Xint *x,*y;
X{
XTypeout *ad=(Typeout *)a->data;
Xint i;
Xchar *p,*q,*r;
X
X    *x= *y=0;
X    p=q=r=ad->buf+ad->start;
X
X    while (p-q<=pnt) {
X	if (r==(p=_forwardline(a,p))) break; 
X	    /* in case p doesn't move */
X	(*y)++;
X	r=p;
X    }
X    p=_backline(a,p);
X    *y=MAX(0,*y-1);
X    *x=pnt-(p-q);
X}
X
Xvoid
Xtprint(a,s)
XActuator *a;
Xchar *s;
X{
XTypeout *ad=(Typeout *)a->data;
Xchar *p;
Xint c=0;
X
X    if (a->type!=PNL_TYPEOUT) {
X	fprintf(stderr, "tprint: actuator");
X	if (a->label) fprintf(stderr, " %s", a->label);
X	fprintf(stderr," not a typeout\n");
X	return;
X    }
X
X    ad->dot=ad->len;
X    for (p=ad->buf+ad->dot;p>ad->buf&&c<ad->lin;p--) {
X	if (*p=='\n') c++;
X    }
X    ad->start=MAX(0,p-ad->buf);
X    if (ad->start!=0) ad->start+=2;
X
X    if (strlen(s)+1>ad->size) {
X	tprint(a,"tprint: That message was too long!");
X	return;
X    }
X
X    if (ad->dot+strlen(s)+1>ad->size) {
X	ad->dot=0;
X    }
X
X    sprintf(ad->buf+ad->dot,"%s\n",s);
X    ad->dot+=strlen(s)+1;
X    *(ad->buf+ad->dot)='\0';
X
X    fixact(a);
X}
X
Xvoid _newvaltypeout(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
Xint n;
Xfloat f;
XTypeout *ad=(Typeout *)a->data;
XCoord xorg,yorg;    /* origin of top left text position */
XCoord wx, wy;
Xint tx, ty;	/* text position, increasing downwards */
X
X    if (!a->active) return;
X
X    xorg=a->x+PNL_DIM_3;
X    yorg=a->y+PNL_DIM_3+ad->cd
X	    +(ad->lin-1)*ad->ch;
X
X    mapw2(p->vobj,sx,sy,&wx,&wy);
X
X    if (wx>a->x+a->w-PNL_SCROLL_WIDTH) {    /* in scrollbar */
X	if (wy<a->y+PNL_TYPEOUT_ARROW_HEIGHT) { /* lower arrow */
X/*	    if (!pnl_justdown) return; */
X	    scrollup(a);
X	} else if (wy>a->y+a->h-PNL_TYPEOUT_ARROW_HEIGHT) { /* upper arrow */
X/*	    if (!pnl_justdown) return; */
X	    scrolldown(a);
X	} else {			/* elevator region */
X	    f=1.0-(wy-a->y-PNL_TYPEOUT_ARROW_HEIGHT)
X	        /(a->h-2.0*PNL_TYPEOUT_ARROW_HEIGHT);
X	    n=f*ad->len;
X	    while (n>0&&*(ad->buf+n-1)!='\n') n--;
X	    ad->start=n;
X	}
X    } else {	/* in typeout region */
X	tx=(wx-xorg)/ad->cw;
X	ty=(yorg-wy)/ad->ch+1.0;
X	tx=RANGE(tx,0,ad->col-1);
X	ty=RANGE(ty,0,ad->lin-1);
X	ad->dot=ad->start+_postopnt(a,tx,ty);
X/* printf("tx=%d, ty=%d, dot=%d\n",tx,ty,ad->dot); */
X    }
X}
X
Xvoid
X_fixtypeout(a)
XActuator *a;
X{
XTypeout *ad=(Typeout *)a->data;
X
X    ad->len=strlen(ad->buf);
X    a->datasize=sizeof(Typeout)+ad->len;
X    a->dirtycnt=2;
X}
X
Xvoid
X_addtypeout(a, p)
XActuator *a;
XPanel *p;
X{
XTypeout *ad=(Typeout *)a->data;
Xint col,lin;
X
X    ad->size = (ad->size?ad->size:PNL_TYPEOUT_BUFSIZ);
X    ad->buf=alloc(ad->size);
X
X    col = (ad->col?ad->col:PNL_TYPEOUT_COLUMNS);
X    ad->col=col;
X    lin = (ad->lin?ad->lin:PNL_TYPEOUT_LINES);
X    ad->lin=lin;
X
X    ad->cw=(Coord)strwidth("M")/p->ppu;
X    ad->ch=(Coord)getheight()/p->ppu;
X    ad->cd=(Coord)getdescender()/p->ppu;
X    a->w=(Coord)col*ad->cw+2.0*PNL_DIM_3+PNL_SCROLL_WIDTH;
X    a->h=(Coord)lin*ad->ch+2.0*PNL_DIM_3;
X
X    _fixtypeout(a);
X}
X
Xvoid _dumptypeout(a, fd)
XActuator *a;
Xint fd;
X{
XTypeout *ad=(Typeout *)a->data;
Xstatic int msgtype=PNL_MT_STATE;
X
X  write(fd, &msgtype, sizeof(msgtype));
X  write(fd, &a->id, sizeof(a->id));
X  write(fd, a, sizeof(Actuator));
X  write(fd, &a->datasize, sizeof(int));
X  write(fd, a->data, sizeof(Typeout));
X  write(fd, ad->buf, ad->len);
X}
X
Xvoid _loadtypeout(a, fd)
XActuator *a;
Xint fd;
X{
XTypeout *ad=(Typeout *)a->data;
X
X  read(fd, a, sizeof(Actuator));
X  read(fd, &a->datasize, sizeof(int));
X  read(fd, a->data, sizeof(Typeout));
X  read(fd, ad->buf, ad->len);
X}
X
Xvoid
X_drawscrollarrow()
X{
X    pmv2(PNL_TYPEOUT_ARROW_HEIGHT, PNL_DIM_3);
X    pdr2(PNL_DIM_3, PNL_TYPEOUT_ARROW_HEIGHT-PNL_DIM_3);
X    pdr2(PNL_SCROLL_WIDTH-PNL_DIM_3, PNL_TYPEOUT_ARROW_HEIGHT-PNL_DIM_3);
X    pclos();
X}
X
X_drawelevator(a, p, style)
XActuator *a;
XPanel *p;
Xint style;
X{
XTypeout *ad=(Typeout *)a->data;
XCoord y;
X
X    pushmatrix();
X    translate(a->x+a->w-PNL_SCROLL_WIDTH,
X	      a->y+PNL_TYPEOUT_ARROW_HEIGHT,
X	      0.0);
X    y=1.0-(float)ad->start/(float)ad->len;
X    y*=a->h-2.0*PNL_TYPEOUT_ARROW_HEIGHT-PNL_DIM_2;
X    if (style==PNL_FILLED)
X	rectf(0.0,y,PNL_SCROLL_WIDTH,y+PNL_DIM_2);
X    else
X	rect(0.0,y,PNL_SCROLL_WIDTH,y+PNL_DIM_2);
X    popmatrix();
X}
X
Xvoid
X_drawcursor(a, tx, ty)
XActuator *a;
Xint tx, ty;
X{
Xstatic char *s="M";
XTypeout *ad=(Typeout *)a->data;
X
X    pushmatrix();
X    translate(tx*ad->cw,-ty*ad->ch-ad->cd,0.0);
X    color(pnl_highlight_color);
X    rectf(0.0,0.0,ad->cw,ad->ch);
X    color(pnl_white_color);
X    cmov2(0.0,ad->cd);
X    sprintf(s, "%c", *(ad->buf+ad->dot));
X    charstr(s);
X    popmatrix();
X}
X
Xvoid
X_drawtypeout(a, p)
XActuator *a;
XPanel *p;
X{
Xint n, l=0;	/* upper left corner is col 0, lin 0. */
XCoord xorg, yorg;   /* origin of first char position */
Xint tx,ty;
Xchar *s, t[PNL_TYPEOUT_MAX_COLUMNS], *end;
XTypeout *ad=(Typeout *)a->data;
X
X    xorg=a->x+PNL_DIM_3;
X    yorg=a->y+PNL_DIM_3+ad->cd
X	    +(ad->lin-1)*ad->ch;
X
X    color(pnl_normal_color);
X    rectf(a->x,a->y,a->x+a->w,a->y+a->h);
X    color(pnl_outline_color);
X    rect(a->x,a->y,a->x+a->w,a->y+a->h);
X    rect(a->x+a->w-PNL_SCROLL_WIDTH, a->y, a->x+a->w, a->y+a->h);
X    rect(a->x+a->w-PNL_SCROLL_WIDTH, a->y+PNL_TYPEOUT_ARROW_HEIGHT,
X	 a->x+a->w, a->y+a->h-PNL_TYPEOUT_ARROW_HEIGHT);
X
X    color(pnl_highlight_color);
X    _drawelevator(a, p, PNL_FILLED);
X    color(pnl_outline_color);
X    _drawelevator(a, p, PNL_OPEN);
X
X    color(pnl_outline_color);
X    pushmatrix();
X    translate(a->x+a->w-PNL_SCROLL_WIDTH, a->y, 0.0);
X    _drawscrollarrow();
X    translate(0.0, a->h, 0.0);
X    scale(1.0, -1.0, 1.0);
X    _drawscrollarrow();
X    popmatrix();
X    
X    s=ad->buf+ad->start;
X/*  end=s+strlen(s);  /* waste of time? */
X    end=ad->buf+ad->len;
X
X    do {
X	if ((n=strcspn(s, "\n"))<ad->col) {
X	    strncpy(t, s, n);
X	    t[n]='\0';
X	    s+=strlen(t)+1;
X	} else {
X	    strncpy(t, s, ad->col);
X	    t[ad->col]='\0';
X	    s+=ad->col;
X	}
X	cmov2(xorg,yorg-(Coord)l*ad->ch);
X	charstr(t);
X	l++;
X    } while (s<end&&l<ad->lin);
X
X    if (ad->dot>=ad->start) {
X        _pnttopos(a,ad->dot-ad->start,&tx,&ty);
X	if (ty<ad->lin) {
X	    pushmatrix();
X	    translate(xorg,yorg,0.0);
X	    _drawcursor(a,tx,ty);
X	    popmatrix();
X	}
X    }
X/* printf("dot=%d, tx=%d, ty=%d\n",ad->dot,tx,ty); */
X
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
Xpnl_typeout(a)
XActuator *a;
X{
XTypeout *ad;
X
X    a->type=PNL_TYPEOUT;
X
X    a->labeltype=PNL_LABEL_BOTTOM;
X    a->data = alloc(sizeof(Typeout));
X    a->datasize=sizeof(Typeout);
X    ad=(Typeout *)a->data;
X    ad->buf = NULL;
X    ad->lin = 0;
X    ad->col = 0;
X    ad->start = 0;
X    ad->dot = 0;
X    ad->len = 0;
X    a->addfunc=_addtypeout;
X    a->newvalfunc=_newvaltypeout;
X    a->fixfunc=_fixtypeout;
X    a->dumpfunc=_dumptypeout;
X    a->drawfunc=_drawtypeout;
X}
X
SHAR_EOF
chmod 0644 typeout.c || echo "restore of typeout.c fails"
rm -f s2_seq_.tmp
echo "You have unpacked the last part"
exit 0