--- ray/src/rt/x11.c 1993/03/08 12:51:45 2.11 +++ ray/src/rt/x11.c 1994/10/03 11:01:23 2.19 @@ -11,8 +11,9 @@ static char SCCSid[] = "$SunId$ LBL"; */ #include - +#include #include +#include #include #include @@ -58,6 +59,7 @@ static Cursor pickcursor = 0; /* cursor used for pic static int gwidth, gheight; /* graphics window size */ +static int comheight; /* desired comline height */ static TEXTWIND *comline = NULL; /* our command line */ static char c_queue[64]; /* input queue */ @@ -68,18 +70,26 @@ static GC ourgc = 0; /* our graphics context for dr static Colormap ourmap = 0; /* our color map */ +#define IC_X11 0 +#define IC_IOCTL 1 +#define IC_READ 2 + +static int inpcheck; /* whence to check input */ + extern char *malloc(), *getcombuf(); static int x11_close(), x11_clear(), x11_paintr(), x11_errout(), x11_getcur(), x11_comout(), x11_comin(), x11_flush(); +static int std_comin(), std_comout(); + static struct driver x11_driver = { x11_close, x11_clear, x11_paintr, x11_getcur, - x11_comout, x11_comin, x11_flush, 1.0 + NULL, NULL, x11_flush, 1.0 }; -static int getpixels(), xnewcolr(), freepixels(), - getevent(), getkey(), fixwindow(); +static int getpixels(), xnewcolr(), freepixels(), resizewindow(), + getevent(), getkey(), fixwindow(), x11_getc(); static unsigned long true_pixel(); @@ -93,7 +103,7 @@ char *name, *id; XSetWindowAttributes ourwinattr; XWMHints ourxwmhints; XSizeHints oursizhints; - + /* open display server */ ourdisplay = XOpenDisplay(NULL); if (ourdisplay == NULL) { stderr_v("cannot open X-windows; DISPLAY variable set?\n"); @@ -125,10 +135,16 @@ char *name, *id; ourwhite = WhitePixel(ourdisplay,ourscreen); } /* set gamma */ - if ((gv = getenv("GAMMA")) != NULL) + if ((gv = XGetDefault(ourdisplay, "radiance", "gamma")) != NULL + || (gv = getenv("DISPLAY_GAMMA")) != NULL) make_gmap(atof(gv)); else make_gmap(GAMMA); + /* X11 command line or no? */ + if (!strcmp(name, "x11")) + comheight = COMHEIGHT; + else /* "x11d" */ + comheight = 0; /* open window */ ourwinattr.background_pixel = ourblack; ourwinattr.border_pixel = ourblack; @@ -154,21 +170,32 @@ char *name, *id; gwind, x11icon_bits, x11icon_width, x11icon_height); XSetWMHints(ourdisplay, gwind, &ourxwmhints); oursizhints.min_width = MINWIDTH; - oursizhints.min_height = MINHEIGHT+COMHEIGHT; + oursizhints.min_height = MINHEIGHT+comheight; oursizhints.flags = PMinSize; XSetNormalHints(ourdisplay, gwind, &oursizhints); XSelectInput(ourdisplay, gwind, ExposureMask); XMapWindow(ourdisplay, gwind); XWindowEvent(ourdisplay, gwind, ExposureMask, levptr(XEvent)); gwidth = levptr(XExposeEvent)->width; - gheight = levptr(XExposeEvent)->height - COMHEIGHT; + gheight = levptr(XExposeEvent)->height - comheight; x11_driver.xsiz = gwidth < MINWIDTH ? MINWIDTH : gwidth; x11_driver.ysiz = gheight < MINHEIGHT ? MINHEIGHT : gheight; x11_driver.inpready = 0; mapped = 1; - cmdvec = x11_comout; /* set error vectors */ - if (wrnvec != NULL) - wrnvec = x11_errout; + /* set i/o vectors */ + if (comheight) { + x11_driver.comin = x11_comin; + x11_driver.comout = x11_comout; + cmdvec = x11_comout; + if (wrnvec != NULL) + wrnvec = x11_errout; + inpcheck = IC_X11; + } else { + x11_driver.comin = std_comin; + x11_driver.comout = std_comout; + cmdvec = std_comout; + inpcheck = IC_IOCTL; + } return(&x11_driver); } @@ -208,7 +235,7 @@ int xres, yres; /* resize window */ if (xres != gwidth || yres != gheight) { XSelectInput(ourdisplay, gwind, 0); - XResizeWindow(ourdisplay, gwind, xres, yres+COMHEIGHT); + XResizeWindow(ourdisplay, gwind, xres, yres+comheight); gwidth = xres; gheight = yres; XFlush(ourdisplay); @@ -225,16 +252,20 @@ int xres, yres; /* get new command line */ if (comline != NULL) xt_close(comline); - comline = xt_open(ourdisplay, gwind, 0, gheight, - gwidth, COMHEIGHT, 0, ourblack, ourwhite, COMFN); - if (comline == NULL) { - stderr_v("Cannot open command line window\n"); - quit(1); - } - XSelectInput(ourdisplay, comline->w, ExposureMask); + if (comheight) { + comline = xt_open(ourdisplay, gwind, 0, gheight, gwidth, + comheight, 0, ourblack, ourwhite, COMFN); + if (comline == NULL) { + stderr_v("Cannot open command line window\n"); + quit(1); + } + XSelectInput(ourdisplay, comline->w, ExposureMask); /* remove earmuffs */ - XSelectInput(ourdisplay, gwind, + XSelectInput(ourdisplay, gwind, StructureNotifyMask|ExposureMask|KeyPressMask|ButtonPressMask); + } else /* remove earmuffs */ + XSelectInput(ourdisplay, gwind, + StructureNotifyMask|ExposureMask|ButtonPressMask); } @@ -260,9 +291,30 @@ int xmin, ymin, xmax, ymax; static x11_flush() /* flush output */ { + char buf[256]; + int n; + /* check for input */ XNoOp(ourdisplay); - while (XPending(ourdisplay) > 0) + n = XPending(ourdisplay); /* from X server */ + while (n-- > 0) getevent(); + if (inpcheck == IC_IOCTL) { /* from stdin */ + if (ioctl(fileno(stdin), FIONREAD, &n) < 0) { + if (fcntl(fileno(stdin), F_SETFL, FNDELAY) < 0) { + stderr_v("Cannot change input mode\n"); + quit(1); + } + inpcheck = IC_READ; + } else + x11_driver.inpready += n; + } + if (inpcheck == IC_READ) { + n = read(fileno(stdin), buf, sizeof(buf)-1); + if (n > 0) { + buf[n] = '\0'; + strcpy(getcombuf(&x11_driver), buf); + } + } } @@ -270,13 +322,12 @@ static x11_comin(inp, prompt) /* read in a command line */ char *inp, *prompt; { - extern int x11_getc(); - - if (prompt != NULL) + if (prompt != NULL) { + x11_flush(); /* make sure we get everything */ if (fromcombuf(inp, &x11_driver)) return; - else - xt_puts(prompt, comline); + xt_puts(prompt, comline); + } xt_cursor(comline, TBLKCURS); editline(inp, x11_getc, x11_comout); xt_cursor(comline, TNOCURS); @@ -284,13 +335,13 @@ char *inp, *prompt; static -x11_comout(out) /* output a string to command line */ -char *out; +x11_comout(outp) /* output a string to command line */ +char *outp; { if (comline == NULL) return; - xt_puts(out, comline); - if (out[strlen(out)-1] == '\n') + xt_puts(outp, comline); + if (outp[strlen(outp)-1] == '\n') XFlush(ourdisplay); } @@ -304,6 +355,36 @@ char *msg; } +static +std_comin(inp, prompt) /* read in command line from stdin */ +char *inp, *prompt; +{ + extern char *gets(); + + if (prompt != NULL) { + if (fromcombuf(inp, &x11_driver)) + return; + if (!x11_driver.inpready) + fputs(prompt, stdout); + } + if (gets(inp) == NULL) { + strcpy(inp, "quit"); + return; + } + x11_driver.inpready -= strlen(inp) + 1; + if (x11_driver.inpready < 0) + x11_driver.inpready = 0; +} + + +static +std_comout(outp) /* write out string to stdout */ +char *outp; +{ + fputs(outp, stdout); +} + + static int x11_getcur(xp, yp) /* get cursor position */ int *xp, *yp; @@ -509,11 +590,11 @@ static resizewindow(ersz) /* resize window */ register XConfigureEvent *ersz; { - if (ersz->width == gwidth && ersz->height-COMHEIGHT == gheight) + if (ersz->width == gwidth && ersz->height-comheight == gheight) return; gwidth = ersz->width; - gheight = ersz->height-COMHEIGHT; + gheight = ersz->height-comheight; x11_driver.xsiz = gwidth < MINWIDTH ? MINWIDTH : gwidth; x11_driver.ysiz = gheight < MINHEIGHT ? MINHEIGHT : gheight;