ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/x11twind.c
Revision: 2.8
Committed: Fri Apr 11 19:32:00 2003 UTC (21 years ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.7: +4 -1 lines
Log Message:
Better fix for HP-UX

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 #include "copyright.h"
15
16 #include <stdio.h>
17
18 #include <stdlib.h>
19
20 #include <X11/Xlib.h>
21
22 #include "x11twind.h"
23
24 #ifndef BSD
25 #define bzero(d,n) (void)memset(d,0,n)
26 #endif
27
28 #define checkcurs(t) if ((t)->cursor) togglecurs(t)
29
30 #define restorecurs checkcurs
31
32 /* width/height of a character in fontstruct f */
33 #define Width(f) ((f)->max_bounds.rbearing - (f)->min_bounds.lbearing)
34 #define Height(f) ((f)->ascent + (f)->descent)
35 #define YStart(f) ((f)->ascent)
36
37 static void togglecurs();
38
39
40 TEXTWIND *
41 xt_open(dpy, parent, x, y, width, height, bw, fore, back, fontname)
42 Display *dpy;
43 Window parent;
44 int x, y;
45 int width, height;
46 int bw;
47 unsigned long fore, back;
48 char *fontname;
49 {
50 register int i;
51 register TEXTWIND *t;
52
53 if ((t = (TEXTWIND *)malloc(sizeof(TEXTWIND))) == NULL)
54 return(NULL);
55
56 t->dpy = dpy;
57 t->w = XCreateSimpleWindow(dpy, parent, x, y, width, height,
58 bw, fore, back);
59 if (t->w == 0)
60 return(NULL);
61 XMapWindow(dpy, t->w);
62
63 if ((t->f = XLoadQueryFont(dpy, fontname)) == 0)
64 return(NULL);
65
66 /* if (!t->f.fixedwidth) check for fixedwidth later
67 return(NULL); */
68
69 t->gc = XCreateGC(dpy,t->w,0,NULL);
70 XSetState(dpy, t->gc, fore, back, GXcopy, AllPlanes);
71 XSetFont(dpy, t->gc, t->f->fid);
72
73 t->nc = (width - LEFTMAR) /
74 Width(t->f); /* number of columns */
75 t->nr = height /
76 Height(t->f); /* number of rows */
77 if (t->nc < 1 || t->nr < 1)
78 return(NULL);
79 if ((t->lp = (char **)calloc(t->nr, sizeof(char *))) == NULL)
80 return(NULL);
81 for (i = 0; i < t->nr; i++)
82 if ((t->lp[i] = calloc(t->nc+1, 1)) == NULL)
83 return(NULL);
84 t->r = t->c = 0;
85 t->cursor = TNOCURS;
86 return(t);
87
88 }
89
90
91 void
92 xt_putc(c, t) /* output a character */
93 int c;
94 register TEXTWIND *t;
95 {
96 char ch[2];
97
98 checkcurs(t);
99 switch (c) {
100 case '\n':
101 if (t->r >= t->nr - 1)
102 xt_delete(t, 0); /* scroll up 1 line */
103 else if (t->r < t->nr - 1)
104 t->r++;
105 /* fall through */
106 case '\r':
107 t->c = 0;
108 break;
109 case '\b':
110 while (t->c < 1 && t->r > 0)
111 t->c = strlen(t->lp[--t->r]);
112 if (t->c > 0)
113 t->c--;
114 break;
115 default:
116 if (t->c >= t->nc)
117 xt_putc('\n', t);
118 ch[0] = c; ch[1] = '\0';
119 XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR+t->c*Width(t->f),
120 YStart(t->f)+t->r*Height(t->f), ch, 1);
121 t->lp[t->r][t->c++] = c;
122 break;
123 }
124 restorecurs(t);
125 }
126
127
128 void
129 xt_puts(s, t) /* output a string */
130 register char *s;
131 TEXTWIND *t;
132 {
133 int oldcurs;
134
135 oldcurs = xt_cursor(t, TNOCURS); /* for efficiency */
136 while (*s)
137 xt_putc(*s++, t);
138 xt_cursor(t, oldcurs);
139 }
140
141
142 void
143 xt_delete(t, r) /* delete a line */
144 register TEXTWIND *t;
145 int r;
146 {
147 char *cp;
148 register int i;
149
150 if (r < 0 || r >= t->nr)
151 return;
152 checkcurs(t);
153 /* move lines */
154 XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, (r+1)*Height(t->f),
155 t->nc*Width(t->f), (t->nr-1-r)*Height(t->f),
156 LEFTMAR, r*Height(t->f));
157 cp = t->lp[r];
158 for (i = r; i < t->nr-1; i++)
159 t->lp[i] = t->lp[i+1];
160 t->lp[t->nr-1] = cp;
161 /* clear bottom */
162 XClearArea(t->dpy, t->w, LEFTMAR, (t->nr-1)*Height(t->f),
163 t->nc*Width(t->f), Height(t->f),(Bool) 0);
164
165 bzero(cp, t->nc);
166 restorecurs(t); /* should we reposition cursor? */
167 }
168
169
170 void
171 xt_insert(t, r) /* insert a line */
172 register TEXTWIND *t;
173 int r;
174 {
175 char *cp;
176 register int i;
177
178 if (r < 0 || r >= t->nr)
179 return;
180 checkcurs(t);
181 /* move lines */
182 XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, r*Height(t->f), LEFTMAR,
183 (r+1)*Height(t->f), t->nc*Width(t->f),
184 (t->nr-1-r)*Height(t->f));
185 cp = t->lp[t->nr-1];
186 for (i = t->nr-1; i > r; i--)
187 t->lp[i] = t->lp[i-1];
188 t->lp[r] = cp;
189 /* clear new line */
190 XClearArea(t->dpy, t->w, LEFTMAR, r*Height(t->f),
191 t->nc*Width(t->f), Height(t->f), (Bool) 0);
192 bzero(cp, t->nc);
193 restorecurs(t); /* should we reposition cursor? */
194 }
195
196
197 void
198 xt_redraw(t) /* redraw text window */
199 register TEXTWIND *t;
200 {
201 register int i;
202
203 XClearWindow(t->dpy, t->w);
204 for (i = 0; i < t->nr; i++)
205 if (strlen(t->lp[i]) > 0)
206 XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR,
207 YStart(t->f)+i*Height(t->f),
208 t->lp[i], strlen(t->lp[i]));
209 restorecurs(t);
210 }
211
212
213 void
214 xt_clear(t) /* clear text window */
215 register TEXTWIND *t;
216 {
217 register int i;
218
219 XClearWindow(t->dpy, t->w);
220 for (i = 0; i < t->nr; i++)
221 bzero(t->lp[i], t->nc);
222 t->r = t->c = 0;
223 restorecurs(t);
224 }
225
226
227 void
228 xt_move(t, r, c) /* move to new position */
229 register TEXTWIND *t;
230 int r, c;
231 {
232 if (r < 0 || c < 0 || r >= t->nr || c >= t->nc)
233 return;
234 checkcurs(t);
235 t->r = r;
236 t->c = c;
237 restorecurs(t);
238 }
239
240
241 int
242 xt_cursor(t, curs) /* change cursor */
243 register TEXTWIND *t;
244 register int curs;
245 {
246 register int oldcurs;
247
248 if (curs != TNOCURS && curs != TBLKCURS)
249 return(-1);
250 oldcurs = t->cursor;
251 if (curs != oldcurs)
252 togglecurs(t);
253 t->cursor = curs;
254 return(oldcurs);
255 }
256
257
258 void
259 xt_close(t) /* close text window */
260 register TEXTWIND *t;
261 {
262 register int i;
263
264 XFreeFont(t->dpy, t->f);
265 XFreeGC(t->dpy,t->gc);
266 XDestroyWindow(t->dpy, t->w);
267 for (i = 0; i < t->nr; i++)
268 free(t->lp[i]);
269 free((void *)t->lp);
270 free((void *)t);
271 }
272
273
274 static void
275 togglecurs(t)
276 register TEXTWIND *t;
277 {
278 XSetFunction(t->dpy, t->gc, GXinvert);
279 XSetPlaneMask(t->dpy, t->gc, 1L);
280 XFillRectangle(t->dpy, t->w, t->gc,
281 t->c*Width(t->f)+LEFTMAR, t->r*Height(t->f),
282 Width(t->f), Height(t->f));
283 XSetFunction(t->dpy, t->gc, GXcopy);
284 XSetPlaneMask(t->dpy, t->gc, ~0L);
285 }