ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/sundev.c
Revision: 2.5
Committed: Wed Oct 26 10:04:20 1994 UTC (30 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.4: +1 -1 lines
Log Message:
changed getcombuf() to tocombuf() for multiple commands

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1988 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * sundev.c - standalone driver for Sunwindows.
9     *
10     * 10/3/88
11     */
12    
13     #include <stdio.h>
14 greg 2.3 #include <math.h>
15 greg 1.1 #include <fcntl.h>
16     #include <suntool/sunview.h>
17     #include <suntool/canvas.h>
18     #include <suntool/tty.h>
19    
20     #include "color.h"
21    
22     #include "driver.h"
23    
24     short icon_image[] = {
25     #include "suntools.icon"
26     };
27     DEFINE_ICON_FROM_IMAGE(sun_icon, icon_image);
28    
29     #ifndef TTYPROG
30     #define TTYPROG "sun.com" /* tty program */
31     #endif
32    
33 greg 1.4 #define GAMMA 2.2 /* exponent for color correction */
34 greg 1.1
35     #define COMLH 3 /* number of command lines */
36    
37     #define FIRSTCOLOR 2 /* first usable entry */
38 greg 1.5 #define NCOLORS 251 /* number of usable colors */
39 greg 1.1
40 greg 1.14 #define CWIDTH 1100 /* starting canvas width */
41     #define CHEIGHT 800 /* starting canvas height */
42    
43 greg 1.17 static int sun_close(), sun_clear(), sun_paintr(), sun_getcur(),
44 greg 1.1 sun_comout(), sun_comin();
45    
46 greg 1.8 static struct driver sun_driver = {
47     sun_close, sun_clear, sun_paintr,
48     sun_getcur, sun_comout, sun_comin,
49 greg 1.14 NULL, 1.0, CWIDTH, CHEIGHT
50 greg 1.1 };
51    
52 greg 1.8 static FILE *ttyin;
53 greg 1.1
54 greg 1.8 static Frame frame = 0;
55     static Tty tty = 0;
56     static Canvas canvas = 0;
57 greg 1.1
58 greg 1.8 static int xres = 0, yres = 0;
59 greg 1.1
60 greg 1.8 extern char *progname;
61 greg 1.1
62    
63 greg 1.8 struct driver *
64 greg 1.12 sun_init(name, id) /* initialize SunView */
65 greg 1.8 char *name, *id;
66 greg 1.1 {
67 greg 1.15 extern Notify_value newinput(), my_destroy_func();
68 greg 1.14 extern int canvas_resize();
69 greg 2.2 extern char *getenv();
70     char *gv;
71 greg 1.12 char *ttyargv[3], arg1[16];
72 greg 1.1 int pd[2];
73     int com;
74    
75     frame = window_create(0, FRAME,
76 greg 1.8 FRAME_LABEL, id==NULL ? name : id,
77 greg 1.1 FRAME_ICON, &sun_icon,
78     WIN_X, 0, WIN_Y, 0,
79     0);
80 greg 1.8 if (frame == 0) {
81     stderr_v("cannot create frame\n");
82     return(NULL);
83     }
84     if (pipe(pd) == -1) {
85     stderr_v("cannot create pipe\n");
86     return(NULL);
87     }
88 greg 1.12 sprintf(arg1, "%d", pd[1]);
89 greg 1.1 ttyargv[0] = TTYPROG;
90     ttyargv[1] = arg1;
91 greg 1.12 ttyargv[2] = NULL;
92 greg 1.1 #ifdef BSD
93     fcntl(pd[0], F_SETFD, 1);
94     #endif
95     tty = window_create(frame, TTY,
96     TTY_ARGV, ttyargv,
97     WIN_ROWS, COMLH,
98 greg 1.8 TTY_QUIT_ON_CHILD_DEATH, TRUE,
99 greg 1.1 0);
100 greg 1.8 if (tty == 0) {
101     stderr_v("cannot create tty subwindow\n");
102     return(NULL);
103     }
104 greg 1.1 close(pd[1]);
105 greg 1.8 if ((ttyin = fdopen(pd[0], "r")) == NULL) {
106     stderr_v("cannot open tty\n");
107     return(NULL);
108     }
109 greg 1.12 notify_set_input_func(sun_init, newinput, pd[0]);
110 greg 1.1 canvas = window_create(frame, CANVAS,
111     CANVAS_RETAINED, FALSE,
112 greg 1.14 CANVAS_RESIZE_PROC, canvas_resize,
113 greg 1.1 WIN_INPUT_DESIGNEE, window_get(tty,WIN_DEVICE_NUMBER),
114     WIN_CONSUME_PICK_EVENTS, WIN_NO_EVENTS,
115     MS_LEFT, MS_MIDDLE, MS_RIGHT, 0,
116     0);
117 greg 1.8 if (canvas == 0) {
118     stderr_v("cannot create canvas\n");
119     return(NULL);
120     }
121     if (getmap() < 0) {
122     stderr_v("not a color screen\n");
123     return(NULL);
124     }
125 greg 2.4 if ((gv = getenv("DISPLAY_GAMMA")) != NULL)
126 greg 2.2 make_gmap(atof(gv));
127     else
128     make_gmap(GAMMA);
129 greg 1.1 window_set(canvas, CANVAS_RETAINED, TRUE, 0);
130    
131 greg 1.15 notify_interpose_destroy_func(frame, my_destroy_func);
132 greg 1.8 sun_driver.inpready = 0;
133     return(&sun_driver);
134 greg 1.1 }
135    
136    
137 greg 1.12 static
138 greg 1.8 sun_close() /* all done */
139 greg 1.1 {
140 greg 1.16 Frame fr;
141    
142     fr = frame;
143     frame = 0; /* death cry */
144     if (fr != 0) {
145     window_set(fr, FRAME_NO_CONFIRM, TRUE, 0);
146     window_destroy(fr);
147 greg 1.1 }
148     }
149    
150    
151 greg 1.12 static Notify_value
152 greg 1.16 my_destroy_func(fr, st) /* say bye-bye */
153     Frame fr;
154     Destroy_status st;
155     {
156     if (st != DESTROY_CHECKING && frame != 0)
157     quit(1); /* how rude! */
158     return(notify_next_destroy_func(fr, st));
159     }
160    
161    
162     static Notify_value
163 greg 1.12 newinput(cid, fd) /* register new input */
164     int (*cid)();
165     int fd;
166     {
167     notify_set_input_func(sun_init, NOTIFY_FUNC_NULL, fd);
168     getc(ttyin);
169     sun_driver.inpready++;
170     return(NOTIFY_DONE);
171 greg 1.15 }
172    
173    
174 greg 1.12 static
175 greg 1.14 canvas_resize(canvas, width, height) /* canvas being resized */
176     Canvas canvas;
177     int width, height;
178     {
179 greg 1.15 if (width == xres && height == yres)
180 greg 1.14 return;
181 greg 1.15 sun_driver.xsiz = width;
182     sun_driver.ysiz = height;
183 greg 2.5 tocombuf("new\n", &sun_driver);
184 greg 1.14 }
185    
186    
187     static
188 greg 1.8 sun_clear(nwidth, nheight) /* clear our canvas */
189     int nwidth, nheight;
190 greg 1.1 {
191     register Pixwin *pw;
192    
193     pw = canvas_pixwin(canvas);
194     if (nwidth != xres || nheight != yres) {
195 greg 1.15 xres = nwidth;
196     yres = nheight;
197     window_set(frame, WIN_SHOW, FALSE, 0);
198 greg 1.1 window_set(canvas, WIN_WIDTH, nwidth, WIN_HEIGHT, nheight, 0);
199     window_fit(frame);
200     window_set(frame, WIN_SHOW, TRUE, 0);
201     notify_do_dispatch();
202     }
203     pw_writebackground(pw, 0, 0, xres, xres, PIX_SRC);
204 greg 1.6 new_ctab(NCOLORS);
205 greg 1.1 }
206    
207    
208 greg 1.12 static
209 greg 1.8 sun_paintr(col, xmin, ymin, xmax, ymax) /* fill a rectangle */
210     COLOR col;
211     int xmin, ymin, xmax, ymax;
212 greg 1.1 {
213 greg 1.6 extern int newcolr();
214 greg 1.1 int pval;
215     register Pixwin *pw;
216    
217 greg 1.6 pval = get_pixel(col, newcolr) + FIRSTCOLOR;
218 greg 1.1 pw = canvas_pixwin(canvas);
219     pw_rop(pw, xmin, yres-ymax, xmax-xmin, ymax-ymin,
220     PIX_SRC|PIX_COLOR(pval), NULL, 0, 0);
221     }
222    
223    
224 greg 1.12 static
225 greg 1.10 sun_comin(buf, prompt) /* input a string from the command line */
226     char *buf, *prompt;
227 greg 1.1 {
228 greg 1.14 extern Notify_value newinput();
229     /* check command buffer */
230 greg 1.10 if (prompt != NULL)
231 greg 1.14 if (fromcombuf(buf, &sun_driver))
232     return;
233     else
234     sun_comout(prompt);
235 greg 1.13 /* await signal */
236     if (sun_driver.inpready <= 0)
237     newinput(sun_init, fileno(ttyin));
238 greg 1.1 /* echo characters */
239     do {
240     mygets(buf, ttyin);
241 greg 1.8 sun_comout(buf);
242 greg 1.1 } while (buf[0]);
243     /* get result */
244     mygets(buf, ttyin);
245 greg 1.12
246     if (sun_driver.inpready > 0)
247     sun_driver.inpready--;
248 greg 1.13 /* reinstall handler */
249 greg 1.12 notify_set_input_func(sun_init, newinput, fileno(ttyin));
250 greg 1.1 }
251    
252    
253 greg 1.12 static int
254 greg 1.8 sun_getcur(xpp, ypp) /* get cursor position */
255     int *xpp, *ypp;
256 greg 1.1 {
257 greg 1.3 Event ev;
258 greg 1.1 int c;
259    
260     notify_no_dispatch(); /* allow read to block */
261     window_set(canvas, WIN_CONSUME_KBD_EVENT, WIN_ASCII_EVENTS, 0);
262 greg 1.3 again:
263     if (window_read_event(canvas, &ev) == -1) {
264     notify_perror();
265 greg 1.8 stderr_v("window event read error\n");
266     quit(1);
267 greg 1.3 }
268     c = event_id(&ev);
269     switch (c) {
270     case MS_LEFT:
271     c = MB1;
272 greg 1.1 break;
273 greg 1.3 case MS_MIDDLE:
274     c = MB2;
275     break;
276     case MS_RIGHT:
277     c = MB3;
278     break;
279     default:
280     if (c < ASCII_FIRST || c > ASCII_LAST)
281     goto again;
282     break;
283 greg 1.1 }
284 greg 1.8 *xpp = event_x(&ev);
285     *ypp = yres-1 - event_y(&ev);
286 greg 1.3
287 greg 1.1 window_set(canvas, WIN_IGNORE_KBD_EVENT, WIN_ASCII_EVENTS, 0);
288     notify_do_dispatch();
289 greg 1.8 return(c);
290 greg 1.1 }
291    
292    
293 greg 1.12 static
294 greg 1.8 sun_comout(s) /* put string out to tty subwindow */
295 greg 1.1 register char *s;
296     {
297     char buf[256];
298     register char *cp;
299    
300     for (cp = buf; *s; s++) {
301     if (*s == '\n')
302     *cp++ = '\r';
303     *cp++ = *s;
304     }
305 greg 1.8 /* must be a single call */
306 greg 1.1 ttysw_output(tty, buf, cp-buf);
307     }
308    
309    
310 greg 1.12 static
311 greg 1.4 getmap() /* allocate color map segments */
312 greg 1.1 {
313 greg 1.4 char cmsname[20];
314 greg 1.5 unsigned char red[256], green[256], blue[256];
315 greg 1.1 register Pixwin *pw;
316 greg 1.5 register int i;
317    
318     for (i = 0; i < 256; i++)
319     red[i] = green[i] = blue[i] = 128;
320     red[0] = green[0] = blue[0] = 255;
321     red[1] = green[1] = blue[1] = 0;
322     red[255] = green[255] = blue[255] = 0;
323     red[254] = green[254] = blue[254] = 255;
324     red[253] = green[253] = blue[253] = 0;
325 greg 1.4 /* name shared segment */
326     sprintf(cmsname, "rv%d", getpid());
327     /* set canvas */
328 greg 1.1 pw = canvas_pixwin(canvas);
329 greg 1.4 if (pw->pw_pixrect->pr_depth < 8)
330     return(-1);
331     pw_setcmsname(pw, cmsname);
332 greg 1.5 pw_putcolormap(pw, 0, 256, red, green, blue);
333 greg 1.4 /* set tty subwindow */
334 greg 1.1 pw = (Pixwin *)window_get(tty, WIN_PIXWIN);
335 greg 1.4 pw_setcmsname(pw, cmsname);
336 greg 1.5 pw_putcolormap(pw, 0, 256, red, green, blue);
337 greg 1.4 /* set frame */
338     pw = (Pixwin *)window_get(frame, WIN_PIXWIN);
339     pw_setcmsname(pw, cmsname);
340 greg 1.5 pw_putcolormap(pw, 0, 256, red, green, blue);
341 greg 1.1
342 greg 1.4 return(0);
343 greg 1.1 }
344    
345    
346 greg 1.12 static
347 greg 1.5 newcolr(ndx, r, g, b) /* enter a color into hardware table */
348     int ndx;
349     unsigned char r, g, b;
350 greg 1.1 {
351     register Pixwin *pw;
352 greg 1.5
353 greg 1.1 pw = canvas_pixwin(canvas);
354 greg 1.5 pw_putcolormap(pw, ndx+FIRSTCOLOR, 1,
355     &r, &g, &b);
356 greg 1.1 pw = (Pixwin *)window_get(tty, WIN_PIXWIN);
357 greg 1.5 pw_putcolormap(pw, ndx+FIRSTCOLOR, 1,
358     &r, &g, &b);
359 greg 1.1 }