--- ray/src/hd/rhdisp.c 1997/12/09 17:12:15 3.11 +++ ray/src/hd/rhdisp.c 1997/12/11 16:45:58 3.13 @@ -14,6 +14,10 @@ static char SCCSid[] = "$SunId$ SGI"; #include "selcall.h" #include +#ifndef VIEWHISTLEN +#define VIEWHISTLEN 2 /* number of remembered views */ +#endif + HOLO *hdlist[HDMAX+1]; /* global holodeck list */ char cmdlist[DC_NCMDS][8] = DC_INIT; @@ -54,22 +58,22 @@ char *argv[]; rdy = disp_wait(); if (rdy & RDY_DEV) { /* user input from driver */ inp = dev_input(); - if (inp & DEV_PUTVIEW) - printview(); - if (inp & DEV_NEWVIEW) + if (inp & DFL(DC_SETVIEW)) new_view(&odev.v); - if (inp & DEV_SHUTDOWN) - serv_request(DR_SHUTDOWN, 0, NULL); - if (inp & DEV_REDRAW) { - imm_mode = 1; /* preempt updates */ - beam_sync(); - } - if (inp & DEV_WAIT) + if (inp & DFL(DC_GETVIEW)) + printview(); + if (inp & DFL(DC_LASTVIEW)) + new_view(NULL); + if (inp & DFL(DC_PAUSE)) pause = 1; - if (inp & DEV_RESUME) { + if (inp & DFL(DC_RESUME)) { serv_request(DR_NOOP, 0, NULL); pause = 0; } + if (inp & DFL(DC_REDRAW)) + imm_mode = beam_sync() > 0; + if (inp & DFL(DC_QUIT)) + serv_request(DR_SHUTDOWN, 0, NULL); } if (rdy & RDY_SIN) /* user input from sstdin */ switch (usr_input()) { @@ -190,22 +194,38 @@ register PACKHEAD *p; new_view(v) /* change view parameters */ -VIEW *v; +register VIEW *v; { + static VIEW viewhist[VIEWHISTLEN]; + static unsigned nhist; char *err; - - do { - if ((err = setview(v)) != NULL) { - error(COMMAND, err); + /* restore previous view? */ + if (v == NULL) { + if (nhist < 2) { + error(COMMAND, "no previous view"); return; } - if (v->type == VT_PAR) { - error(COMMAND, "cannot handle parallel views"); - return; - } - dev_view(v); /* update display driver */ - dev_flush(); /* update screen */ - } while (!beam_view(v)); /* update beam list */ + nhist--; /* get one before last setting */ + v = viewhist + ((nhist-1)%VIEWHISTLEN); + } else if ((err = setview(v)) != NULL) { + error(COMMAND, err); + return; + } +again: + if (v->type == VT_PAR) { + error(COMMAND, "cannot handle parallel views"); + return; + } + if (!dev_view(v)) /* update display driver */ + goto again; + dev_flush(); /* update screen */ + if (!beam_view(v)) /* update beam list */ + goto again; + /* record new view */ + if (v < viewhist || v >= viewhist+VIEWHISTLEN) { + copystruct(viewhist + (nhist%VIEWHISTLEN), v); + nhist++; + } } @@ -246,9 +266,15 @@ usr_input() /* get user input and process it */ case DC_GETVIEW: /* print the current view */ printview(); break; + case DC_LASTVIEW: /* restore previous view */ + new_view(NULL); + break; case DC_PAUSE: /* pause the current calculation */ case DC_RESUME: /* resume the calculation */ /* handled in main() */ + break; + case DC_REDRAW: /* redraw from server */ + imm_mode = beam_sync() > 0; break; case DC_QUIT: /* quit request */ serv_request(DR_SHUTDOWN, 0, NULL);