ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/x11twind.c
Revision: 2.5
Committed: Sat Feb 22 02:07:29 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.4: +72 -10 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.5 static const char RCSid[] = "$Id$";
3 greg 1.1 #endif
4     /*
5     * x11twind.c - routines for X11 text windows.
6     *
7     * Written by G. Ward
8     * 10/30/87
9     *
10     * Modified for X11 by B. V. Smith
11     * 9/26/88
12     */
13    
14 greg 2.5 /* ====================================================================
15     * The Radiance Software License, Version 1.0
16     *
17     * Copyright (c) 1990 - 2002 The Regents of the University of California,
18     * through Lawrence Berkeley National Laboratory. All rights reserved.
19     *
20     * Redistribution and use in source and binary forms, with or without
21     * modification, are permitted provided that the following conditions
22     * are met:
23     *
24     * 1. Redistributions of source code must retain the above copyright
25     * notice, this list of conditions and the following disclaimer.
26     *
27     * 2. Redistributions in binary form must reproduce the above copyright
28     * notice, this list of conditions and the following disclaimer in
29     * the documentation and/or other materials provided with the
30     * distribution.
31     *
32     * 3. The end-user documentation included with the redistribution,
33     * if any, must include the following acknowledgment:
34     * "This product includes Radiance software
35     * (http://radsite.lbl.gov/)
36     * developed by the Lawrence Berkeley National Laboratory
37     * (http://www.lbl.gov/)."
38     * Alternately, this acknowledgment may appear in the software itself,
39     * if and wherever such third-party acknowledgments normally appear.
40     *
41     * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
42     * and "The Regents of the University of California" must
43     * not be used to endorse or promote products derived from this
44     * software without prior written permission. For written
45     * permission, please contact [email protected].
46     *
47     * 5. Products derived from this software may not be called "Radiance",
48     * nor may "Radiance" appear in their name, without prior written
49     * permission of Lawrence Berkeley National Laboratory.
50     *
51     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
52     * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
53     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
54     * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
55     * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
56     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
57     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
58     * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
59     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
60     * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
61     * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62     * SUCH DAMAGE.
63     * ====================================================================
64     *
65     * This software consists of voluntary contributions made by many
66     * individuals on behalf of Lawrence Berkeley National Laboratory. For more
67     * information on Lawrence Berkeley National Laboratory, please see
68     * <http://www.lbl.gov/>.
69     */
70    
71 greg 1.1 #include <stdio.h>
72    
73 greg 2.5 #include <stdlib.h>
74    
75 greg 1.1 #include <X11/Xlib.h>
76    
77     #include "x11twind.h"
78    
79 greg 1.2 #ifndef BSD
80     #define bzero(d,n) (void)memset(d,0,n)
81     #endif
82    
83 greg 1.1 #define checkcurs(t) if ((t)->cursor) togglecurs(t)
84    
85     #define restorecurs checkcurs
86    
87     /* width/height of a character in fontstruct f */
88     #define Width(f) ((f)->max_bounds.rbearing - (f)->min_bounds.lbearing)
89     #define Height(f) ((f)->ascent + (f)->descent)
90     #define YStart(f) ((f)->ascent)
91    
92 greg 2.5 static void togglecurs();
93 greg 2.3
94 greg 1.1
95     TEXTWIND *
96 greg 2.2 xt_open(dpy, parent, x, y, width, height, bw, fore, back, fontname)
97     Display *dpy;
98     Window parent;
99     int x, y;
100     int width, height;
101     int bw;
102     unsigned long fore, back;
103     char *fontname;
104 greg 1.1 {
105     register int i;
106     register TEXTWIND *t;
107    
108     if ((t = (TEXTWIND *)malloc(sizeof(TEXTWIND))) == NULL)
109     return(NULL);
110    
111     t->dpy = dpy;
112 greg 2.2 t->w = XCreateSimpleWindow(dpy, parent, x, y, width, height,
113     bw, fore, back);
114 greg 1.1 if (t->w == 0)
115     return(NULL);
116     XMapWindow(dpy, t->w);
117    
118     if ((t->f = XLoadQueryFont(dpy, fontname)) == 0)
119     return(NULL);
120    
121     /* if (!t->f.fixedwidth) check for fixedwidth later
122     return(NULL); */
123 greg 2.2
124 greg 1.1 t->gc = XCreateGC(dpy,t->w,0,NULL);
125 greg 2.2 XSetState(dpy, t->gc, fore, back, GXcopy, AllPlanes);
126 greg 1.1 XSetFont(dpy, t->gc, t->f->fid);
127    
128     t->nc = (width - LEFTMAR) /
129     Width(t->f); /* number of columns */
130     t->nr = height /
131     Height(t->f); /* number of rows */
132     if (t->nc < 1 || t->nr < 1)
133     return(NULL);
134     if ((t->lp = (char **)calloc(t->nr, sizeof(char *))) == NULL)
135     return(NULL);
136     for (i = 0; i < t->nr; i++)
137     if ((t->lp[i] = calloc(t->nc+1, 1)) == NULL)
138     return(NULL);
139     t->r = t->c = 0;
140     t->cursor = TNOCURS;
141     return(t);
142    
143     }
144    
145    
146 greg 2.5 void
147 greg 1.1 xt_puts(s, t) /* output a string */
148     register char *s;
149     TEXTWIND *t;
150     {
151     int oldcurs;
152    
153     oldcurs = xt_cursor(t, TNOCURS); /* for efficiency */
154     while (*s)
155     xt_putc(*s++, t);
156     xt_cursor(t, oldcurs);
157     }
158    
159    
160 greg 2.5 void
161 greg 1.1 xt_putc(c, t) /* output a character */
162     char c;
163     register TEXTWIND *t;
164     {
165     checkcurs(t);
166     switch (c) {
167     case '\n':
168     if (t->r >= t->nr - 1)
169     xt_delete(t, 0); /* scroll up 1 line */
170     else if (t->r < t->nr - 1)
171     t->r++;
172     /* fall through */
173     case '\r':
174     t->c = 0;
175     break;
176     case '\b':
177     while (t->c < 1 && t->r > 0)
178     t->c = strlen(t->lp[--t->r]);
179     if (t->c > 0)
180     t->c--;
181     break;
182     default:
183     if (t->c >= t->nc)
184     xt_putc('\n', t);
185     XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR+t->c*Width(t->f),
186     YStart(t->f)+t->r*Height(t->f), &c, 1);
187     t->lp[t->r][t->c++] = c;
188     break;
189     }
190     restorecurs(t);
191     }
192    
193    
194 greg 2.5 void
195 greg 1.1 xt_delete(t, r) /* delete a line */
196     register TEXTWIND *t;
197     int r;
198     {
199     char *cp;
200     register int i;
201    
202     if (r < 0 || r >= t->nr)
203     return;
204     checkcurs(t);
205     /* move lines */
206     XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, (r+1)*Height(t->f),
207     t->nc*Width(t->f), (t->nr-1-r)*Height(t->f),
208     LEFTMAR, r*Height(t->f));
209     cp = t->lp[r];
210     for (i = r; i < t->nr-1; i++)
211     t->lp[i] = t->lp[i+1];
212     t->lp[t->nr-1] = cp;
213     /* clear bottom */
214     XClearArea(t->dpy, t->w, LEFTMAR, (t->nr-1)*Height(t->f),
215     t->nc*Width(t->f), Height(t->f),(Bool) 0);
216    
217     bzero(cp, t->nc);
218     restorecurs(t); /* should we reposition cursor? */
219     }
220    
221    
222 greg 2.5 void
223 greg 1.1 xt_insert(t, r) /* insert a line */
224     register TEXTWIND *t;
225     int r;
226     {
227     char *cp;
228     register int i;
229    
230     if (r < 0 || r >= t->nr)
231     return;
232     checkcurs(t);
233     /* move lines */
234     XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, r*Height(t->f), LEFTMAR,
235     (r+1)*Height(t->f), t->nc*Width(t->f),
236     (t->nr-1-r)*Height(t->f));
237     cp = t->lp[t->nr-1];
238     for (i = t->nr-1; i > r; i--)
239     t->lp[i] = t->lp[i-1];
240     t->lp[r] = cp;
241     /* clear new line */
242     XClearArea(t->dpy, t->w, LEFTMAR, r*Height(t->f),
243     t->nc*Width(t->f), Height(t->f), (Bool) 0);
244     bzero(cp, t->nc);
245     restorecurs(t); /* should we reposition cursor? */
246     }
247    
248    
249 greg 2.5 void
250 greg 1.1 xt_redraw(t) /* redraw text window */
251     register TEXTWIND *t;
252     {
253     register int i;
254    
255     XClearWindow(t->dpy, t->w);
256     for (i = 0; i < t->nr; i++)
257     if (strlen(t->lp[i]) > 0)
258     XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR,
259     YStart(t->f)+i*Height(t->f),
260     t->lp[i], strlen(t->lp[i]));
261     restorecurs(t);
262     }
263    
264    
265 greg 2.5 void
266 greg 1.1 xt_clear(t) /* clear text window */
267     register TEXTWIND *t;
268     {
269     register int i;
270    
271     XClearWindow(t->dpy, t->w);
272     for (i = 0; i < t->nr; i++)
273     bzero(t->lp[i], t->nc);
274     t->r = t->c = 0;
275     restorecurs(t);
276     }
277    
278    
279 greg 2.5 void
280 greg 1.1 xt_move(t, r, c) /* move to new position */
281     register TEXTWIND *t;
282     int r, c;
283     {
284     if (r < 0 || c < 0 || r >= t->nr || c >= t->nc)
285     return;
286     checkcurs(t);
287     t->r = r;
288     t->c = c;
289     restorecurs(t);
290     }
291    
292    
293     int
294     xt_cursor(t, curs) /* change cursor */
295     register TEXTWIND *t;
296     register int curs;
297     {
298     register int oldcurs;
299    
300     if (curs != TNOCURS && curs != TBLKCURS)
301     return(-1);
302     oldcurs = t->cursor;
303     if (curs != oldcurs)
304     togglecurs(t);
305     t->cursor = curs;
306     return(oldcurs);
307     }
308    
309    
310 greg 2.5 void
311 greg 1.1 xt_close(t) /* close text window */
312     register TEXTWIND *t;
313     {
314     register int i;
315    
316     XFreeFont(t->dpy, t->f);
317     XFreeGC(t->dpy,t->gc);
318     XDestroyWindow(t->dpy, t->w);
319     for (i = 0; i < t->nr; i++)
320     free(t->lp[i]);
321 greg 2.5 free((void *)t->lp);
322     free((void *)t);
323 greg 1.1 }
324    
325    
326 greg 2.5 static void
327 greg 1.1 togglecurs(t)
328     register TEXTWIND *t;
329     {
330     XSetFunction(t->dpy, t->gc, GXinvert);
331     XSetPlaneMask(t->dpy, t->gc, 1L);
332     XFillRectangle(t->dpy, t->w, t->gc,
333     t->c*Width(t->f)+LEFTMAR, t->r*Height(t->f),
334     Width(t->f), Height(t->f));
335     XSetFunction(t->dpy, t->gc, GXcopy);
336     XSetPlaneMask(t->dpy, t->gc, ~0L);
337     }