Path: utzoo!attcan!uunet!lll-winken!lll-tis!helios.ee.lbl.gov!nosc!ucsd!ucbvax!ORVILLE.NAS.NASA.GOV!dat
From: dat@ORVILLE.NAS.NASA.GOV ("David A. Tristram")
Newsgroups: comp.sys.sgi
Subject: panel04/06
Message-ID: <8808182120.AA25321@orville.nas.nasa.gov>
Date: 18 Aug 88 21:20:51 GMT
Sender: daemon@ucbvax.BERKELEY.EDU
Organization: The Internet
Lines: 2137
#!/bin/sh
# this is part 4 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file g_gets.c continued
#
CurArch=4
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' >> g_gets.c
Xchar *g_getstring(stringcolor, backcolor, cursorcolor, protostring, maxstringlen)
X /* do a gets without using textports ..echoing the */
X /* character on the screen, erasing when necessary */
X/*-----------------------------------------------------------------------*/
XColorindex stringcolor, backcolor, cursorcolor;
Xchar *protostring; /* initial string */
Xint maxstringlen;
X{
X int g_getchar();
X register int i;
X int c;
X int protolen = strlen(protostring);
X
X char_width = strwidth("a");
X char_height = getheight();
X char_descender = getdescender();
X getcpos(&ix, &iy);
X
X numqueued = 0;
X numevents = 0;
X capitalize = 0;
X controlize = 0;
X
X saveq();
X pushviewport();
X pushattributes();
X pushmatrix();
X screenspace();
X
X frontbuffer(1); backbuffer(0);
X
X for (i = 1; i <= MAXKBDBUT; i++) qdevice(i);
X if (protolen>maxstringlen) goto exit;
X
Xrestart:
X bzero(string, maxstringlen);
X color(cursorcolor);
X drawcursor(protolen, maxstringlen);
X if (protolen) {
X strcpy(string, protostring);
X cmov2i(ix,iy);
X color(stringcolor);
X charstr(protostring);
X }
X for (i = protolen;;) {
X string[i]=(char)(c=g_getchar());
X switch(c) {
X case '\n':
X case '\r':
X case '\0':
X case QUIT:
X string[i] = '\0';
X goto exit;
X case RESET:
X color(backcolor);
X drawcursor(i, maxstringlen);
X cmov2i(ix,iy);
X charstr(string);
X cmov2i(ix,iy);
X protolen=0;
X goto restart;
X case ERASE:
X if (i == 0) break;
X string[i--] = '\0';
X color(backcolor);
X drawcursor(i+1, maxstringlen);
X color(cursorcolor);
X drawcursor(i, maxstringlen);
X cmov2i(ix+ i*char_width , iy);
X break;
X default:
X if (!(i gets.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/*
X * g_gets.c : How to read a string from the keyboard without a textport.
X *
X */
X#include
X#include
X#include
X
X#define MAXSTRINGLEN 80
X#define MAXQUEUED 100
X#define MAXDEVICES 1024
X#define ERASE -2
X#define QUIT -1
X
Xtypedef struct {
X int device_num;
X char lower;
X char upper;
X} KEY ;
X
Xstatic KEY keyboard[] =
X{
X { AKEY, 'a', 'A' },
X { BKEY, 'b', 'B' },
X { CKEY, 'c', 'C' },
X { DKEY, 'd', 'D' },
X { EKEY, 'e', 'E' },
X { FKEY, 'f', 'F' },
X { GKEY, 'g', 'G' },
X { HKEY, 'h', 'H' },
X { IKEY, 'i', 'I' },
X { JKEY, 'j', 'J' },
X { KKEY, 'k', 'K' },
X { LKEY, 'l', 'L' },
X { MKEY, 'm', 'M' },
X { NKEY, 'n', 'N' },
X { OKEY, 'o', 'O' },
X { PKEY, 'p', 'P' },
X { QKEY, 'q', 'Q' },
X { RKEY, 'r', 'R' },
X { SKEY, 's', 'S' },
X { TKEY, 't', 'T' },
X { UKEY, 'u', 'U' },
X { VKEY, 'v', 'V' },
X { WKEY, 'w', 'W' },
X { XKEY, 'x', 'X' },
X { YKEY, 'y', 'Y' },
X { ZKEY, 'z', 'Z' },
X { ZEROKEY, '0', ')' },
X { ONEKEY, '1', '!' },
X { TWOKEY, '2', '@' },
X { THREEKEY, '3', '#' },
X { FOURKEY, '4', '$' },
X { FIVEKEY, '5', '%' },
X { SIXKEY, '6', '^' },
X { SEVENKEY, '7', '&' },
X { EIGHTKEY, '8', '*' },
X { NINEKEY, '9', '(' },
X { SEMICOLONKEY, ';', ':' },
X { PERIODKEY, '.', '>' },
X { COMMAKEY, ',', '<' },
X { ACCENTGRAVEKEY,'`', '~' },
X { MINUSKEY, '-', '_' },
X { QUOTEKEY, '\'', '"' },
X { BACKSLASHKEY, '\\', '|' },
X { EQUALKEY, '=', '+' },
X { LEFTBRACKETKEY,'[', '{' },
X { RIGHTBRACKETKEY,']', '}' },
X { VIRGULEKEY, '/', '?' },
X { SPACEKEY, ' ', '\0' },
X { TABKEY, '\t', '\0' },
X { RETKEY, '\r', '\0' },
X { LINEFEEDKEY, '\n', '\0' },
X { BREAKKEY, '\0', '\0' },
X { BACKSPACEKEY, '\b', '\0' },
X { DELKEY, '\0', '\0' },
X { SETUPKEY, '\0', '\0' },
X { CTRLKEY, '\0', '\0' },
X { CAPSLOCKKEY, '\0', '\0' },
X { RIGHTSHIFTKEY, '\0', '\0' },
X { LEFTSHIFTKEY, '\0', '\0' },
X { NOSCRLKEY, '\0', '\0' },
X { ESCKEY, '\0', '\0' },
X { LEFTARROWKEY, '\0', '\0' },
X { DOWNARROWKEY, '\0', '\0' },
X { RIGHTARROWKEY, '\0', '\0' },
X { UPARROWKEY, '\0', '\0' },
X { -1, '\0', '\0' }
X};
X
X
Xstatic char string[MAXSTRINGLEN];
Xstatic int bufmode;
X
X/*-----------------------------------------------------------------------*/
Xchar *g_gets(ix, iy, stringcolor, backcolor)
X /* do a gets without using textports ..echoing the */
X /* character on the screen, erasing when necesary */
X/*-----------------------------------------------------------------------*/
XColorindex stringcolor, backcolor;
X{
X
X static int inited = 0;
X char g_getchar();
X int i;
X int char_width = strwidth("a");
X
X saveq();
X frontbuffer(TRUE);
X backbuffer(FALSE);
X
X for (i = 1; i <= MAXKBDBUT; i++) qdevice(i);
X cmov2i(ix, iy);
X bzero(string, MAXSTRINGLEN);
X
X for (i = 0; i < MAXSTRINGLEN;) {
X switch(string[i] = g_getchar())
X {
X case '\n':
X case '\r':
X/* checkit(); */
X string[i] = '\0';
X goto exit;
X
X case '\0':
X case QUIT:
X for (i = 1; i <= MAXKBDBUT; i++) unqdevice(i);
X restoreq();
X return(NULL);
X
X case ERASE:
X if (i == 0) break;
X string[i--] = '\0';
X cmov2i(ix+ i*char_width , iy);
X color(backcolor);
X charstr(&string[i]);
X cmov2i(ix+ i*char_width , iy);
X break;
X
X default:
X/* checkit(); */
X color(stringcolor);
X charstr(&string[i++]);
X break;
X }
X }
X
Xexit:
X for (i = 1; i <= MAXKBDBUT; i++) unqdevice(i);
X restoreq();
X return(string);
X}
X
X/*-----------------------------------------------------------------------*/
Xstatic char g_getchar() /* do a getchar without using textports */
X/*-----------------------------------------------------------------------*/
X{
X static capitalize = 0;
X short val;
X char upperkey(), lowerkey();
X long key;
X
X for(;;){
X key= qread(&val);
X if (key == LEFTSHIFTKEY || key == RIGHTSHIFTKEY){
X capitalize = val;
X continue;
X }else if (val) /* do until user holds a key down */
X break;
X }
X
X switch(key)
X {
X case DELKEY:
X case BACKSPACEKEY:
X return(ERASE);
X
X case ESCKEY:
X return(QUIT);
X default:
X if (capitalize) return(upperkey(key));
X else return (lowerkey(key));
X }
X}
X
X/*-------------------------------------------------------------------------*/
Xstatic char lowerkey(dev) /* maps sgi keyboard device numbers to printable */
X /* ascii characters. null for nonprintables */
X/*-------------------------------------------------------------------------*/
X{
X int i;
X
X for (i = 0; keyboard[i].device_num != -1; i++)
X if(dev == keyboard[i].device_num) return(keyboard[i].lower);
X return('\0');
X}
X
X/*-------------------------------------------------------------------------*/
Xstatic char upperkey(dev) /* maps sgi keyboard device numbers to printable */
X /* ascii characters. null for nonprintables */
X/*-------------------------------------------------------------------------*/
X{
X int i;
X
X for (i = 0; keyboard[i].device_num != -1; i++)
X if(dev == keyboard[i].device_num) return(keyboard[i].upper);
X return('\0');
X}
X
X
Xstatic int numqueued = 0;
Xstatic int qstack[MAXQUEUED];
X
X/*------------------------------------------------------------------------*/
Xstatic saveq() /* save the device numbers of all keyboard queued devices */
X /* and unqueue them */
X/*------------------------------------------------------------------------*/
X{
X int i;
X
X bufmode = getbuffer(); /* also save enabled buffers */
X for (i = 1; i <= MAXKBDBUT; i++)
X if (isqueued(i)) {
X qstack[numqueued++] = i;
X if (numqueued >= MAXQUEUED) {
X fprintf(stderr, "Eeeek qstack overflow\n");
X return;
X }
X unqdevice(i);
X }
X}
X
X/*-----------------------------------------------------------------------*/
Xstatic restoreq() /* requeue all devices that were queued */
X/*-----------------------------------------------------------------------*/
X{
X backbuffer(bufmode&0x1); /* also restore enabled buffers */
X frontbuffer(bufmode&0x2);
X while (numqueued) qdevice(--numqueued);
X qreset();
X}
SHAR_EOF
chmod 0644 gets.c || echo "restore of gets.c fails"
sed 's/^X//' << 'SHAR_EOF' > mouse.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
X#include "panel.h"
X
Xvoid _newvalmouse(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
X Mouse *ad=(Mouse *)a->data;
X
X ad->x=p->x+sx; /* relative to screen origin */
X ad->y=p->y+sy;
X
X if (a->active) a->val=1.0;
X else a->val=0.0;
X}
X
Xvoid
X_addmouse(a, p)
XActuator *a;
XPanel *p;
X{
X if (pnl_mouse_act) {
X fprintf(stderr, "libpanel: warning, duplicate pnl_mouse actuator\n");
X return;
X }
X a->data=alloc(sizeof(Mouse));
X pnl_mouse_act=a;
X}
X
Xvoid
Xpnl_mouse(a)
XActuator *a;
X{
X a->type=PNL_MOUSE;
X
X/* a->automatic=TRUE; */
X a->visible=FALSE;
X a->newvalfunc=_newvalmouse;
X a->addfunc=_addmouse;
X a->drawfunc=NULL;
X}
X
SHAR_EOF
chmod 0644 mouse.c || echo "restore of mouse.c fails"
sed 's/^X//' << 'SHAR_EOF' > palette.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
X#include "panel.h"
X
X#define FINE_CONTROL_FACTOR 0.05
X
Xvoid setpaletteval(a, x, dist)
X Actuator *a;
X Coord x;
X float dist;
X{
X Palette *ad=(Palette *)a->data;
X
X if (pnl_justdown) {
X a->val=PNL_WORLD_TO_VAL(x, a->minval, a->maxval, dist);
X ad->wsave=x;
X }
X
X if (pnl_controlkey) a->val+= ad->finefactor
X *(x-ad->wsave)/dist*(a->maxval-a->minval);
X else {
X a->val=PNL_WORLD_TO_VAL(x, a->minval, a->maxval, dist);
X }
X a->val=RANGE(a->val, a->maxval, a->minval);
X
X ad->wsave=x;
X }
X
Xvoid _newvalvpalette(a,p,sx,sy)
X Actuator *a;
X Panel *p;
X Screencoord sx,sy;
X{
X Palette *ad=(Palette *)a->data;
X Coord wx, wy;
X float tmp;
X
X if (!a->active) return;
X
X mapw2(p->vobj,sx,sy,&wx,&wy);
X
X setpaletteval(a, wy-a->y, a->h);
X}
X
Xvoid _newvalhpalette(a,p,sx,sy)
X Actuator *a;
X Panel *p;
X Screencoord sx,sy;
X{
X Palette *ad=(Palette *)a->data;
X Coord wx, wy;
X
X if (!a->active) return;
X
X mapw2(p->vobj,sx,sy,&wx,&wy);
X
X setpaletteval(a, wx-a->x, a->w);
X}
X
Xvoid
X_drawvpalette(a, p)
XActuator *a;
XPanel *p;
X{
XCoord y;
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X setshade((Colorindex)a->minval);
X pmv2(0.0, 0.0);
X pdr2(a->w, 0.0);
X setshade((Colorindex)a->maxval);
X pdr2(a->w, a->h);
X pdr2(0.0, a->h);
X spclos();
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_drawhpalette(a, p)
XActuator *a;
XPanel *p;
X{
XCoord y;
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X setshade((Colorindex)a->minval);
X pmv2(0.0, 0.0);
X pdr2(0.0, a->h);
X setshade((Colorindex)a->maxval);
X pdr2(a->w, a->h);
X pdr2(a->w, 0.0);
X spclos();
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
Xpnl_palette(a)
XActuator *a;
X{
X Palette *ad;
X
X a->type=PNL_PALETTE;
X
X a->data = alloc(sizeof(Palette));
X a->datasize = sizeof(Palette);
X ad=(Palette *)a->data;
X ad->wsave=0.0;
X ad->finefactor=FINE_CONTROL_FACTOR;
X
X a->labeltype=PNL_LABEL_BOTTOM;
X a->w=PNL_SLIDER_WIDTH;
X a->h=PNL_SLIDER_HEIGHT;
X a->newvalfunc=_newvalvpalette;
X a->drawfunc=_drawvpalette;
X}
X
Xvoid
Xpnl_vpalette(a)
XActuator *a;
X{
X pnl_palette(a);
X a->type=PNL_VSLIDER;
X
X a->w=PNL_SLIDER_WIDTH;
X a->h=PNL_SLIDER_HEIGHT;
X a->newvalfunc=_newvalvpalette;
X a->drawfunc=_drawvpalette;
X}
X
Xvoid
Xpnl_hpalette(a)
XActuator *a;
X{
X pnl_palette(a);
X a->type=PNL_HSLIDER;
X
X a->w=PNL_SLIDER_HEIGHT;
X a->h=PNL_SLIDER_WIDTH;
X a->newvalfunc=_newvalhpalette;
X a->drawfunc=_drawhpalette;
X}
X
SHAR_EOF
chmod 0644 palette.c || echo "restore of palette.c fails"
sed 's/^X//' << 'SHAR_EOF' > panel.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
X#include
X#include
X#include
X#include
X#include
X#include
X
X#define PNL_EXTERN /* nothing */
X#define PNL_INIT(X) = (X)
X#include "panel.h"
X
X#ifdef IRIS_4D
XActuator *pickact(Panel *, Screencoord, Screencoord);
XBoolean _hitact(/*Actuator *, Panel *, Coord, Coord*/); /* note: can't declare floats */
Xvoid _dumpact(Actuator *, int);
Xvoid _loadact(Actuator *, int);
Xvoid _fixpnl(Panel *);
Xvoid _drawpnl(Panel *);
X#else IRIS_4D
XActuator *pickact();
XBoolean _hitact();
Xvoid _dumpact();
Xvoid _loadact();
Xvoid _fixpnl();
Xvoid _drawpnl();
X#endif IRIS_4D
X
Xjmp_buf dopanel_return;
Xint pnl_winmouse;
XBoolean pnl_shiftkey_save;
XBoolean pnl_controlkey_save;
X
XPanel
X*mkpanel()
X{
X Panel *p;
X int winsave=winget();
X
X p=(Panel *)alloc(sizeof(Panel));
X
X if (pnl_pl) p->next=pnl_pl;
X else p->next=NULL;
X pnl_pl=p;
X
X pnl_table[pnl_id]=(char *)p;
X p->id=pnl_id++;
X p->al=NULL;
X p->lastgroup=NULL;
X p->active=FALSE;
X p->gid= -1;
X p->usergid=winget();
X p->label=NULL;
X p->enabled=TRUE;
X p->fixfunc=_fixpnl;
X p->drawfunc=_drawpnl;
X p->downfunc=NULL;
X p->activefunc=NULL;
X p->upfunc=NULL;
X p->dirtycnt=2;
X
X /* if user touches these, we won't make our
X own guesses for them in dopanel() */
X p->x=p->y=p->w=p->h=0;
X
X p->ppu=PNL_PIXELS_PER_UNIT;
X
X p->vobj=genobj();
X makeobj(p->vobj);
X maketag(1);
X ortho2(0.0,10.0,0.0,10.0); /* placeholder viewing transform */
X closeobj();
X
X winset(winsave);
X return p;
X}
X
X
XActuator
X*mkact(initfunc)
Xvoid (* initfunc)();
X{
XActuator *a;
X
X a=(Actuator *)alloc(sizeof(Actuator));
X
X pnl_table[pnl_id]=(char *)a;
X a->id=pnl_id++;
X a->active=FALSE;
X a->key=NULLDEV;
X a->label=NULL;
X a->labeltype=PNL_LABEL_BOTTOM;
X a->addfunc=NULL;
X a->fixfunc=NULL;
X a->pickfunc=_hitact;
X a->dumpfunc=_dumpact;
X a->loadfunc=_loadact;
X a->newvalfunc=NULL;
X a->downfunc=NULL;
X a->activefunc=NULL;
X a->upfunc=NULL;
X a->group=a;
X a->automatic=FALSE;
X a->selectable=TRUE;
X a->visible=TRUE;
X a->next=NULL;
X a->w=0.0;
X a->h=0.0;
X a->minval=0.0;
X a->maxval=1.0;
X a->val=0.0;
X
X if (initfunc) (* initfunc)(a);
X
X return a;
X}
X
XActuator
X*_mkuseract(size, initfunc)
Xint size;
X#ifdef IRIS_4D
Xvoid (* initfunc)(Actuator *);
X#else IRIS_4D
Xvoid (* initfunc)();
X#endif IRIS_4D
X{
X Actuator *temp = (Actuator *) alloc (size);
X if (sizep=p;
X
X a->next=p->al;
X p->al=a;
X
X a->initval=a->val; /* save for later resets */
X
X if (a->label) {
X a->lw=(float)strwidth(a->label)/p->ppu;
X a->lh=(float)getheight()/p->ppu;
X a->ld=(float)getdescender()/p->ppu;
X }
X
X if (a->addfunc) (*a->addfunc)(a, p);
X
X if (a->automatic) {
X Alist *al=(Alist *)alloc(sizeof(Alist));
X al->a=a;
X al->next=p->autolist;
X p->autolist=al;
X }
X
X if (a->key!=NULLDEV) {
X Alist *al=(Alist *)alloc(sizeof(Alist));
X al->a=a;
X al->next=pnl_kl;
X pnl_kl=al;
X
X qdevice(a->key);
X }
X
X a->dirtycnt=2;
X}
X
Xvoid
Xaddtogroup(a, p)
XActuator *a;
XPanel *p;
X{
X if (!p->lastgroup) p->lastgroup=a;
X a->group=p->lastgroup->group;
X p->lastgroup->group=a;
X}
X
Xvoid
Xendgroup(p)
XPanel *p;
X{
X p->lastgroup=NULL;
X}
X
Xvoid
Xfixpanel(p)
XPanel *p;
X{
X if (p&&p->fixfunc) {
X (*p->fixfunc)(p);
X }
X p->dirtycnt = 2;
X}
X
Xvoid
Xfixact(a)
XActuator *a;
X{
X if (a&&a->fixfunc) {
X (*a->fixfunc)(a);
X }
X a->dirtycnt = 2;
X}
X
Xvoid
Xlabeloffsets(a)
XActuator *a;
X{
X switch (a->labeltype) {
X case PNL_LABEL_NORMAL:
X a->lx=0.0;
X a->ly=0.0;
X break;
X case PNL_LABEL_CENTER:
X a->lx=0.5*(a->w-a->lw);
X a->ly=0.5*(a->h-a->lh);
X break;
X case PNL_LABEL_BOTTOM:
X a->lx=0.5*(a->w-a->lw);
X a->ly= -(a->lh+PNL_DIM_2);
X break;
X case PNL_LABEL_RIGHT:
X a->lx=a->w+PNL_DIM_2;
X a->ly=0.5*(a->h-a->lh);
X break;
X case PNL_LABEL_LEFT:
X a->lx= -(a->lw+PNL_DIM_2);
X a->ly=0.5*(a->h-a->lh);
X break;
X case PNL_LABEL_TOP:
X a->lx=0.5*(a->w-a->lw);
X a->ly=a->h+PNL_DIM_2;
X break;
X default:
X printf("unknown label type %d\n", a->labeltype);
X exit(1);
X }
X}
X
Xvoid
Xpanellimits(p)
XPanel *p;
X{
XActuator *a;
Xfloat bx, by, bw, bh;
X
X p->minx=100000.0;
X p->miny=100000.0;
X p->maxx= -100000.0;
X p->maxy= -100000.0;
X
X for (a=p->al;a;a=a->next) {
X
X if (!a->visible) continue;
X
X bx=a->x;
X by=a->y;
X bw=a->w;
X bh=a->h; /* bounding box */
X
X if (a->label) {
X
X labeloffsets(a);
X
X bx=MIN(a->x,a->x+a->lx);
X by=MIN(a->y,a->y+a->ly);
X bw=a->w+MAX(0.0,-a->lx)+MAX(0.0,a->lx+a->lw-a->w);
X bh=a->h+MAX(0.0,-a->ly)+MAX(0.0,a->ly+a->lh-a->h);
X }
X
X p->minx=MIN(p->minx, bx);
X p->maxx=MAX(p->maxx, bx+bw);
X p->miny=MIN(p->miny, by);
X p->maxy=MAX(p->maxy, by+bh);
X }
X p->minx-=PNL_MARGIN;
X p->maxx+=PNL_MARGIN;
X p->miny-=PNL_MARGIN;
X p->maxy+=PNL_MARGIN;
X}
X
Xreshapepanel(p)
XPanel *p;
X{
Xfloat w,h;
X
X winset(p->gid);
X getorigin(&p->x,&p->y);
X getsize(&p->w, &p->h);
X reshapeviewport();
X panellimits(p);
X
X if ((p->maxx-p->minx)/(p->maxy-p->miny)
X >(float)p->w/(float)p->h) {
X w=(p->maxx-p->minx);
X h=(float)p->h/(float)p->w*w;
X p->ppu=(float)p->w/w;
X } else {
X h=(p->maxy-p->miny);
X w=(float)p->w/(float)p->h*h;
X p->ppu=(float)p->h/h;
X }
X
X editobj(p->vobj);
X objreplace(1);
X ortho2(p->minx,p->minx+w,p->miny,p->miny+h);
X closeobj();
X callobj(p->vobj);
X
X p->dirtycnt=2;
X}
X
Xpnl_initpanel(p)
XPanel *p;
X{
X static long ux, uy, uh, uw, dx=0;
X long lx, ly;
X Scoord tbh;
X Boolean no_user_port=FALSE;
X
X panellimits(p);
X
X if (!(p->h&&p->w)) {
X p->h=p->ppu*(p->maxy-p->miny);
X p->w=p->ppu*(p->maxx-p->minx);
X }
X
X /* panel position defaults */
X
X if (p->label) tbh=PNL_TITLE_BAR_HEIGHT;
X else tbh=0.0;
X if (!(p->x&&p->y)) {
X if (!(pnl_ox&&pnl_oy)) {
X int tmp=winget();
X
X winset(p->usergid);
X getorigin(&ux,&uy);
X getsize(&uw,&uh);
X if (uw&&uh) {
X p->x=ux+uw+PNL_SCREEN_BORDER;
X p->y=uy+uh-p->h;
X winset(tmp);
X } else
X /* if no user window, do a */
X /* prefsize instead of a prefposition */
X no_user_port=TRUE;
X } else {
X p->x=pnl_ox;
X p->y=pnl_oy-p->h-PNL_SCREEN_BORDER-tbh;
X if (p->y<0) { /* off bottom of screen */
X p->x+=dx;
X p->y=uy+uh-p->h;
X dx=0;
X }
X if (p->x+p->w>XMAXSCREEN) { /* off right edge of screen */
X ux+=PNL_TITLE_BAR_HEIGHT;
X uy-=PNL_TITLE_BAR_HEIGHT;
X p->x=ux+uw+PNL_SCREEN_BORDER;
X p->y=uy+uh-p->h;
X }
X }
X }
X dx=MAX(dx, p->w+PNL_SCREEN_BORDER);
X pnl_ox=p->x;
X pnl_oy=p->y;
X
X if (no_user_port) prefsize(p->w, p->h);
X else prefposition(p->x,p->x+p->w,p->y,p->y+p->h);
X#ifdef IRIS_NEWS
X if (!p->label) noborder();
X#endif IRIS_NEWS
X
X if (p->label)
X p->gid=winopen(p->label);
X else
X p->gid=winopen("control panel");
X
X if (no_user_port) {
X getorigin(&lx, &ly);
X p->x=lx;
X p->y=ly;
X }
X
X#ifdef IRIS_NEWS
X qenter(REDRAW, p->gid);
X qenter(INPUTCHANGE, p->gid);
X#endif IRIS_NEWS
X winconstraints();
X winconstraints();
X keepaspect(p->w,p->h);
X winconstraints();
X
X#ifdef IRIS_4D
X doublebuffer();
X gconfig();
X#endif IRIS_4D
X
X reshapepanel(p);
X if (p->label) wintitle(p->label);
X}
X
Xvoid
Xneedredraw()
X{
X pnl_saveuserredraw=TRUE;
X}
X
Xshort
Xuserredraw()
X{
XPanel *p;
XDevice dev;
Xshort data;
X
X if (qtest()==REDRAW) {
X dev=qread(&data);
X for (p=pnl_pl;p&&!(p->gid==data);p=p->next);
X if (!p) {
X#ifdef DEBUG
Xprintf("userredraw consuming a REDRAW for mex window %d\n",data);
X#endif DEBUG
X return data;
X } else {
X#ifdef DEBUG
Xprintf("userredraw requeueing a REDRAW for panel %s\n",p->label);
X#endif DEBUG
X qenter(dev,data);
X return 0;
X }
X } else return 0;
X}
X
Xvoid init()
X{
X Panel *p;
X
X for (p=pnl_pl;p;p=p->next) pnl_initpanel(p);
X
X qdevice(LEFTMOUSE);
X tie(LEFTMOUSE, MOUSEX, MOUSEY);
X qdevice(LEFTSHIFTKEY);
X qdevice(RIGHTSHIFTKEY);
X#ifdef IRIS_4D
X qdevice(LEFTCTRLKEY);
X qdevice(RIGHTCTRLKEY);
X#else IRIS_4D
X qdevice(CTRLKEY);
X#endif IRIS_4D
X#ifdef IRIS_NEWS
X qdevice(WINFREEZE); /* allows app to run when panels are collapsed */
X qdevice(WINTHAW);
X#endif IRIS_NEWS
X
X pnl_virgin=FALSE;
X}
X
Xputactiontoscript() /* format could be compressed */
X{
X static int lastframe=0;
X static int msgtype_delay=PNL_MT_DELAY;
X static int msgtype_mouse=PNL_MT_MOUSE;
X static int buf[9];
X
X if (pnl_frame>1) {
X if (pnl_delayvirgin) { pnl_delayvirgin--; } /* skip first two delays */
X else if ((write(pnl_scriptoutfd,
X &msgtype_delay,
X sizeof(msgtype_delay))!=sizeof(msgtype_delay))
X || (write(pnl_scriptoutfd,
X &pnl_frame,
X sizeof(pnl_frame))!=sizeof(pnl_frame))) {
X perror(pnl_scriptoutfile);
X pnl_writescript=FALSE;
X return FALSE;
X }
X }
X pnl_frame=0;
X
X buf[0]=(int)pnl_cp->id;
X buf[1]=(int)pnl_ca->id;
X buf[2]=(int)pnl_mx-pnl_cp->x; /* the ultimate would be in world space */
X buf[3]=(int)pnl_my-pnl_cp->y;
X buf[4]=(int)pnl_justup;
X buf[5]=(int)pnl_justdown;
X buf[6]=(int)pnl_mousedown;
X buf[7]=(int)pnl_shiftkey;
X buf[8]=(int)pnl_controlkey;
X
X if ((write(pnl_scriptoutfd,
X &msgtype_mouse,
X sizeof(msgtype_mouse))!=sizeof(msgtype_mouse))
X ||(write(pnl_scriptoutfd,buf,sizeof(buf))!=sizeof(buf))) {
X perror(pnl_scriptoutfile);
X pnl_writescript=FALSE;
X return FALSE;
X }
X
X#ifdef DEBUG
X fprintf(stderr,"X");
X#endif DEBUG
X return TRUE;
X}
X
XBoolean
Xpnl_beginreadscript(name)
Xchar *name;
X{
X if (pnl_writescript) return FALSE;
X if (strcmp(name, pnl_scriptinfile)||!pnl_scriptinfd) {
X if (pnl_scriptinfd) close(pnl_scriptinfd);
X if (0>(pnl_scriptinfd=open(pnl_scriptinfile,O_RDONLY))) {
X perror(pnl_scriptinfile);
X return FALSE;
X }
X strcpy(pnl_scriptinfile, name);
X }
X lseek(pnl_scriptinfd, 0, 0);
X pnl_readscript=TRUE;
X}
X
XBoolean
Xpnl_beginwritescript(name)
Xchar *name;
X{
X if (pnl_readscript) return FALSE;
X if (strcmp(name, pnl_scriptoutfile)||!pnl_scriptoutfd) {
X if (pnl_scriptoutfd) close(pnl_scriptoutfd);
X/* if (0>(pnl_scriptoutfd=open(pnl_scriptoutfile,
X O_WRONLY||O_APPEND||O_CREAT))) { */
X if (0>(pnl_scriptoutfd=creat(pnl_scriptoutfile,0777))) {
X perror(pnl_scriptoutfile);
X return FALSE;
X }
X strcpy(pnl_scriptoutfile, name);
X }
X pnl_writescript=TRUE;
X pnl_delayvirgin=2;
X}
X
XBoolean
Xpnl_beginappendscript(name)
Xchar *name;
X{
X int c;
X
X if (pnl_readscript) return FALSE;
X if (strcmp(name, pnl_scriptoutfile)||!pnl_scriptoutfd) {
X if (pnl_scriptoutfd) close(pnl_scriptoutfd);
X if (0>(pnl_scriptoutfd=open(pnl_scriptoutfile,
X O_WRONLY||O_APPEND))) {
X perror(pnl_scriptoutfile);
X return FALSE;
X }
X strcpy(pnl_scriptoutfile, name);
X }
X if (!strcmp(pnl_scriptinfile,pnl_scriptoutfile)&&pnl_scriptinfd) {
X c=lseek(pnl_scriptinfd, 0, 1);
X lseek(pnl_scriptoutfd,c);
X } else
X lseek(pnl_scriptoutfd, 0, 2);
X pnl_writescript=TRUE;
X}
X
Xvoid
Xpnl_endreadscript()
X{
X/*if (pnl_scriptinfd) close(pnl_scriptinfd); */
X pnl_readscript=FALSE;
X}
X
Xvoid
Xpnl_endwritescript()
X{
X if (pnl_scriptoutfd) {
X close(pnl_scriptoutfd);
X pnl_scriptoutfd=0;
X }
X pnl_writescript=FALSE;
X}
X
XBoolean
Xalt()
X{
X static Boolean state;
X
X return state=!state;
X}
X
Xvoid
Xdumpstate()
X{
XPanel *p;
XActuator *a;
X
X if (pnl_readscript) return;
X if (!pnl_scriptoutfd) pnl_beginwritescript("panel.script");
X if (!pnl_scriptoutfd) {
X fprintf(stderr, "Can't write script file\n");
X return;
X }
X
X for (p=pnl_pl;p;p=p->next)
X for (a=p->al;a;a=a->next)
X (a->dumpfunc)(a, pnl_scriptoutfd);
X
X}
X
Xvoid
Xgetnewactive(ca,cp,mx,my)
X Actuator **ca;
X Panel **cp;
X Screencoord mx, my;
X{
X Panel *p=NULL;
X Actuator *a=NULL;
X
X#ifndef IRIS_NEWS
X#ifdef IRIS_4D
X pnl_winmouse=gl_winat(mx,my);
X#else IRIS_4D
X pnl_winmouse=winat(mx,my);
X#endif IRIS_4D
X#endif IRIS_NEWS
X for (p=pnl_pl;p;p=p->next)
X if (pnl_winmouse==p->gid) break;
X
X#ifdef DEBUG
X if (p) printf("a hit on panel %s\n", p->label);
X else printf("a mousedown on mex window %d missed all panels\n", pnl_winmouse);
X#endif DEBUG
X
X if (p) {
X p->active=TRUE;
X if ((a=pickact(p,mx,my))&&a->selectable) {
X
X#ifdef DEBUG
X printf("picked %s\n", a->label);
X#endif DEBUG
X
X a->active=TRUE;
X a->dirtycnt=2;
X } else { /* hit background */
X winset(p->gid);
X winpop();
X }
X } else { /* special case, mouse actuator active outside all panels */
X if (pnl_mouse_act&&pnl_mouse_act->selectable) {
X#ifdef DEBUG
X printf("picked the mouse actuator\n");
X#endif DEBUG
X p=pnl_pl; /* set current panel to be non-null */
X p->active=TRUE;
X a=pnl_mouse_act;
X a->active=TRUE;
X }
X }
X *cp=p;
X *ca=a;
X}
X
Xvoid
Xdofuncs(a,p)
XActuator *a;
XPanel *p;
X{
X if (pnl_justdown) {
X if (p&&a&&a->downfunc) {
X winset(p->usergid);
X (*a->downfunc)(a);
X winset(p->gid);
X }
X if (p&&p->downfunc) {
X winset(p->usergid);
X (*p->downfunc)(p);
X winset(p->gid);
X }
X }
X if (p&&a&&a->active&&a->activefunc) {
X winset(p->usergid);
X (*a->activefunc)(a);
X winset(p->gid);
X }
X if (p&&p->active&&p->activefunc) {
X winset(p->usergid);
X (*p->activefunc)(p);
X winset(p->gid);
X }
X if (pnl_justup) {
X if (p&&a&&a->upfunc) {
X winset(p->usergid);
X (*a->upfunc)(a);
X winset(p->gid);
X }
X if (p&&p->upfunc) {
X winset(p->usergid);
X (*p->upfunc)(p);
X winset(p->gid);
X }
X }
X}
X
Xsetinactive(a,p)
XActuator *a;
XPanel *p;
X{
X if (p) p->active=FALSE;
X if (a) {
X
X#ifdef DEBUG
X printf("unpicked %s\n", a->label);
X#endif DEBUG
X
X a->active=FALSE;
X a->dirtycnt=2;
X }
X}
X
Xvoid
Xdoautos(p,mx,my)
XPanel *p;
XScreencoord mx,my;
X{
XAlist *e;
XScreencoord sx=mx-p->x, sy=my-p->y;
X
X for (e=p->autolist;e;e=e->next){
X if (e->a->automatic) (*e->a->newvalfunc)(e->a,p,sx,sy);
X }
X}
X
XBoolean
Xgetactionfromqueue()
X{
X Panel *p=NULL;
X Device dev;
X short data;
X Alist *e;
X
X pnl_ca=pnl_ca_save;
X pnl_cp=pnl_cp_save;
X if (pnl_ca) pnl_ca->active=pnl_ca_active_save;
X if (pnl_cp) pnl_cp->active=pnl_cp_active_save;
X pnl_shiftkey=pnl_shiftkey_save;
X pnl_controlkey=pnl_controlkey_save;
X
X pnl_justup=pnl_justdown=FALSE;
X redo:
X if (qtest()) {
X dev=qread(&data);
X switch(dev) {
X#ifdef IRIS_NEWS
X case INPUTCHANGE:
X pnl_winmouse=data;
X goto redo;
X#endif IRIS_NEWS
X case PNL_TOKEN:
X#ifdef DEBUG
X printf("consumed a PNL_TOKEN, dopanel returning\n");
X#endif DEBUG
X#ifdef IRIS_4D
X longjmp(dopanel_return,TRUE);
X#else IRIS_4D
X break; /* mustn't get out of sync on 3030's */
X#endif IRIS_4D
X case REDRAW:
X for (p=pnl_pl;p;p=p->next) {
X if (p->gid==data) {
X reshapepanel(p);
X break;
X }
X }
X /* this redraw must not be for a panel, requeue it here */
X if (!p&&pnl_saveuserredraw) {
X#ifdef DEBUG
X printf("enqueing a PNL_TOKEN\n");
X#endif DEBUG
X qenter(PNL_TOKEN);
X qenter(dev,data);
X }
X break;
X case LEFTMOUSE:
X pnl_mousedown=data;
X pnl_justdown=pnl_mousedown;
X pnl_justup=!pnl_mousedown;
X dev=qread(&data); pnl_mx=data;
X dev=qread(&data); pnl_my=data;
X break;
X case LEFTSHIFTKEY:
X case RIGHTSHIFTKEY:
X pnl_shiftkey=data;
X break;
X#ifdef IRIS_4D
X case LEFTCTRLKEY:
X case RIGHTCTRLKEY:
X#else IRIS_4D
X case CTRLKEY:
X#endif IRIS_4D
X pnl_controlkey=data;
X break;
X default:
X /* check for key equivalents */
X for (e=pnl_kl;e;e=e->next)
X if (e->a->key==dev) break;
X if (e) {
X pnl_mousedown=data;
X pnl_justdown=pnl_mousedown;
X pnl_justup=!pnl_mousedown;
X
X if (!pnl_justdown&&!pnl_justup&&pnl_cp) {
X pnl_mx=getvaluator(MOUSEX);
X pnl_my=getvaluator(MOUSEY);
X }
X
X pnl_ca=e->a;
X pnl_cp=e->a->p;
X goto end;
X }
X break;
X }
X }
X
X if (!pnl_justdown&&!pnl_justup&&pnl_cp) {
X pnl_mx=getvaluator(MOUSEX);
X pnl_my=getvaluator(MOUSEY);
X }
X
X if (pnl_justdown) getnewactive(&pnl_ca,&pnl_cp,pnl_mx,pnl_my);
X if (pnl_justup) setinactive(pnl_ca,pnl_cp);
X
X end:
X pnl_ca_save=pnl_ca;
X pnl_cp_save=pnl_cp;
X if (pnl_ca) pnl_ca_active_save=pnl_ca->active;
X if (pnl_cp) pnl_cp_active_save=pnl_cp->active;
X pnl_shiftkey_save=pnl_shiftkey;
X pnl_controlkey_save=pnl_controlkey;
X
X pnl_action_source=PNL_SRC_QUEUE;
X}
X
Xgetactionfromscript()
X {
X int c, msgtype;
X short actid;
X static int buf[9];
X
X pnl_justup=pnl_justdown=FALSE;
X
X if (pnl_delay>pnl_frame) return FALSE;
X
X more:
X pnl_cp=NULL;
X pnl_ca=NULL;
X
X if ((c=read(pnl_scriptinfd,&msgtype,sizeof(msgtype)))!=sizeof(msgtype)) {
X#ifdef DEBUG
X fprintf(stderr, "end of script on read\n");
X#endif DEBUG
X pnl_readscript=FALSE;
X return FALSE;
X }
X
X switch (msgtype) {
X case PNL_MT_MOUSE:
X if ((c=read(pnl_scriptinfd,buf,sizeof(buf)))!=sizeof(buf)) {
X#ifdef DEBUG
X fprintf(stderr, "end of script on read\n");
X#endif DEBUG
X pnl_readscript=FALSE;
X return FALSE;
X }
X
X if ( buf[0]<0
X ||buf[0]>=pnl_id
X ||buf[1]<0
X ||buf[1]>=pnl_id) {
X fprintf(stderr,"libpanel: bad actuator index in script file.\n");
X pnl_readscript=FALSE;
X return FALSE;
X }
X
X /* throw away script events for actuator the user is mousing */
X if ((Actuator *)pnl_table[buf[1]]==pnl_ca_save) return FALSE;
X
X pnl_cp=(Panel *)pnl_table[buf[0]];
X pnl_ca=(Actuator *)pnl_table[buf[1]];
X pnl_mx=(Screencoord)buf[2]+pnl_cp->x;
X pnl_my=(Screencoord)buf[3]+pnl_cp->y;
X pnl_justup=(Boolean)buf[4];
X pnl_justdown=(Boolean)buf[5];
X pnl_mousedown=(Boolean)buf[6];
X pnl_shiftkey=(Boolean)buf[7];
X pnl_controlkey=(Boolean)buf[8];
X
X pnl_cp->active=pnl_ca->active=pnl_mousedown;
X if (!pnl_mousedown) fixact(pnl_ca);
X
X pnl_action_source=PNL_SRC_SCRIPT;
X return TRUE;
X case PNL_MT_STATE:
X if ((c=read(pnl_scriptinfd,&actid,sizeof(actid)))!=sizeof(actid)) {
X#ifdef DEBUG
X fprintf(stderr, "end of script on read\n");
X#endif DEBUG
X pnl_readscript=FALSE;
X return FALSE;
X }
X if ( actid<0
X ||actid>=pnl_id) {
X fprintf(stderr, "libpanel: bad actuator identifier in script file.\n");
X pnl_readscript=FALSE;
X return FALSE;
X }
X (*(((Actuator *)pnl_table[actid])->loadfunc))
X (pnl_table[actid], pnl_scriptinfd);
X fixact((Actuator *)pnl_table[actid]);
X goto more;
X break;
X case PNL_MT_DELAY:
X if ((c=read(pnl_scriptinfd,
X &pnl_delay,
X sizeof(pnl_delay)))!=sizeof(pnl_delay)) {
X#ifdef DEBUG
X fprintf(stderr, "end of script on read\n");
X#endif DEBUG
X pnl_readscript=FALSE;
X return FALSE;
X }
X pnl_frame=0;
X break;
X default:
X fprintf(stderr, "libpanel: unrecognized message type in script file\n");
X return FALSE;
X }
X}
X
Xgetaction()
X{
X if (pnl_readscript) {
X if (qtest())
X getactionfromqueue();
X else if (pnl_ca_save&&pnl_ca_save->active) {
X if (alt())
X getactionfromqueue();
X else
X if (!getactionfromscript()) getactionfromqueue();
X } else
X getactionfromscript();
X } else getactionfromqueue();
X}
X
XActuator
X*dopanel()
X{
X Actuator *a=NULL;
X Panel *p=NULL;
X int winsave=winget();
X
X if (setjmp(dopanel_return)) goto return_from_dopanel;
X if (pnl_virgin) init();
X
X redo:
X
X pnl_frame++;
X getaction();
X
X if (pnl_cp) pnl_cp->a=pnl_ca;
X
X if (pnl_cp&&pnl_ca&&pnl_ca->newvalfunc) {
X winset(pnl_cp->gid);
X (*pnl_ca->newvalfunc)(pnl_ca,pnl_cp,pnl_mx-pnl_cp->x,pnl_my-pnl_cp->y);
X pnl_ca->dirtycnt=2;
X }
X
X for (p=pnl_pl;p;p=p->next) doautos(p,pnl_mx,pnl_my);
X for (p=pnl_pl;p;p=p->next) (*p->drawfunc)(p);
X dofuncs(pnl_ca,pnl_cp);
X
X if (pnl_cp&&pnl_ca&&pnl_writescript) putactiontoscript();
X
X if (pnl_cp&&!pnl_cp->active) {
X pnl_cp=NULL;
X if (pnl_action_source==PNL_SRC_QUEUE) {
X pnl_cp_save=NULL;
X }
X }
X if (pnl_ca&&!pnl_ca->active) {
X pnl_ca=NULL;
X if (pnl_action_source==PNL_SRC_QUEUE) pnl_ca_save=NULL;
X }
X
X#ifdef IRIS_4D
X /* no retries on 3030's so the user can swapbuffers */
X
X if (qtest()==REDRAW) { /* someone left to redraw? */
X goto redo;
X }
X
X if (pnl_justup) goto redo; /* any mousedowns left in that queue? */
X
X#endif IRIS_4D
X
Xreturn_from_dopanel:
X if (winsave!=winget()) winset(winsave);
X return pnl_ca;
X}
X
X/*
X * drawpanel-
X *
X * this routine draws all actuators on every panel, which may be
X * a bit of overkill. It also does not decrement the panel's
X * dirtycnt so a later dopanel may draw them again.
X *
X */
X
Xvoid
Xdrawpanel() /* user routine to update all panels */
X{
XPanel *p;
X
X int winsave=winget();
X
X if (pnl_virgin) {
X dopanel();
X return;
X }
X
X for (p=pnl_pl;p;p=p->next) {
X p->dirtycnt++;
X (*p->drawfunc)(p);
X }
X
X winset(winsave);
X return;
X}
X
X#ifdef 0
XActuator
X*pickact(p,mx,my)
XPanel *p;
XScreencoord mx, my;
X{
Xshort buf[10];
Xint i, n;
XActuator *a;
XScreencoord savex, savey;
X
X picking=TRUE;
X winset(p->gid);
X
X savex=getvaluator(MOUSEX);
X savey=getvaluator(MOUSEY);
X setvaluator(MOUSEX,mx,0,XMAXSCREEN);
X setvaluator(MOUSEY,my,0,YMAXSCREEN);
X
X buf[1]=0;
X picksize(1,1);
X
X pushmatrix();
X pick(buf, 9);
X callobj(p->vobj);
X
X initnames();
X for (i=1,a=p->al;a;i++,a=a->next) {
X loadname((short)i);
X (*a->drawfunc)(a, p);
X }
X n=endpick(buf);
X popmatrix();
X
X setvaluator(MOUSEX,savex,0,XMAXSCREEN);
X setvaluator(MOUSEY,savey,0,YMAXSCREEN);
X
X if (n<1) return NULL;
X for (i=1,a=p->al;inext);
X
X picking=FALSE;
X return a;
X}
X#endif
X
XActuator
X*pickact(p,mx,my)
XPanel *p;
XScreencoord mx, my;
X{
Xint i, n;
XActuator *a;
XScreencoord sx,sy;
XCoord wx, wy;
X
X winset(p->gid);
X sx=mx-p->x, sy=my-p->y;
X mapw2(p->vobj,sx,sy,&wx,&wy);
X
X for (i=1,a=p->al;a;i++,a=a->next) {
X if ((*a->pickfunc)(a,p,wx,wy)) break;
X }
X
X return a;
X}
X
XBoolean
X_hitact(a,p,x,y)
XActuator *a;
XPanel *p;
XCoord x,y;
X{
X return PNL_HITACT(a,x,y);
X}
X
Xvoid
X_dumpact(a, fd)
XActuator *a;
Xint fd;
X{
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, a->datasize);
X}
X
Xvoid
X_loadact(a, fd)
XActuator *a;
Xint fd;
X{
Xint c;
X if (a->label) fprintf(stderr, "loading actuator %s, ", a->label);
X c=read(fd, a, sizeof(Actuator));
X#ifdef DEBUG
X fprintf(stderr, "read %d bytes, ", c);
X#endif DEBUG
X c=read(fd, &a->datasize, sizeof(int));
X#ifdef DEBUG fprintf(stderr, "read %d bytes, ", c);
X if (a->datasize) {
X#endif DEBUG
X c=read(fd, a->data, a->datasize);
X#ifdef DEBUG
X fprintf(stderr, "read %d bytes\n", c);
X#endif DEBUG
X }
X#ifdef DEBUG
X else fprintf(stderr,"\n");
X}
X#endif DEBUG
X
Xvoid
X_fixpnl(p)
XPanel *p;
X{
X long x, y, w, h;
X int winsave=winget();
X
X winset(p->gid);
X
X getorigin(&x, &y);
X getsize(&w, &h);
X if ( p->x!=x
X ||p->y!=y
X ||p->w!=w
X ||p->h!=h) { /* user reset size or location */
X winconstraints();
X winposition(p->x, p->x+p->w, p->y, p->y+p->h);
X } else { /* maybe just made a new actuator */
X panellimits(p);
X w=p->ppu*(p->maxx-p->minx);
X h=p->ppu*(p->maxy-p->miny);
X if ( ABS(p->w-w)>1
X ||ABS(p->h-h)>1) {
X winconstraints();
X winposition(x, x+w, y, y+h);
X p->x=x; p->y=y; p->w=w; p->h=h;
X }
X }
X
X keepaspect(p->w,p->h);
X winconstraints();
X reshapepanel(p);
X
X winset(winsave);
X}
X
X
Xvoid
X_drawpnl(p)
XPanel *p;
X{
Xint i;
XActuator *a;
XBoolean drewsomething=FALSE;
X
X if (p->dirtycnt) {
X drewsomething=TRUE;
X winset(p->gid);
X#ifdef DEBUG
Xprintf("drawing panel %s\n", p->label);
X#endif DEBUG
X p->dirtycnt--;
X color(pnl_background_color);
X clear();
X for (i=0,a=p->al;a;i++,a=a->next) {
X if (a->visible&&a->drawfunc) (*a->drawfunc)(a, p);
X }
X }
X
X for (i=0,a=p->al;a;i++,a=a->next) {
X if (a->dirtycnt) {
X drewsomething=TRUE;
X winset(p->gid);
X#ifdef DEBUG
Xprintf("drawing actuator %s with value of %g\n", a->label, a->val);
X#endif DEBUG
X if (a->visible&&a->drawfunc) (*a->drawfunc)(a, p);
X a->dirtycnt--;
X }
X }
X
X#ifdef IRIS_4D
X if (drewsomething) swapbuffers();
X#endif IRIS_4D
X
X}
X
Xdrawlabel(a, p)
XActuator *a;
XPanel *p;
X{
X color(pnl_background_color);
X rectf(a->x+a->lx,a->y+a->ly,
X a->x+a->lx+a->lw,a->y+a->ly+a->lh);
X if (p->ppu>pnl_char_threshold) {
X color(pnl_outline_color);
X cmov2(a->x+a->lx,a->y+a->ly+a->ld);
X charstr(a->label);
X } else {
X color(pnl_normal_color);
X rectf(a->x+a->lx,a->y+a->ly,
X a->x+a->lx+a->lw,
X a->y+a->ly+a->lh);
X }
X#ifdef 0
X color(pnl_highlight_color);
X cmov2(a->x+a->lx,a->y+a->ly+a->ld);
X charstr(a->label);
X rect(a->x+a->lx,a->y+a->ly,
X a->x+a->lx+a->lw,
X a->y+a->ly+a->lh);
X#endif
X}
X
X#ifdef 0
XBoolean
Xdumppanel()
X{
XPanel *p;
XActuator *a;
XFILE *dumpfile;
X
X if (!(dumpfile=fopen("panel.txt","w"))) {
X perror("panel.txt");
X return FALSE;
X }
X for (p=pnl_pl;p;p=p->next) {
X if (p->label) fprintf(dumpfile, "panel: %-24s",p->label);
X else fprintf(dumpfile, "panel: (NULL) ");
X fprintf(dumpfile, "x: %-4d ", p->x);
X fprintf(dumpfile, "y: %-4d ", p->y);
X fprintf(dumpfile, "w: %-4d ", p->w);
X fprintf(dumpfile, "h: %-4d\n", p->h);
X for (a=p->al;a;a=a->next) {
X if (a->label) fprintf(dumpfile, " actuator: %-19s", a->label);
X else fprintf(dumpfile, " actuator: (NULL) ");
X fprintf(dumpfile, "x: %-5g ", a->x);
X fprintf(dumpfile, "y: %-5g ", a->y);
X fprintf(dumpfile, "w: %-5g ", a->w);
X fprintf(dumpfile, "h: %-5g\n", a->h);
X }
X }
X fclose(dumpfile);
X return TRUE;
X}
X#endif 0
X
X#define FP fprintf
X#define DF dumpfile
X
XBoolean
Xdumppanel()
X{
X Panel *p;
X Actuator *a;
X FILE *dumpfile;
X Boolean ingroup;
X
X if (!(dumpfile=fopen("panel.txt","w"))) {
X perror("panel.txt");
X return FALSE;
X }
X
X for (p=pnl_pl;p;p=p->next) {
X FP(DF, " p=mkpanel();\n");
X FP(DF, " /* p->id=%d; */\n", p->id);
X FP(DF, " /* p->a=0x%x; */\n", p->a);
X FP(DF, " /* p->al=0x%x; */\n", p->al);
X FP(DF, " /* p->autolist=0x%x; */\n", p->autolist);
X FP(DF, " /* p->lastgroup=0x%x; */\n", p->lastgroup);
X FP(DF, " /* p->active=%s; */\n", (p->active?"TRUE":"FALSE"));
X FP(DF, " p->enabled=%s;\n",(p->enabled?"TRUE":"FALSE"));
X FP(DF, " p->x=%d;\n", p->x);
X FP(DF, " p->y=%d;\n", p->y);
X FP(DF, " p->w=%d;\n", p->w);
X FP(DF, " p->h=%d;\n", p->h);
X FP(DF, " /* p->minx=%f; */\n", p->minx);
X FP(DF, " /* p->maxx=%f; */\n", p->maxx);
X FP(DF, " /* p->miny=%f; */\n", p->miny);
X FP(DF, " /* p->maxy=%f; */\n", p->maxy);
X FP(DF, " /* p->cw=%f; */\n", p->cw);
X FP(DF, " /* p->ch=%f; */\n", p->ch);
X FP(DF, " /* p->gid=%d; */\n", p->gid);
X FP(DF, " /* p->usergid=%d; */\n", p->usergid);
X FP(DF, " /* p->vobj=%d; */\n", p->vobj);
X FP(DF, " p->ppu=%f;\n", p->ppu);
X FP(DF, " p->label=\"%s\";\n", (p->label?p->label:"NULL"));
X FP(DF, " /* p->fixfunc=0x%x; */\n", p->fixfunc);
X FP(DF, " /* p->drawfunc=0x%x; */\n", p->drawfunc);
X FP(DF, " /* p->downfunc=0x%x; */\n", p->downfunc);
X FP(DF, " /* p->activefunc=0x%x; */\n", p->activefunc);
X FP(DF, " /* p->upfunc=0x%x; */\n", p->upfunc);
X FP(DF, " /* p->dirtycnt=%d; */\n", p->dirtycnt);
X FP(DF, " /* p->next=0x%x; */\n", p->next);
X FP(DF, "\n");
X
X for (a=p->al;a;a=a->next) {
X FP(DF, " /* a->id=%d; */\n", a->id);
X FP(DF, " /* a->type=%d; */\n", a->type);
X FP(DF, " /* a->active=%s; */\n", (a->active?"TRUE":"FALSE"));
X FP(DF, " a->x=%f;\n", a->x);
X FP(DF, " a->y=%f;\n", a->y);
X FP(DF, " a->w=%f;\n", a->w);
X FP(DF, " a->h=%f;\n", a->h);
X FP(DF, " a->lx=%f;\n", a->lx);
X FP(DF, " a->ly=%f;\n", a->ly);
X FP(DF, " a->lw=%f;\n", a->lw);
X FP(DF, " a->lh=%f;\n", a->lh);
X FP(DF, " a->ld=%f;\n", a->ld);
X FP(DF, " a->val=%f;\n", a->val);
X FP(DF, " a->initval=%f;\n", a->initval);
X FP(DF, " a->maxval=%f;\n", a->maxval);
X FP(DF, " a->minval=%f;\n", a->minval);
X FP(DF, " a->label=\"%s\";\n", (a->label?a->label:"NULL"));
X FP(DF, " a->key=%d;\n", a->key);
X FP(DF, " a->labeltype=%d;\n", a->labeltype);
X FP(DF, " /* a->addfunc=0x%x; */\n", a->addfunc);
X FP(DF, " /* a->fixfunc=0x%x; */\n", a->fixfunc);
X FP(DF, " /* a->pickfunc=0x%x; */\n", a->pickfunc);
X FP(DF, " /* a->newvalfunc=0x%x; */\n", a->newvalfunc);
X FP(DF, " /* a->dumpfunc=0x%x; */\n", a->dumpfunc);
X FP(DF, " /* a->loadfunc=0x%x; */\n", a->loadfunc);
X FP(DF, " /* a->drawfunc=0x%x; */\n", a->drawfunc);
X FP(DF, " /* a->downfunc=0x%x; */\n", a->downfunc);
X FP(DF, " /* a->activefunc=0x%x; */\n", a->activefunc);
X FP(DF, " /* a->upfunc=0x%x; */\n", a->upfunc);
X FP(DF, " /* a->dirtycnt=%d; */\n", a->dirtycnt);
X FP(DF, " /* a->u=0x%x; */\n", a->u);
X FP(DF, " /* a->data=0x%x; */\n", a->data);
X FP(DF, " /* a->datasize=%d; */\n", a->datasize);
X FP(DF, " a->automatic=%s;\n", (a->automatic?"TRUE":"FALSE"));
X FP(DF, " a->selectable=%s;\n", (a->selectable?"TRUE":"FALSE"));
X FP(DF, " a->visible=%s;\n", (a->visible?"TRUE":"FALSE"));
X FP(DF, " /* a->group=0x%x; */\n", a->group);
X FP(DF, " /* a->next=0x%x; */\n", a->next);
SHAR_EOF
echo "End of part 4, continue with part 5"
echo "5" > s2_seq_.tmp
exit 0