panel05/06
David A. Tristram
dat at ORVILLE.NAS.NASA.GOV
Fri Aug 19 07:21:16 AEST 1988
#!/bin/sh
# this is part 5 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file panel.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' >> panel.c
X FP(DF, " /* a->p=0x%x; */\n", a->p);
X FP(DF, " addact(a, p);\n");
X FP(DF, "\n");
X if (!ingroup&&a->group) ingroup=TRUE;
X if (!a->group&&ingroup) {
X FP(DF, " endgroup();\n");
X ingroup=FALSE;
X }
X FP(DF, "\n");
X }
X }
X fclose(dumpfile);
X return TRUE;
X}
X
Xchar
X*alloc(size)
Xint size;
X{
Xchar *p;
X
X if (p=(char *)calloc(1,size)) return p;
X else {
X perror("calloc");
X exit(1);
X }
X}
X
XBoolean
Xscreenpnt(wx, wy, wz, sx, sy) /* returns false if pnt is clipped */
XCoord wx, wy, wz;
XScreencoord *sx, *sy;
X{
Xshort buf[3];
X
X feedback(buf, 3);
X pnt(wx, wy, wz);
X passthrough(0x99);
X endfeedback(buf);
X if (buf[0]==0x8) { /* passthrough command */
X *sx= *sy=0;
X return FALSE;
X } else {
X *sx=buf[1];
X *sy=buf[2];
X return TRUE;
X }
X}
X
SHAR_EOF
chmod 0644 panel.c || echo "restore of panel.c fails"
sed 's/^X//' << 'SHAR_EOF' > panel.h &&
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 at orville.nas.nasa.gov
X */
X#ifndef PNL_EDITOR_PARSING
X#ifndef PNL_EXTERN
X#define PNL_EXTERN extern
X#endif
X#ifndef PNL_INIT
X#define PNL_INIT(x) /* nothing */
X#endif
X#ifndef FILE
X#include <stdio.h>
X#endif
X#ifndef NULL
X#define NULL 0
X#endif
X#ifndef PI
X#define PI 3.14159265358979323846 /* from math.h */
X#endif
X#define PNL_RAD_TO_DEG (0.31830988618379067154*180.0)
X#define PNL_TABLE_SIZE 4096 /* max number of panels + actuators */
X
X#ifndef MAXSGIDEVICE
X#define MAXSGIDEVICE 20000
X#endif MAXSGIDEVICE
X#define PNL_DEVICE_OFFSET (MAXSGIDEVICE+1)
X#define PNL_TOKEN (PNL_DEVICE_OFFSET+0)
X
X#define PNL_PIXELS_PER_UNIT 50.0 /* used to size the panel */
X#define PNL_CHAR_THRESHOLD 35.0 /* ppu below this, draw chars as rects */
X
X#define PNL_CHAR_PIXEL_HEIGHT 10
X#define PNL_CHAR_PIXEL_WIDTH 10
X
X#ifdef IRIS_NEWS
X# define PNL_SCREEN_BORDER 12
X# define PNL_TITLE_BAR_HEIGHT 19
X#else
X# define PNL_SCREEN_BORDER 6
X# define PNL_TITLE_BAR_HEIGHT 18
X#endif
X
X/* dimensions */
X#define PNL_MARGIN 0.2 /* absolute edge of panel left blank */
X#define PNL_DIM_1 0.2 /* absolute dist tween actuators */
X#define PNL_DIM_2 0.1 /* absolute dist to a label */
X#define PNL_DIM_3 0.05 /* a tiny little distance */
X#define PNL_DIM_4 0.025 /* half of THAT! */
X#define PNL_SLIDER_HEIGHT (6.0-PNL_DIM_1) /* w/o label */
X#define PNL_SLIDER_WIDTH (1.0-PNL_DIM_1)
X#define PNL_SLIDER_BAR_HEIGHT (0.05*PNL_SLIDER_HEIGHT)
X#define PNL_BUTTON_EDGE (0.5-0.5*PNL_DIM_1)
X#define PNL_WIDE_BUTTON_WIDTH (2.0-PNL_DIM_1)
X#define PNL_WIDE_BUTTON_HEIGHT PNL_BUTTON_EDGE
X#define PNL_TYPEIN_LENGTH 40 /* default length in characters */
X#define PNL_TYPEIN_MAX_STRING 256
X#define PNL_TYPEOUT_BUFSIZ 4096
X#define PNL_TYPEOUT_COLUMNS PNL_TYPEIN_LENGTH
X#define PNL_TYPEOUT_LINES 4
X#define PNL_TYPEOUT_MAX_COLUMNS 256
X#define PNL_SCROLL_WIDTH (2.0*PNL_DIM_1)
X#define PNL_TYPEOUT_ARROW_HEIGHT (PNL_SCROLL_WIDTH/2.0)
X#define PNL_PUCK_EDGE (4.0-PNL_DIM_1)
X#define PNL_PUCK_SIZE (1.0-PNL_DIM_1)
X#define PNL_FLOATING_PUCK_EDGE (1.0-PNL_DIM_1)
X#define PNL_FLOATING_PUCK_SENS 10.0 /* units per full range output */
X#define PNL_METER_HEIGHT (1.8-PNL_DIM_1)
X#define PNL_METER_WIDTH (3.0-PNL_DIM_1)
X#define PNL_METER_LINEWIDTH 4 /* Pixels for meter pointer and bar line */
X#define PNL_STRIP_HEIGHT (1.8-PNL_DIM_1)
X#define PNL_STRIP_WIDTH (6.0-PNL_DIM_1)
X#define PNL_STRIP_LINEWIDTH 2
X#define PNL_STRIP_CHART_NPTS 200
X#define PNL_SLIDEROID_HEIGHT (1.5-PNL_DIM_1)
X#define PNL_SLIDEROID_WIDTH (2.0-PNL_DIM_1)
X#define PNL_DIAL_EDGE (1.0-PNL_DIM_1)
X#define PNL_DIAL_WINDS 0.88 /* revs per full range output */
X
X/* Actuator types */
X#define PNL_MAXACT 0x7ffff /* user types start here+1 */
X#define PNL_SLIDER 0
X#define PNL_VSLIDER PNL_SLIDER
X#define PNL_HSLIDER 1
X#define PNL_FILLED_SLIDER 2
X#define PNL_FILLED_VSLIDER PNL_FILLED_SLIDER
X#define PNL_FILLED_HSLIDER 3
X#define PNL_DVSLIDER 4
X#define PNL_DHSLIDER 5
X#define PNL_BUTTON 10
X#define PNL_TOGGLE_BUTTON 11
X#define PNL_RADIO_BUTTON 12
X#define PNL_WIDE_BUTTON 13
X#define PNL_TYPEIN 20
X#define PNL_LABEL 21
X#define PNL_TYPEOUT 30
X#define PNL_METER 40
X#define PNL_ANALOG_METER PNL_METER
X#define PNL_ANALOG_BAR 41
X#define PNL_STRIP_CHART 42
X#define PNL_SCALE_CHART 43
X#define PNL_PUCK 50
X#define PNL_FLOATING_PUCK 51
X#define PNL_RUBBER_PUCK 52
X#define PNL_SLIDEROID 60
X#define PNL_PALETTE 70
X#define PNL_DIAL 80
X#define PNL_MOUSE 1000
X
X/* drawing styles */
X#define PNL_OPEN 0
X#define PNL_FILLED 1
X
X/* label styles */
X#define PNL_LABEL_LEFT 0
X#define PNL_LABEL_RIGHT 1
X#define PNL_LABEL_BOTTOM 2
X#define PNL_LABEL_TOP 3
X#define PNL_LABEL_NORMAL 4
X#define PNL_LABEL_CENTER 5
X
X/* colors */
X#ifdef IRIS_4D
X#define PNL_WHITE_COLOR WHITE
X#define PNL_NORMAL_COLOR 490
X#define PNL_OTHER_COLOR 474 /* light enough? */
X#define PNL_BACKGROUND_COLOR 27
X#define PNL_HIGHLIGHT_COLOR 457
X#define PNL_OUTLINE_COLOR 321
X#else IRIS_4D
X#define PNL_WHITE_COLOR WHITE
X#define PNL_NORMAL_COLOR 30
X#define PNL_OTHER_COLOR 27
X#define PNL_BACKGROUND_COLOR 25
X#define PNL_HIGHLIGHT_COLOR 21
X#define PNL_OUTLINE_COLOR BLACK
X#endif IRIS_4D
X
XPNL_EXTERN Colorindex pnl_background_color PNL_INIT(PNL_BACKGROUND_COLOR);
XPNL_EXTERN Colorindex pnl_white_color PNL_INIT(PNL_WHITE_COLOR);
XPNL_EXTERN Colorindex pnl_normal_color PNL_INIT(PNL_NORMAL_COLOR);
XPNL_EXTERN Colorindex pnl_other_color PNL_INIT(PNL_OTHER_COLOR);
XPNL_EXTERN Colorindex pnl_highlight_color PNL_INIT(PNL_HIGHLIGHT_COLOR);
XPNL_EXTERN Colorindex pnl_outline_color PNL_INIT(PNL_OUTLINE_COLOR);
X
X/* mouse action sources */
X
X#define PNL_SRC_QUEUE 0
X#define PNL_SRC_SCRIPT 1
X
X/* script message types */
X
X#define PNL_MT_STATE 0
X#define PNL_MT_MOUSE 1
X#define PNL_MT_DELAY 2
X#define PNL_MT_ENDBLOCK 3
X
X#define PNL_HITACT(a,wx,wy) \
X ((wx)>(a)->x && (wx)<(a)->x+(a)->w && (wy)>(a)->y && (wy)<(a)->y+(a)->h)
X#define PNL_ACCESS(type, ptr, member) (((type *)(ptr->data))->member)
X#define PNL_MKUSERACT(struct_type, type) \
X ((struct struct_type *) \
X _mkuseract (sizeof (struct struct_type), type))
X
X#define ABS(a) ((a)>0.0?(a):-(a))
X#define MIN(a, b) ((a)<(b)?(a):(b))
X#define MAX(a, b) ((a)>(b)?(a):(b))
X#define RANGE(a, b1, b2) \
X \
X ((b1)<(b2)? \
X ((a)<(b1)? \
X (b1): \
X ((a)>(b2)? \
X (b2):(a))): \
X ((a)<(b2)? \
X (b2): \
X ((a)>(b1)? \
X (b1):(a))))
X
X#define PNL_VAL_TO_WORLD(val, min, max, dist) \
X (((val)-(min))/((max)-(min))*(dist))
X
X#define PNL_WORLD_TO_VAL(x, min, max, dist) \
X ((x)/(dist)*((max)-(min))+(min))
X
X#endif PNL_EDITOR_PARSING
X
Xtypedef struct panel {
X short id; /* unique id */
X struct actuator *a; /* current actuator */
X struct actuator *al; /* actuator list */
X struct alist *autolist; /* list of auto actuators */
X struct actuator *lastgroup; /* last actuator added to a group */
X Boolean active, enabled;
X long x, y, w, h;
X Coord minx;
X Coord maxx;
X Coord miny;
X Coord maxy;
X Coord cw,ch; /* char width and height */
X short gid; /* mex window number of this panels window */
X short usergid; /* mex window number of one of the user's windows */
X Object vobj; /* viewing transformations */
X float ppu; /* pixels per unit */
X char *label;
X#ifdef IRIS_4D
X void (*fixfunc)(struct actuator *);
X#else IRIS_4D
X void (*fixfunc)();
X#endif IRIS_4D
X void (*drawfunc)();
X void (*downfunc)();
X void (*activefunc)();
X void (*upfunc)();
X int dirtycnt;
X struct panel *next;
X} Panel;
X
Xtypedef struct actuator {
X short id; /* unique id */
X struct panel *p; /* pointer to enclosing panel */
X int type; /* type id, init func should set this */
X Boolean active;
X Coord x, y, w, h;
X Coord lx, ly, lw, lh; /* offset and size of label */
X Coord ld; /* descender size */
X float val, initval, maxval, minval;
X char *label;
X Device key; /* keyboard equivalent */
X int labeltype; /* location of the label relative to the actuator */
X void (*addfunc)();
X#ifdef IRIS_4D
X void (*fixfunc)(struct actuator *);
X Boolean (*pickfunc)(/*struct actuator *,struct panel *,float,float*/);
X void (*newvalfunc)(struct actuator *,struct panel *,short,short);
X void (*dumpfunc)(struct actuator *, int);
X void (*loadfunc)(struct actuator *, int);
X#else IRIS_4D
X void (*fixfunc)();
X Boolean (*pickfunc)();
X void (*newvalfunc)();
X void (*dumpfunc)();
X void (*loadfunc)();
X#endif IRIS_4D
X void (*drawfunc)();
X void (*downfunc)();
X void (*activefunc)();
X void (*upfunc)();
X int dirtycnt;
X char *u; /* pointer to arbitrary user data */
X char *data; /* pointer to data peculiar to a particular actuator */
X int datasize; /* size of data struct plus everyting it points to */
X Boolean automatic; /* true ==> newvalfunc called every dopanel */
X Boolean selectable; /* false ==> unpickable, newvalfunc never called */
X Boolean visible; /* does this actuator have a visible manifestation? */
X struct actuator *group;
X struct actuator *next;
X} Actuator;
X
X#ifndef PNL_EDITOR_PARSING
X
Xtypedef struct alist {
X Actuator *a;
X struct alist *next;
X} Alist;
X
X/* actuator specific data */
X
Xtypedef struct {
X float x, y;
X} Point;
X
Xtypedef struct {
X int firstpt, lastpt;
X Boolean Bind_Low, Bind_High;
X float *y;
X} Stripchart;
X
Xtypedef struct {
X int mode;
X float finefactor;
X float valsave;
X Coord wsave;
X} Slider;
X
Xtypedef struct {
X char * str;
X int len;
X} Typein;
X
Xtypedef struct {
X char *buf;
X int start; /* first char to display (appears in upper-left) */
X int dot; /* insertion point */
X int col,lin; /* width and height in character positions */
X int len; /* number of chars in buffer */
X int size; /* buffer size */
X Coord ch, cw, cd; /* character dimensions */
X} Typeout;
X
Xtypedef Point Puck;
X
Xtypedef struct {
X Screencoord x;
X Screencoord y;
X} Mouse;
X
Xtypedef struct {
X int mode;
X Boolean finemode, resetmode;
X float *resettarget, resetval;
X float valsave;
X Coord wsave;
X} Slideroid;
X
Xtypedef Slider Palette;
Xtypedef struct {
X int mode;
X float finefactor;
X float valsave;
X Coord wsave;
X float winds;
X} Dial;
X
X/* globals */
X
XPNL_EXTERN int pnl_id PNL_INIT(0);
X /* an incrementing index into the table */
X
XPNL_EXTERN char *pnl_table[PNL_TABLE_SIZE];
X /* table of pointers to all panels and actuators */
X
XPNL_EXTERN Panel *pnl_pl PNL_INIT(NULL);
X /* list of all control panels */
X
XPNL_EXTERN Alist *pnl_kl PNL_INIT(NULL);
X /* a list of actuators with key equivalents */
X
XPNL_EXTERN Panel *pnl_cp PNL_INIT(NULL);
X /* panel being moused (current panel) */
X
XPNL_EXTERN Actuator *pnl_ca PNL_INIT(NULL);
X /* actuator being moused (current actuator) */
X
XPNL_EXTERN Panel *pnl_cp_save PNL_INIT(NULL);
X /* last cp from queue */
X
XPNL_EXTERN Actuator *pnl_ca_save PNL_INIT(NULL);
X /* last ca from queue */
X
XPNL_EXTERN Boolean pnl_ca_active_save PNL_INIT(FALSE);
X /* state of active field in pnl_ca_save */
X
XPNL_EXTERN Boolean pnl_cp_active_save PNL_INIT(FALSE);
X /* state of active field in pnl_cp_save */
X
XPNL_EXTERN Actuator *pnl_mouse_act PNL_INIT(NULL);
X /* the mouse actuator, if any */
X
XPNL_EXTERN Screencoord pnl_mx, pnl_my;
X /* where the mouse is */
X
XPNL_EXTERN long int pnl_frame PNL_INIT(0);
X /* frames since last delay message */
X
XPNL_EXTERN int pnl_delay PNL_INIT(0);
X /* frames 'til next message allowed from the queue */
X
XPNL_EXTERN Boolean pnl_delayvirgin PNL_INIT(TRUE);
X /* flag prevents writing initial delay token */
X
XPNL_EXTERN Boolean pnl_readscript PNL_INIT(FALSE);
X
XPNL_EXTERN Boolean pnl_writescript PNL_INIT(FALSE);
X
XPNL_EXTERN int pnl_scriptinfd PNL_INIT(0);
X
XPNL_EXTERN int pnl_scriptoutfd PNL_INIT(0);
X
XPNL_EXTERN char *pnl_scriptinfile PNL_INIT("panel.script");
X
XPNL_EXTERN char *pnl_scriptoutfile PNL_INIT("panel.script");
X
XPNL_EXTERN Boolean pnl_virgin PNL_INIT(TRUE);
X /* haven't done a dopanel yet */
X
XPNL_EXTERN Boolean pnl_saveuserredraw PNL_INIT(FALSE);
X /* if the user is using them, requeue them */
X
XPNL_EXTERN Boolean pnl_scripting PNL_INIT(FALSE);
X /* writing a script file */
X
XPNL_EXTERN Screencoord pnl_ox, pnl_oy;
X /* last window origin */
X
XPNL_EXTERN Boolean pnl_justdown;
X /* true when button first goes down */
X
XPNL_EXTERN Boolean pnl_justup;
X /* true when button first goes up */
X
XPNL_EXTERN Boolean pnl_mousedown;
X /* true when button is (was) down */
X /* (according to the queue) */
X
XPNL_EXTERN Boolean pnl_shiftkey PNL_INIT(FALSE);
X /* true when the shift key is down */
X
XPNL_EXTERN Boolean pnl_controlkey PNL_INIT(FALSE);
X /* true when the control key is down */
X
XPNL_EXTERN int pnl_winsave;
X /* gid of (user's) window when dopanel() is called */
X
XPNL_EXTERN int pnl_action_source PNL_INIT(PNL_SRC_QUEUE);
X /* where last mouse action came from */
X
XPNL_EXTERN float pnl_char_threshold PNL_INIT(PNL_CHAR_THRESHOLD);
X /* see PNL_CHAR_THRESHOLD above */
X
X/* panel library utilities */
X
X#ifdef IRIS_4D
Xchar *alloc(int);
X#else IRIS_4D
Xchar *alloc();
X#endif IRIS_4D
X
X/* user functions */
X
XPNL_EXTERN Panel *mkpanel();
XPNL_EXTERN Actuator *dopanel();
XPNL_EXTERN void dumpstate();
XPNL_EXTERN void drawpanel();
XPNL_EXTERN short userredraw();
XPNL_EXTERN void needredraw();
XPNL_EXTERN Boolean dumppanel();
X
X#ifdef IRIS_4D
X
XPNL_EXTERN Actuator *mkact(/*void (*)()*/); /* parameter decl doesn't seem to work */
XPNL_EXTERN Actuator *_mkuseract(/*int, void (*)()*/); /* parameter decl doesn't seem to work */
XPNL_EXTERN void addact(Actuator *,Panel *);
XPNL_EXTERN void endgroup(Panel *);
XPNL_EXTERN char *g_gets(Colorindex,Colorindex,Colorindex);
XPNL_EXTERN char *g_getstring(Colorindex,Colorindex,Colorindex,char *,int);
XPNL_EXTERN Boolean pnl_beginreadscript(char *);
XPNL_EXTERN Boolean pnl_beginwritescript(char *);
XPNL_EXTERN void pnl_endreadscript();
XPNL_EXTERN void pnl_endwritescript();
X
X#else IRIS_4D
X
XPNL_EXTERN Actuator *mkact();
XPNL_EXTERN Actuator *_mkuseract();
XPNL_EXTERN void addact();
XPNL_EXTERN void endgroup();
XPNL_EXTERN char *g_gets();
XPNL_EXTERN char *g_getstring();
XPNL_EXTERN Boolean pnl_beginreadscript();
XPNL_EXTERN Boolean pnl_beginwritescript();
XPNL_EXTERN void pnl_endreadscript();
XPNL_EXTERN void pnl_endwritescript();
X
X#endif IRIS_4D
X
X#ifdef IRIS_4D
Xextern void pnl_slider(Actuator *);
Xextern void pnl_vslider(Actuator *);
Xextern void pnl_hslider(Actuator *);
Xextern void pnl_dvslider(Actuator *);
Xextern void pnl_dhslider(Actuator *);
Xextern void pnl_filled_slider(Actuator *);
Xextern void pnl_filled_vslider(Actuator *);
Xextern void pnl_filled_hslider(Actuator *);
Xextern void pnl_button(Actuator *);
Xextern void pnl_wide_button(Actuator *);
Xextern void pnl_toggle_button(Actuator *);
Xextern void pnl_radio_button(Actuator *);
Xextern void pnl_meter(Actuator *);
Xextern void pnl_analog_meter(Actuator *);
Xextern void pnl_analog_bar(Actuator *);
Xextern void pnl_strip_chart(Actuator *);
Xextern void pnl_scale_chart(Actuator *);
Xextern void pnl_puck(Actuator *);
Xextern void pnl_floating_puck(Actuator *);
Xextern void pnl_rubber_puck(Actuator *);
Xextern void pnl_typein(Actuator *);
Xextern void pnl_typeout(Actuator *);
Xextern void pnl_label(Actuator *);
Xextern void pnl_mouse(Actuator *);
Xextern void pnl_slideroid(Actuator *);
Xextern void pnl_palette(Actuator *);
Xextern void pnl_dial(Actuator *);
X#else IRIS_4D
Xextern void pnl_slider();
Xextern void pnl_vslider();
Xextern void pnl_hslider();
Xextern void pnl_dvslider();
Xextern void pnl_dhslider();
Xextern void pnl_filled_slider();
Xextern void pnl_filled_vslider();
Xextern void pnl_filled_hslider();
Xextern void pnl_button();
Xextern void pnl_wide_button();
Xextern void pnl_toggle_button();
Xextern void pnl_radio_button();
Xextern void pnl_meter();
Xextern void pnl_analog_meter();
Xextern void pnl_analog_bar();
Xextern void pnl_strip_chart();
Xextern void pnl_scale_chart();
Xextern void pnl_puck();
Xextern void pnl_floating_puck();
Xextern void pnl_rubber_puck();
Xextern void pnl_typein();
Xextern void pnl_typeout();
Xextern void pnl_label();
Xextern void pnl_mouse();
Xextern void pnl_slideroid();
Xextern void pnl_palette();
Xextern void pnl_dial();
X#endif IRIS_4D
X
X#endif PNL_EDITOR_PARSING
SHAR_EOF
chmod 0644 panel.h || echo "restore of panel.h fails"
sed 's/^X//' << 'SHAR_EOF' > puck.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 at orville.nas.nasa.gov
X */
X#include <math.h>
X#include <gl.h>
X#include "panel.h"
X
Xvoid _newvalpuck(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
XCoord wx,wy;
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X if (!a->active) return;
X
X mapw2(p->vobj,sx,sy,&wx,&wy);
X wx=RANGE(wx-a->x, d, a->w-d);
X wy=RANGE(wy-a->y, d, a->h-d);
X PNL_ACCESS(Puck, a, x)=(wx-d)/(a->w-2.0*d)*(a->maxval-a->minval)+a->minval;
X PNL_ACCESS(Puck, a, y)=(wy-d)/(a->h-2.0*d)*(a->maxval-a->minval)+a->minval;
X}
X
Xvoid
X_drawpuckshape(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X if (style==PNL_FILLED) {
X pmv2(-d,0.0);
X pdr2(-PNL_DIM_2,-PNL_DIM_2);
X pdr2(PNL_DIM_2,-PNL_DIM_2);
X pdr2(d,0.0);
X pdr2(PNL_DIM_2,PNL_DIM_2);
X pdr2(-PNL_DIM_2,PNL_DIM_2);
X pclos();
X pmv2(0.0,-d);
X pdr2(PNL_DIM_2,-PNL_DIM_2);
X pdr2(PNL_DIM_2,PNL_DIM_2);
X pdr2(0.0,d);
X pdr2(-PNL_DIM_2,PNL_DIM_2);
X pdr2(-PNL_DIM_2,-PNL_DIM_2);
X pclos();
X } else {
X move2(-d,0.0);
X draw2(-PNL_DIM_2, -PNL_DIM_2);
X draw2(0.0,-d);
X draw2(PNL_DIM_2,-PNL_DIM_2);
X draw2(d,0.0);
X draw2(PNL_DIM_2,PNL_DIM_2);
X draw2(0.0,d);
X draw2(-PNL_DIM_2,PNL_DIM_2);
X draw2(-d,0.0);
X }
X}
X
Xvoid
X_drawpuck(a, p)
XActuator *a;
XPanel *p;
X{
XCoord x,y;
Xstatic Coord d = PNL_PUCK_SIZE/2.0;
X
X color(PNL_NORMAL_COLOR);
X rectf(a->x,a->y,a->x+a->w,a->y+a->h);
X
X pushmatrix();
X x=a->w*(PNL_ACCESS(Puck, a, x)-a->minval)/(a->maxval-a->minval);
X y=a->h*(PNL_ACCESS(Puck, a, y)-a->minval)/(a->maxval-a->minval);
X
X translate(a->x+d, a->y+d, 0.0);
X translate(x*(a->w-PNL_PUCK_SIZE)/a->w,y*(a->h-PNL_PUCK_SIZE)/a->h,0.0);
X
X color(PNL_HIGHLIGHT_COLOR);
X _drawpuckshape(a,p,PNL_FILLED);
X color(PNL_OUTLINE_COLOR);
X _drawpuckshape(a,p,PNL_OPEN);
X popmatrix();
X
X color(PNL_OUTLINE_COLOR);
X rect(a->x,a->y,a->x+a->w,a->y+a->h);
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_newvalfloatingpuck(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
XCoord wx,wy;
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X if (!a->active) return;
X
X mapw2(p->vobj,sx,sy,&wx,&wy);
X PNL_ACCESS(Puck, a, x)=(wx-a->x-d)/PNL_FLOATING_PUCK_SENS
X *(a->maxval-a->minval);
X PNL_ACCESS(Puck, a, y)=(wy-a->y-d)/PNL_FLOATING_PUCK_SENS
X *(a->maxval-a->minval);
X}
X
X#define PUCK_ERASE 0
X#define PUCK_DRAW 1
X
X/*
X * drawpup erase and draw in pup planes
X *
X * caveats:
X *
X * for erasing to work correctly, subsequent calls
X * must be made with the same drawfunc.
X *
X * on the 3030, the cursor should be turned off.
X *
X */
X
X_drawpup(a,p,x,y,mode,drawfunc)
XActuator *a; /*p*/
XPanel *p;
XCoord x,y;
Xint mode;
Xvoid (* drawfunc)();
X{
Xlong savemode;
Xstatic Boolean drawn=FALSE;
Xstatic Coord ox=0.0,oy=0.0,ox2=0.0,oy2=0.0;
X
X if (mode==PUCK_DRAW
X && ox==x
X && oy==y
X && drawn) return;
X#ifdef IRIS_4D
X savemode=getdrawmode();
X drawmode(PUPDRAW);
X#else IRIS_4D
X pupmode();
X#endif IRIS_4D
X
X pushmatrix();
X pushviewport();
X fullscrn();
X ortho2(p->minx-(p->x/p->ppu),
X p->minx+((XMAXSCREEN-p->x)/p->ppu),
X p->miny-(p->y/p->ppu),
X p->miny+((YMAXSCREEN-p->y)/p->ppu));
X
X
X#ifdef IRIS_4D
X color(0);
X#else IRIS_4D
X pupcolor(PUP_CLEAR);
X#endif IRIS_4D
X/* pushmatrix();
X translate(ox2,oy2,0.0);
X (* drawfunc)(a,p,PNL_FILLED);
X popmatrix(); */
X
X pushmatrix();
X translate(ox,oy,0.0);
X (* drawfunc)(a,p,ox,oy,PNL_FILLED);
X popmatrix();
X drawn=FALSE;
X
X if (mode==PUCK_DRAW) {
X#ifdef IRIS_4D
X color(1);
X#else IRIS_4D
X pupcolor(PUP_CURSOR);
X#endif IRIS_4D
X pushmatrix();
X translate(x,y,0.0);
X (*drawfunc)(a,p, x, y, PNL_FILLED);
X popmatrix();
X ox2=ox;oy2=oy;
X ox=x;oy=y;
X drawn=TRUE;
X }
X
X#ifdef IRIS_4D
X drawmode((Boolean)savemode);
X#else IRIS_4D
X endpupmode();
X#endif IRIS_4D
X
X endfullscrn();
X popviewport();
X popmatrix();
X}
X
Xvoid
X_drawfloatingpuck(a,p)
XActuator *a;
XPanel *p;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
XCoord x=0.0, y=0.0;
X
X pushmatrix();
X if (!a->active) {
X _drawpup(a,p,x,y,PUCK_ERASE,_drawpuckshape);
X
X translate(a->x,a->y,0.0);
X color(PNL_NORMAL_COLOR);
X rectf(0.0,0.0,a->w,a->h);
X color(PNL_OUTLINE_COLOR);
X rect(0.0,0.0,a->w,a->h);
X color(PNL_HIGHLIGHT_COLOR);
X translate(a->w/2.0,a->h/2.0,0.0);
X _drawpuckshape(a,p,x,y,PNL_FILLED);
X color(PNL_OUTLINE_COLOR);
X _drawpuckshape(a,p,x,y,PNL_OPEN);
X curson();
X } else {
X cursoff();
X x=PNL_FLOATING_PUCK_SENS
X *PNL_ACCESS(Puck, a, x)/(a->maxval-a->minval)
X +a->x+a->w/2.0;
X y=PNL_FLOATING_PUCK_SENS
X *PNL_ACCESS(Puck, a, y)/(a->maxval-a->minval)
X +a->y+a->h/2.0;
X
X _drawpup(a,p,x,y,PUCK_DRAW,_drawpuckshape);
X
X translate(a->x,a->y,0.0);
X color(PNL_HIGHLIGHT_COLOR);
X rectf(0.0,0.0,a->w,a->h);
X color(PNL_OUTLINE_COLOR);
X rect(0.0,0.0,a->w,a->h);
X
X color(PNL_NORMAL_COLOR);
X translate(a->w/2.0,a->h/2.0,0.0);
X _drawpuckshape(a,p,x,y,PNL_FILLED);
X color(PNL_OUTLINE_COLOR);
X _drawpuckshape(a,p,x,y,PNL_OPEN);
X }
X popmatrix();
X
X color(PNL_OUTLINE_COLOR);
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawrubberband(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
Xfloat r, alpha;
XCoord dx, dy;
X
X dx=a->x+a->w/2.0-x;
X dy=a->y+a->h/2.0-y;
X
X rectf(dx-PNL_DIM_3,
X dy-PNL_DIM_3,
X dx+PNL_DIM_3,
X dy+PNL_DIM_3);
X
X pushmatrix();
X r=hypot((long float)dx,(long float)dy);
X if (dx==0.0&&dy==0.0) alpha=0.0;
X else alpha=atan2(dy,dx);
X alpha=fmod(alpha, 360.0);
X rot(alpha*PNL_RAD_TO_DEG,'z');
X rectf(0.0,-PNL_DIM_3/2.0,r,PNL_DIM_3/2.0);
X popmatrix();
X}
X
Xvoid
X_drawrubberpuckshape(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X if (style==PNL_FILLED) {
X rectf(-d,-PNL_DIM_3,d,PNL_DIM_3);
X rectf(-PNL_DIM_3,-d,PNL_DIM_3,d);
X rectf(-PNL_DIM_2,-PNL_DIM_2,PNL_DIM_2,PNL_DIM_2);
X } else {
X move2(-PNL_DIM_3,-d);
X draw2(PNL_DIM_3,-d);
X draw2(PNL_DIM_3,-PNL_DIM_2);
X draw2(PNL_DIM_2,-PNL_DIM_2);
X draw2(PNL_DIM_2,-PNL_DIM_3);
X draw2(d,-PNL_DIM_3);
X draw2(d,PNL_DIM_3);
X draw2(PNL_DIM_2,PNL_DIM_3);
X draw2(PNL_DIM_2,PNL_DIM_2);
X draw2(PNL_DIM_3,PNL_DIM_2);
X draw2(PNL_DIM_3,d);
X draw2(-PNL_DIM_3,d);
X draw2(-PNL_DIM_3,PNL_DIM_2);
X draw2(-PNL_DIM_2,PNL_DIM_2);
X draw2(-PNL_DIM_2,PNL_DIM_3);
X draw2(-d,PNL_DIM_3);
X draw2(-d,-PNL_DIM_3);
X draw2(-PNL_DIM_2,-PNL_DIM_3);
X draw2(-PNL_DIM_2,-PNL_DIM_2);
X draw2(-PNL_DIM_3,-PNL_DIM_2);
X draw2(-PNL_DIM_3,-d);
X }
X}
X
Xvoid
X_drawrubberpuckshapeandband(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
X _drawrubberpuckshape(a, p, x, y, style);
X _drawrubberband(a, p, x, y, style);
X}
X
Xvoid
X_drawrubberpuck(a,p)
XActuator *a;
XPanel *p;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
Xstatic Coord x, y;
X
X pushmatrix();
X if (!a->active) {
X _drawpup(a,p,x,y,PUCK_ERASE,_drawrubberpuckshapeandband);
X translate(a->x,a->y,0.0);
X color(PNL_NORMAL_COLOR);
X rectf(0.0,0.0,a->w,a->h);
X color(PNL_OUTLINE_COLOR);
X rect(0.0,0.0,a->w,a->h);
X color(PNL_HIGHLIGHT_COLOR);
X translate(a->w/2.0,a->h/2.0,0.0);
X _drawrubberpuckshape(a,p,x,y,PNL_FILLED);
X color(PNL_OUTLINE_COLOR);
X _drawrubberpuckshape(a,p,x,y,PNL_OPEN);
X curson();
X } else {
X cursoff();
X x=PNL_FLOATING_PUCK_SENS
X *PNL_ACCESS(Puck, a, x)/(a->maxval-a->minval)
X +a->x+a->w/2.0;
X y=PNL_FLOATING_PUCK_SENS
X *PNL_ACCESS(Puck, a, y)/(a->maxval-a->minval)
X +a->y+a->h/2.0;
X
X _drawpup(a,p,x,y,PUCK_DRAW,_drawrubberpuckshapeandband);
X
X translate(a->x,a->y,0.0);
X color(PNL_HIGHLIGHT_COLOR);
X rectf(0.0,0.0,a->w,a->h);
X color(PNL_OUTLINE_COLOR);
X rect(0.0,0.0,a->w,a->h);
X
X color(PNL_NORMAL_COLOR);
X translate(a->w/2.0,a->h/2.0,0.0);
X _drawrubberpuckshape(a,p,x,y,PNL_FILLED);
X color(PNL_OUTLINE_COLOR);
X _drawrubberpuckshape(a,p,x,y,PNL_OPEN);
X }
X popmatrix();
X if (pnl_justup) curson();
X
X color(PNL_OUTLINE_COLOR);
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
Xpnl_puck(a)
XActuator *a;
X{
X a->type=PNL_PUCK;
X
X a->w=a->h=PNL_PUCK_EDGE;
X a->data=(char *)alloc(sizeof(Puck)); /* this goes in an addfunc */
X a->datasize=sizeof(Puck);
X PNL_ACCESS(Puck, a, x)=0.0;
X PNL_ACCESS(Puck, a, y)=0.0;
X a->labeltype=PNL_LABEL_BOTTOM;
X a->newvalfunc=_newvalpuck;
X a->drawfunc=_drawpuck;
X}
X
Xvoid
Xpnl_floating_puck(a)
XActuator *a;
X{
X a->type=PNL_FLOATING_PUCK;
X
X a->w=PNL_FLOATING_PUCK_EDGE;
X a->h=PNL_FLOATING_PUCK_EDGE;
X a->data=(char *)alloc(sizeof(Puck));
X a->datasize=sizeof(Puck);
X PNL_ACCESS(Puck, a, x)=0.0;
X PNL_ACCESS(Puck, a, y)=0.0;
X a->newvalfunc=_newvalfloatingpuck;
X a->drawfunc=_drawfloatingpuck;
X}
X
Xvoid
Xpnl_rubber_puck(a)
XActuator *a;
X{
X pnl_floating_puck(a);
X
X a->type=PNL_RUBBER_PUCK;
X a->drawfunc=_drawrubberpuck;
X}
X
SHAR_EOF
chmod 0644 puck.c || echo "restore of puck.c fails"
sed 's/^X//' << 'SHAR_EOF' > script.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 at orville.nas.nasa.gov
X */
X#include <gl.h>
X#include <device.h>
X#include <panel.h>
X
Xvoid
Xbeginscript()
X{
X pnl_beginwritescript("panel.script");
X}
X
Xvoid
Xappendscript()
X{
X pnl_beginappendscript("panel.script");
X}
X
Xvoid
Xendscript()
X{
X pnl_endwritescript();
X}
X
Xvoid
Xreadscript()
X{
X pnl_beginreadscript("panel.script");
X}
X
Xvoid
Xstopscript()
X{
X pnl_endreadscript();
X}
X
Xinitscriptpanel()
X{
XActuator *a;
XPanel *p;
X
X p=mkpanel();
X p->label="scripting";
X
X a=mkact(pnl_button);
X a->label="dump state";
X a->x=1.0;
X a->y=4.5;
X a->downfunc=dumpstate;
X addact(a, p);
X
X a=mkact(pnl_button);
X a->label="begin script";
X a->x=1.0;
X a->y=4.0;
X a->downfunc=beginscript;
X addact(a, p);
X
X a=mkact(pnl_button);
X a->label="end script";
X a->x=1.0;
X a->y=3.5;
X a->downfunc=endscript;
X addact(a, p);
X
X a=mkact(pnl_button);
X a->label="append to script";
X a->x=1.0;
X a->y=3.0;
X a->downfunc=appendscript;
X addact(a, p);
X
X a=mkact(pnl_button);
X a->label="read script";
X a->x=1.0;
X a->y=2.5;
X a->downfunc=readscript;
X addact(a, p);
X
X a=mkact(pnl_button);
X a->label="stop reading script";
X a->x=1.0;
X a->y=2.0;
X a->downfunc=stopscript;
X addact(a, p);
X}
SHAR_EOF
chmod 0644 script.c || echo "restore of script.c fails"
sed 's/^X//' << 'SHAR_EOF' > slider.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 at orville.nas.nasa.gov
X */
X#include <gl.h>
X#include "panel.h"
X
X#define NORMAL_MODE 0
X#define DIFFERENTIAL_MODE 1
X#define FINE_CONTROL_MODE 2
X
X#define DIFFERENTIAL_FACTOR 0.1
X#define FINE_CONTROL_FACTOR 0.05
X
Xvoid setsliderval(a, x, dist)
X Actuator *a;
X Coord x;
X float dist;
X{
X Slider *ad=(Slider *)a->data;
X float tmp;
X
X tmp=PNL_VAL_TO_WORLD(a->val, a->minval, a->maxval, dist);
X if (pnl_justdown) {
X if (!pnl_controlkey)
X a->val=PNL_WORLD_TO_VAL(x, a->minval, a->maxval, dist);
X ad->wsave=x;
X }
X
X a->val+=
X (pnl_controlkey?ad->finefactor
X *(x-ad->wsave)/dist*(a->maxval-a->minval)
X :(x-ad->wsave)/dist*(a->maxval-a->minval));
X a->val=RANGE(a->val, a->maxval, a->minval);
X
X ad->wsave=x;
X ad->valsave=a->val;
X}
X
Xvoid _newvalvslider(a,p,sx,sy)
X Actuator *a;
X Panel *p;
X Screencoord sx,sy;
X{
X Slider *ad=(Slider *)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 setsliderval(a, wy-a->y, a->h);
X}
X
Xvoid _newvalhslider(a,p,sx,sy)
X Actuator *a;
X Panel *p;
X Screencoord sx,sy;
X{
X Slider *ad=(Slider *)a->data;
X Coord wx, wy;
X
X if (!a->active) return;
X
X mapw2(p->vobj,sx,sy,&wx,&wy);
X
X setsliderval(a, wx-a->x, a->w);
X}
X
Xvoid _newvaldvslider(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
X Slider *ad=(Slider *)a->data;
X Coord wx, wy;
X
X mapw2(p->vobj,sx,sy,&wx,&wy);
X
X if (pnl_justdown) {
X if (wy-a->y<a->h-PNL_BUTTON_EDGE) ad->mode = NORMAL_MODE;
X else {
X ad->wsave=wy;
X ad->valsave=a->val;
X if (wx-a->x<PNL_BUTTON_EDGE) ad->mode = DIFFERENTIAL_MODE;
X else ad->mode = FINE_CONTROL_MODE;
X }
X }
X if (pnl_justup) ad->mode=NORMAL_MODE;
X if (!a->active) return;
X
X switch (ad->mode) {
X case NORMAL_MODE:
X/* a->val=(wy-a->y)/(a->h-PNL_BUTTON_EDGE)
X *(a->maxval-a->minval)+a->minval; */
X setsliderval(a, wy-a->y, a->h-PNL_BUTTON_EDGE);
X break;
X case DIFFERENTIAL_MODE:
X a->val+=DIFFERENTIAL_FACTOR*(wy-ad->wsave)/a->h*(a->maxval-a->minval);
X break;
X case FINE_CONTROL_MODE:
X a->val=ad->valsave
X +FINE_CONTROL_FACTOR*(wy-ad->wsave)/a->h*(a->maxval-a->minval);
X default:
X break;
X }
X
X a->val=RANGE(a->val, a->maxval, a->minval);
X}
X
Xvoid
X_drawvslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord y;
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X color(pnl_normal_color);
X rectf(0.0,0.0,a->w,a->h);
X color(pnl_outline_color);
X rect(0.0,0.0,a->w,a->h);
X
X y=(a->val-a->minval)/(a->maxval-a->minval)*a->h;
X
X color(pnl_highlight_color);
X rectf(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X a->w,MIN(a->h,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X color(pnl_outline_color);
X rect(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X a->w,MIN(a->h,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X
X popmatrix();
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawhslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord x;
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X color(pnl_normal_color);
X rectf(0.0,0.0,a->w,a->h);
X color(pnl_outline_color);
X rect(0.0,0.0,a->w,a->h);
X
X x=(a->val-a->minval)/(a->maxval-a->minval)*a->w;
X
X color(pnl_highlight_color);
X rectf(MAX(0.0,x-PNL_SLIDER_BAR_HEIGHT/2.0),0.0,
X MIN(a->w,x+PNL_SLIDER_BAR_HEIGHT/2.0),a->h);
X color(pnl_outline_color);
X rect(MAX(0.0,x-PNL_SLIDER_BAR_HEIGHT/2.0),0.0,
X MIN(a->w,x+PNL_SLIDER_BAR_HEIGHT/2.0),a->h);
X
X popmatrix();
X if (a->label) drawlabel(a, p);
X}
X
XCoord diamond[][2] = {
X { 0.0, -1.0 },
X { 1.0, 0.0 },
X { 0.0, 1.0 },
X {-1.0, 0.0 }
X };
X
X_drawfineicon(selected)
XBoolean selected;
X{
X pushmatrix();
X if (selected) {
X color(pnl_highlight_color);
X rectf(-PNL_BUTTON_EDGE/2.0,-PNL_BUTTON_EDGE/2.0,
X PNL_BUTTON_EDGE/2.0, PNL_BUTTON_EDGE/2.0);
X color(pnl_normal_color);
X scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X polf2(4, diamond);
X color(pnl_outline_color);
X poly2(4, diamond);
X } else {
X scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X color(pnl_other_color);
X polf2(4, diamond);
X color(pnl_outline_color);
X poly2(4, diamond);
X }
X popmatrix();
X}
X
X_drawdifficon(selected)
XBoolean selected;
X{
X pushmatrix();
X if (selected) {
X color(pnl_highlight_color);
X rectf(-PNL_BUTTON_EDGE/2.0,-PNL_BUTTON_EDGE/2.0,
X PNL_BUTTON_EDGE/2.0, PNL_BUTTON_EDGE/2.0);
X color(pnl_normal_color);
X scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X poly2(4, diamond);
X } else {
X color(pnl_outline_color);
X scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X poly2(4, diamond);
X }
X popmatrix();
X}
X
Xvoid
X_drawdvslider(a, p)
XActuator *a;
XPanel *p;
X{
X Slider *ad=(Slider *)a->data;
X Coord y;
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X color(pnl_normal_color);
X rectf(0.0,0.0,a->w,a->h);
X
X pushmatrix();
X translate(PNL_BUTTON_EDGE/2.0,a->h-PNL_BUTTON_EDGE/2.0,0.0);
X switch (ad->mode) {
X case NORMAL_MODE:
X _drawdifficon(FALSE);
X translate(PNL_BUTTON_EDGE, 0.0, 0.0);
X _drawfineicon(FALSE);
X break;
X case FINE_CONTROL_MODE:
X _drawdifficon(FALSE);
X translate(PNL_BUTTON_EDGE, 0.0, 0.0);
X _drawfineicon(TRUE);
X break;
X case DIFFERENTIAL_MODE:
X _drawdifficon(TRUE);
X translate(PNL_BUTTON_EDGE, 0.0, 0.0);
X _drawfineicon(FALSE);
X break;
X }
X popmatrix();
X
X color(pnl_outline_color);
X rect(0.0,0.0,a->w,a->h);
X move2(0.0,a->h-PNL_BUTTON_EDGE);
X rdr2(PNL_SLIDER_WIDTH,0.0);
X move2(PNL_BUTTON_EDGE,a->h-PNL_BUTTON_EDGE);
X rdr2(0.0,PNL_BUTTON_EDGE);
X
X y=(a->val-a->minval)/(a->maxval-a->minval)
X *(a->h-PNL_BUTTON_EDGE);
X
X color(pnl_highlight_color);
X rectf(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X a->w,MIN(a->h-PNL_BUTTON_EDGE,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X color(pnl_outline_color);
X rect(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X a->w,MIN(a->h-PNL_BUTTON_EDGE,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X
X popmatrix();
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawfilledhslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord x;
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X color(pnl_normal_color);
X rectf(0.0,0.0,a->w,a->h);
X color(pnl_outline_color);
X rect(0.0,0.0,a->w,a->h);
X
X x=(a->val-a->minval)/(a->maxval-a->minval)*a->w;
X
X color(pnl_highlight_color);
X rectf(0.0,0.0,x,a->h);
X color(pnl_outline_color);
X rect(0.0,0.0,x,a->h);
X
X popmatrix();
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawfilledvslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord y;
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X color(pnl_normal_color);
X rectf(0.0,0.0,a->w,a->h);
X color(pnl_outline_color);
X rect(0.0,0.0,a->w,a->h);
X
X y=(a->val-a->minval)/(a->maxval-a->minval)*a->h;
X
X color(pnl_highlight_color);
X rectf(0.0,0.0,a->w,y);
X color(pnl_outline_color);
X rect(0.0,0.0,a->w,y);
X
X popmatrix();
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_addslider(a)
X Actuator *a;
X{
X Slider *ad=(Slider *)a->data;
X if (ad->finefactor==0.0) ad->finefactor=FINE_CONTROL_FACTOR;
X}
X
Xvoid
Xpnl_slider(a)
XActuator *a;
X{
X Slider *ad;
X
X a->type=PNL_SLIDER;
X
X a->data = alloc(sizeof(Slider));
X a->datasize = sizeof(Slider);
X ad=(Slider *)a->data;
X ad->wsave=0.0;
X ad->mode=NORMAL_MODE;
X
X a->labeltype=PNL_LABEL_BOTTOM;
X a->addfunc=_addslider;
X
X a->w=PNL_SLIDER_WIDTH;
X a->h=PNL_SLIDER_HEIGHT;
X a->newvalfunc=_newvalvslider;
X a->drawfunc=_drawvslider;
X}
X
Xvoid
Xpnl_vslider(a)
XActuator *a;
X{
X pnl_slider(a);
X a->type=PNL_VSLIDER;
X
X a->w=PNL_SLIDER_WIDTH;
X a->h=PNL_SLIDER_HEIGHT;
X a->newvalfunc=_newvalvslider;
X a->drawfunc=_drawvslider;
X}
X
Xvoid
Xpnl_hslider(a)
XActuator *a;
X{
X pnl_slider(a);
X a->type=PNL_HSLIDER;
X
X a->w=PNL_SLIDER_HEIGHT;
X a->h=PNL_SLIDER_WIDTH;
X a->newvalfunc=_newvalhslider;
X a->drawfunc=_drawhslider;
X}
X
Xvoid
Xpnl_dvslider(a)
XActuator *a;
X{
X pnl_slider(a);
X a->type=PNL_DVSLIDER;
X
X a->w=PNL_SLIDER_WIDTH;
X a->h=PNL_SLIDER_HEIGHT;
X a->newvalfunc=_newvaldvslider;
X a->drawfunc=_drawdvslider;
X}
X
Xvoid
Xpnl_filled_vslider(a)
XActuator *a;
X{
X pnl_slider(a);
X a->type=PNL_FILLED_VSLIDER;
X
X a->w=PNL_SLIDER_WIDTH;
X a->h=PNL_SLIDER_HEIGHT;
X a->newvalfunc=_newvalvslider;
X a->drawfunc=_drawfilledvslider;
X}
X
Xvoid
Xpnl_filled_slider(a)
XActuator *a;
X{
X pnl_filled_vslider(a);
X a->type=PNL_FILLED_SLIDER;
X}
X
Xvoid
Xpnl_filled_hslider(a)
XActuator *a;
X{
X pnl_slider(a);
X a->type=PNL_FILLED_HSLIDER;
X
X a->w=PNL_SLIDER_HEIGHT;
X a->h=PNL_SLIDER_WIDTH;
X a->newvalfunc=_newvalhslider;
X a->drawfunc=_drawfilledhslider;
X}
SHAR_EOF
chmod 0644 slider.c || echo "restore of slider.c fails"
sed 's/^X//' << 'SHAR_EOF' > slideroid.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 at orville.nas.nasa.gov
X */
X#include <gl.h>
X#include "panel.h"
X
X#define NORMAL_MODE 0
X#define DIFFERENTIAL_MODE 1
X#define ABSOLUTE_MODE 2
X
X#define DIFFERENTIAL_FACTOR 0.01
X#define ABSOLUTE_FACTOR 0.05
X#define FINE_FACTOR 0.05
X
Xvoid _newvalslideroid(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
X Slideroid *ad=(Slideroid *)a->data;
X Coord wx, wy;
X
X mapw2(p->vobj,sx,sy,&wx,&wy);
X
X if (pnl_justdown) {
X if ( wy-a->y>2.0*a->h/3.0
X && wx-a->x<a->w/6.0) ad->finemode= ~ad->finemode;
X else if ( wy-a->y>2.0*a->h/3.0
X && wx-a->x>5.0*a->w/6.0) {
X ad->resetmode=TRUE;
X if (a->val==a->initval
X && ad->resettarget) *ad->resettarget=ad->resetval;
X else a->val=a->initval;
X }
X else if (wy-a->y<a->h/3.0) {
X ad->wsave=wy;
X ad->valsave=a->val;
X if (wx-a->x<a->w/2.0) ad->mode = DIFFERENTIAL_MODE;
X else ad->mode = ABSOLUTE_MODE;
X } else ad->mode = NORMAL_MODE;
X }
X if (pnl_justup) {
X ad->mode=NORMAL_MODE;
X ad->resetmode=FALSE;
X }
X if (!a->active) return;
X
X switch (ad->mode) {
X case NORMAL_MODE:
X break;
X case DIFFERENTIAL_MODE:
X a->val+=DIFFERENTIAL_FACTOR
X *(ad->finemode?FINE_FACTOR:1.0)
X *(wy-ad->wsave)
X /a->h
X *(a->maxval-a->minval);
X break;
X case ABSOLUTE_MODE:
X a->val=ad->valsave
X +ABSOLUTE_FACTOR
X *(ad->finemode?FINE_FACTOR:1.0)
X *(wy-ad->wsave)/a->h
X *(a->maxval-a->minval);
X default:
X break;
X }
X
X a->val=RANGE(a->val, a->maxval, a->minval);
X}
X
Xstatic Coord diamond[][2] = {
X { 0.0, -1.0 },
X { 1.0, 0.0 },
X { 0.0, 1.0 },
X {-1.0, 0.0 }
X };
X
Xstatic _drawabsicon(a, selected)
XActuator *a;
XBoolean selected;
X{
X pushmatrix();
X if (selected) {
X color(pnl_highlight_color);
X rectf(-a->w/4.0,-a->h/6.0,
X a->w/4.0, a->h/6.0);
X color(pnl_normal_color);
X scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X polf2(4, diamond);
X color(pnl_outline_color);
X poly2(4, diamond);
X } else {
X scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X color(pnl_other_color);
X polf2(4, diamond);
X color(pnl_outline_color);
X poly2(4, diamond);
X }
X popmatrix();
X}
X
Xstatic _drawdifficon(a, selected)
XActuator *a;
XBoolean selected;
X{
X pushmatrix();
X if (selected) {
X color(pnl_highlight_color);
X rectf(-a->w/4.0,-a->h/6.0,
X a->w/4.0, a->h/6.0);
X color(pnl_normal_color);
X scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X poly2(4, diamond);
X } else {
X color(pnl_outline_color);
X scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X poly2(4, diamond);
X }
X popmatrix();
X}
X
Xvoid
X_drawslideroid(a, p)
XActuator *a;
XPanel *p;
X{
X Slideroid *ad=(Slideroid *)a->data;
X Coord cx, cy;
X char s[7], stmp[16];
X
X pushmatrix();
X
X translate(a->x,a->y,0.0);
X
X color(pnl_normal_color);
X rectf(0.0,0.0,a->w,a->h);
X color(pnl_outline_color);
X rect(0.0,0.0,a->w,a->h);
X
X move2(0.0,a->h/3.0);
X rdr2(a->w,0.0);
X move2(0.0,2.0*a->h/3.0);
X rdr2(a->w,0.0);
X move2(a->w/2.0,0.0);
X rdr2(0.0,a->h/3.0);
X move2(a->w/6.0,2.0*a->h/3.0);
X rdr2(0.0,a->h/3.0);
X move2(5.0*a->w/6.0,2.0*a->h/3.0);
X rdr2(0.0,a->h/3.0);
X
X cx= -(float)strwidth("F")/p->ppu/2.0;
X cy= -(float)(getheight("E")-getdescender())/p->ppu/2.0;
X if (ad->finemode) {
X color(pnl_highlight_color);
X rectf(0.0,2.0*a->h/3.0,a->w/6.0,a->h);
X color(pnl_white_color);
X cmov2(a->w/12.0+cx, 5.0*a->h/6.0+cy);
X charstr("F");
X color(pnl_outline_color);
X } else {
X cmov2(a->w/12.0+cx, 5.0*a->h/6.0+cy);
X charstr("F");
X }
X
X if (ad->resetmode) {
X color(pnl_highlight_color);
X rectf(5.0*a->w/6.0,2.0*a->h/3.0,a->w,a->h);
X color(pnl_white_color);
X cmov2(11.0*a->w/12.0+cx, 5.0*a->h/6.0+cy);
X charstr("R");
X color(pnl_outline_color);
X } else {
X cmov2(11.0*a->w/12.0+cx, 5.0*a->h/6.0+cy);
X charstr("R");
X }
X
X sprintf(stmp, "%-+#10.3E", a->val);
X strncpy(s, stmp, 6);
X s[6]='\0';
X
X cx= -(float)strwidth(s)/p->ppu/2.0;
X cmov2(a->w/2.0+cx, 3.0*a->h/6.0+cy);
X charstr(s);
X
X strncpy(s, stmp+6, 4);
X s[4]='\0';
X
X cx= -(float)strwidth(s)/p->ppu/2.0;
X cmov2(a->w/2.0+cx, 5.0*a->h/6.0+cy);
X charstr(s);
X
X pushmatrix();
X translate(a->w/4.0,a->h/6.0,0.0);
X switch (ad->mode) {
X case NORMAL_MODE:
X _drawdifficon(a, FALSE);
X translate(a->w/2.0, 0.0, 0.0);
X _drawabsicon(a, FALSE);
X break;
X case ABSOLUTE_MODE:
X _drawdifficon(a, FALSE);
X translate(a->w/2.0, 0.0, 0.0);
X _drawabsicon(a, TRUE);
X break;
X case DIFFERENTIAL_MODE:
X _drawdifficon(a, TRUE);
X translate(a->w/2.0, 0.0, 0.0);
X _drawabsicon(a, FALSE);
X break;
X }
X popmatrix();
X popmatrix();
X
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
Xpnl_slideroid(a)
XActuator *a;
X{
X Slideroid *ad;
X
X a->type=PNL_SLIDEROID;
X
X a->data = alloc(sizeof(Slideroid));
X a->datasize = sizeof(Slideroid);
X ad=(Slideroid *)a->data;
X ad->wsave=0.0;
X ad->mode=NORMAL_MODE;
X
X a->w=PNL_SLIDEROID_WIDTH;
X
X a->h=PNL_SLIDEROID_HEIGHT;
X a->labeltype=PNL_LABEL_BOTTOM;
X a->newvalfunc=_newvalslideroid;
X a->drawfunc=_drawslideroid;
X}
X
SHAR_EOF
chmod 0644 slideroid.c || echo "restore of slideroid.c fails"
sed 's/^X//' << 'SHAR_EOF' > stoa.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 at orville.nas.nasa.gov
X */
X#include <stdio.h>
X#include <gl.h>
X#include "panel.h"
X
XBoolean
Xtread(fd, buf, len)
Xint fd;
Xchar *buf;
Xint len;
X{
X int c;
X
X if ((c=read(0,buf,len))!=len) {
X printf("<end of input>\n");
X return FALSE;
X }
X return TRUE;
X}
X
Xmain()
X{
X int c;
X Actuator a;
X short actid;
X int msgtype, datasize, delay;
X int buf[9];
X char data[16386];
X
X for (;;) {
X if (!tread(0,&msgtype,sizeof(msgtype))) exit(1);
X
X switch (msgtype) {
X case PNL_MT_MOUSE:
X if (!tread(0,buf,sizeof(buf))) exit(1);
X
X pnl_cp=(Panel *)buf[0];
X pnl_ca=(Actuator *)buf[1];
X pnl_mx=(Screencoord)buf[2];
X pnl_my=(Screencoord)buf[3];
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 printf("MOUSE: %d %d %d %d %d %d %d\n",
X pnl_cp,
X pnl_ca,
X pnl_mx,
X pnl_my,
X pnl_justup,
X pnl_justdown,
X pnl_mousedown,
X pnl_shiftkey,
X pnl_controlkey);
X break;
X case PNL_MT_STATE:
X tread(0,&actid,sizeof(short));
X tread(0,&a,sizeof(a));
X tread(0,&datasize,sizeof(int));
X tread(0,data,datasize);
X
X printf("STATE: %d %d %f\n", actid, a.type, a.val);
X break;
X case PNL_MT_DELAY:
X tread(0,&delay,sizeof(delay));
X
X printf("DELAY: %d\n", delay);
X break;
X default:
X printf("unrecognized message type\n");
X exit(1);
X }
X }
X}
X
X
SHAR_EOF
chmod 0644 stoa.c || echo "restore of stoa.c fails"
sed 's/^X//' << 'SHAR_EOF' > strip.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 at orville.nas.nasa.gov
X */
X#include <math.h>
X#include <gl.h>
X#include "panel.h"
X
Xvoid NewY(a,x)
XActuator *a;
Xfloat x;
X{
X int i;
X Stripchart * dp = (Stripchart *)a->data;
X
X dp->y[dp->lastpt++] = x;
X if (dp->lastpt >= PNL_STRIP_CHART_NPTS) dp->lastpt = 0;
X if (dp->firstpt == dp->lastpt) {
X dp->firstpt++;
X if (dp->firstpt == PNL_STRIP_CHART_NPTS) dp->firstpt = 0;
X }
X}
X
Xvoid _setrange(a)
XActuator *a;
X{
X int i;
X float mymin, mymax;
X Stripchart * dp = (Stripchart *)a->data;
X
X i = dp->firstpt;
X mymax = dp->y[i];
X mymin = mymax;
X
X while (i != dp->lastpt) {
X if (dp->y[i] < mymin) mymin = dp->y[i];
X if (dp->y[i] > mymax) mymax = dp->y[i];
X i++;
X if (i >= PNL_STRIP_CHART_NPTS) i = 0;
X }
X
X if (mymin == mymax) { /* Center the only value, if all are same */
X mymin -= 0.1;
X mymax += 0.1;
X }
X if (!dp->Bind_Low)
X a->minval = mymin;
X if (!dp->Bind_High)
X a->maxval = mymax;
X}
X
Xvoid
X_addstripchart(a, p)
XActuator *a;
XPanel *p;
X{
Xint i;
X
X PNL_ACCESS(Stripchart, a, firstpt) = 0;
X PNL_ACCESS(Stripchart, a, lastpt) = 0;
X PNL_ACCESS(Stripchart, a, y) =
X (float *)alloc(PNL_STRIP_CHART_NPTS*sizeof(float));
X a->datasize=sizeof(Stripchart)+PNL_STRIP_CHART_NPTS*sizeof(float);
X for (i = 0; i < PNL_STRIP_CHART_NPTS; i++)
X PNL_ACCESS(Stripchart, a, y[i]) = 0.0;
X}
X
Xvoid
X_fixstripchart(a)
XActuator *a;
X{
X NewY(a, a->val);
X}
X
Xvoid _newvalstripchart(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
X NewY(a,a->val);
X}
X
Xvoid _dumpstripchart(a, fd)
XActuator *a;
Xint fd;
X{
XStripchart *ad=(Stripchart *)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(Stripchart));
X write(fd, ad->y, PNL_STRIP_CHART_NPTS*sizeof(float));
X}
X
Xvoid _loadstripchart(a, fd)
XActuator *a;
Xint fd;
X{
XStripchart *ad=(Stripchart *)a->data;
X
X read(fd, a, sizeof(Actuator));
X read(fd, &a->datasize, sizeof(int));
X read(fd, a->data, sizeof(Stripchart));
X read(fd, ad->y, PNL_STRIP_CHART_NPTS*sizeof(float));
X}
X
X
Xvoid
X_drawanalogmeter(a,p)
XActuator *a;
XPanel *p;
X{
X float theta;
X Coord x, y;
X Coord radius = (a->w / 2.0) - (2.0*PNL_DIM_2);
X Coord xorg = a->w / 2.0;
X Coord yorg = PNL_DIM_2;
X long oldwidth = getlwidth();
X
X pushmatrix();
X translate(a->x,a->y,0.0);
X
X color(pnl_other_color);
X rectf(0.0, 0.0, a->w, a->h);
X
X color(pnl_normal_color);
X arcf(xorg, yorg, radius, 0, 1800);
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 theta = M_PI * (float) (a->val - a->minval)
X / (float) (a->maxval - a->minval);
X theta = M_PI - theta;
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 rect(0.0, 0.0, a->w, a->h);
X
X popmatrix();
X if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawanalogbar(a,p)
XActuator *a;
XPanel *p;
X{
X float theta;
X int dtheta; /* in tenths of degrees */
X Coord x, y;
X Coord radius = (a->w / 2.0) - (2.0*PNL_DIM_2);
X Coord xorg = a->w / 2.0;
X Coord yorg = PNL_DIM_2;
X long oldwidth = getlwidth();
X
X pushmatrix();
X translate(a->x,a->y,0.0);
X
X color(pnl_other_color);
X rectf(0.0, 0.0, a->w, a->h);
X
X color(pnl_normal_color);
X arcf(xorg, yorg, radius, 0, 1800);
X
X color(pnl_highlight_color);
X theta = M_PI * (float) (a->val - a->minval)
X / (float) (a->maxval - a->minval);
X theta = M_PI - theta;
X dtheta = (int) (theta/M_PI*1800);
X
X arcf(xorg, yorg, radius, dtheta, 1800);
SHAR_EOF
echo "End of part 5, continue with part 6"
echo "6" > s2_seq_.tmp
exit 0
More information about the Comp.sys.sgi
mailing list