--- ray/src/hd/rhdisp.c 1998/01/06 05:26:20 3.22 +++ ray/src/hd/rhdisp.c 1998/05/14 13:06:32 3.24 @@ -1,4 +1,4 @@ -/* Copyright (c) 1997 Silicon Graphics, Inc. */ +/* Copyright (c) 1998 Silicon Graphics, Inc. */ #ifndef lint static char SCCSid[] = "$SunId$ SGI"; @@ -93,7 +93,7 @@ char *argv[]; if (inp & DFL(DC_PAUSE)) pause = 1; if (inp & DFL(DC_REDRAW)) - imm_mode = beam_sync() > 0; + imm_mode = beam_sync(1) > 0; if (inp & DFL(DC_KILL)) { serv_request(DR_KILL, 0, NULL); pause = 0; @@ -159,6 +159,7 @@ disp_wait() /* wait for more input */ n = odev.ifd+1; if (sstdin != NULL) { FD_SET(fileno(sstdin), &readset); + FD_SET(fileno(sstdin), &errset); if (fileno(sstdin) >= n) n = fileno(sstdin) + 1; } @@ -173,7 +174,8 @@ disp_wait() /* wait for more input */ flgs |= RDY_SRV; if (FD_ISSET(odev.ifd, &readset) || FD_ISSET(odev.ifd, &errset)) flgs |= RDY_DEV; - if (sstdin != NULL && FD_ISSET(fileno(sstdin), &readset)) + if (sstdin != NULL && (FD_ISSET(fileno(sstdin), &readset) || + FD_ISSET(fileno(sstdin), &errset))) flgs |= RDY_SIN; return(flgs); } @@ -245,6 +247,8 @@ register VIEW *v; { static VIEW viewhist[VIEWHISTLEN]; static unsigned nhist; + VIEW *dv; + int i, res[2]; char *err; /* restore previous view? */ if (v == NULL) { @@ -264,11 +268,20 @@ again: error(COMMAND, "cannot handle parallel views"); return; } - if (!dev_view(v)) /* update display driver */ + if (!dev_view(v)) /* notify display driver */ goto again; dev_flush(); /* update screen */ - if (!beam_view(v)) /* update beam list */ - goto again; + beam_init(); /* compute new beam set */ + for (i = 0; (dv = dev_auxview(i, res)) != NULL; i++) + if (!beam_view(dv, res[0], res[1])) { + if (!nhist) { + error(COMMAND, "invalid starting view"); + return; + } + copystruct(v, viewhist + ((nhist-1)%VIEWHISTLEN)); + goto again; + } + beam_sync(0); /* update server */ /* record new view */ if (v < viewhist || v >= viewhist+VIEWHISTLEN) { copystruct(viewhist + (nhist%VIEWHISTLEN), v); @@ -281,12 +294,15 @@ int usr_input() /* get user input and process it */ { VIEW vparams; - char cmd[128]; + char cmd[256]; register char *args; register int i; - if (fgets(cmd, sizeof(cmd), sstdin) == NULL) - return(DC_QUIT); + if (fgets(cmd, sizeof(cmd), sstdin) == NULL) { + fclose(sstdin); + sstdin = NULL; + return(0); + } for (args = cmd; *args && !isspace(*args); args++) ; while (isspace(*args)) @@ -322,7 +338,7 @@ usr_input() /* get user input and process it */ /* handled in main() */ break; case DC_REDRAW: /* redraw from server */ - imm_mode = beam_sync() > 0; + imm_mode = beam_sync(1) > 0; dev_clear(); break; case DC_KILL: /* kill rtrace process(es) */