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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #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 /* ====================================================================
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 #include <stdio.h>
72
73 #include <stdlib.h>
74
75 #include <X11/Xlib.h>
76
77 #include "x11twind.h"
78
79 #ifndef BSD
80 #define bzero(d,n) (void)memset(d,0,n)
81 #endif
82
83 #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 static void togglecurs();
93
94
95 TEXTWIND *
96 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 {
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 t->w = XCreateSimpleWindow(dpy, parent, x, y, width, height,
113 bw, fore, back);
114 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
124 t->gc = XCreateGC(dpy,t->w,0,NULL);
125 XSetState(dpy, t->gc, fore, back, GXcopy, AllPlanes);
126 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 void
147 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 void
161 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 void
195 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 void
223 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 void
250 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 void
266 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 void
280 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 void
311 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 free((void *)t->lp);
322 free((void *)t);
323 }
324
325
326 static void
327 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 }