ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/x11twind.c
Revision: 2.2
Committed: Fri May 29 15:25:13 1992 UTC (31 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.1: +12 -20 lines
Log Message:
fixed text and background color for 24-bit screens

File Contents

# Content
1 #ifndef lint
2 static char SCCSid[] = "$SunId$ LBL";
3 #endif
4
5 /* Copyright (c) 1989 Regents of the University of California */
6
7 /*
8 * x11twind.c - routines for X11 text windows.
9 *
10 * Written by G. Ward
11 * 10/30/87
12 *
13 * Modified for X11 by B. V. Smith
14 * 9/26/88
15 */
16
17 #include <stdio.h>
18
19 #include <X11/Xlib.h>
20
21 #include "x11twind.h"
22
23 #ifndef BSD
24 #define bzero(d,n) (void)memset(d,0,n)
25 extern char *memset();
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 extern char *calloc(), *malloc();
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 xt_puts(s, t) /* output a string */
92 register char *s;
93 TEXTWIND *t;
94 {
95 int oldcurs;
96
97 oldcurs = xt_cursor(t, TNOCURS); /* for efficiency */
98 while (*s)
99 xt_putc(*s++, t);
100 xt_cursor(t, oldcurs);
101 }
102
103
104 xt_putc(c, t) /* output a character */
105 char c;
106 register TEXTWIND *t;
107 {
108 checkcurs(t);
109 switch (c) {
110 case '\n':
111 if (t->r >= t->nr - 1)
112 xt_delete(t, 0); /* scroll up 1 line */
113 else if (t->r < t->nr - 1)
114 t->r++;
115 /* fall through */
116 case '\r':
117 t->c = 0;
118 break;
119 case '\b':
120 while (t->c < 1 && t->r > 0)
121 t->c = strlen(t->lp[--t->r]);
122 if (t->c > 0)
123 t->c--;
124 break;
125 default:
126 if (t->c >= t->nc)
127 xt_putc('\n', t);
128 XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR+t->c*Width(t->f),
129 YStart(t->f)+t->r*Height(t->f), &c, 1);
130 t->lp[t->r][t->c++] = c;
131 break;
132 }
133 restorecurs(t);
134 }
135
136
137 xt_delete(t, r) /* delete a line */
138 register TEXTWIND *t;
139 int r;
140 {
141 char *cp;
142 register int i;
143
144 if (r < 0 || r >= t->nr)
145 return;
146 checkcurs(t);
147 /* move lines */
148 XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, (r+1)*Height(t->f),
149 t->nc*Width(t->f), (t->nr-1-r)*Height(t->f),
150 LEFTMAR, r*Height(t->f));
151 cp = t->lp[r];
152 for (i = r; i < t->nr-1; i++)
153 t->lp[i] = t->lp[i+1];
154 t->lp[t->nr-1] = cp;
155 /* clear bottom */
156 XClearArea(t->dpy, t->w, LEFTMAR, (t->nr-1)*Height(t->f),
157 t->nc*Width(t->f), Height(t->f),(Bool) 0);
158
159 bzero(cp, t->nc);
160 restorecurs(t); /* should we reposition cursor? */
161 }
162
163
164 xt_insert(t, r) /* insert a line */
165 register TEXTWIND *t;
166 int r;
167 {
168 char *cp;
169 register int i;
170
171 if (r < 0 || r >= t->nr)
172 return;
173 checkcurs(t);
174 /* move lines */
175 XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, r*Height(t->f), LEFTMAR,
176 (r+1)*Height(t->f), t->nc*Width(t->f),
177 (t->nr-1-r)*Height(t->f));
178 cp = t->lp[t->nr-1];
179 for (i = t->nr-1; i > r; i--)
180 t->lp[i] = t->lp[i-1];
181 t->lp[r] = cp;
182 /* clear new line */
183 XClearArea(t->dpy, t->w, LEFTMAR, r*Height(t->f),
184 t->nc*Width(t->f), Height(t->f), (Bool) 0);
185 bzero(cp, t->nc);
186 restorecurs(t); /* should we reposition cursor? */
187 }
188
189
190 xt_redraw(t) /* redraw text window */
191 register TEXTWIND *t;
192 {
193 register int i;
194
195 XClearWindow(t->dpy, t->w);
196 for (i = 0; i < t->nr; i++)
197 if (strlen(t->lp[i]) > 0)
198 XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR,
199 YStart(t->f)+i*Height(t->f),
200 t->lp[i], strlen(t->lp[i]));
201 restorecurs(t);
202 }
203
204
205 xt_clear(t) /* clear text window */
206 register TEXTWIND *t;
207 {
208 register int i;
209
210 XClearWindow(t->dpy, t->w);
211 for (i = 0; i < t->nr; i++)
212 bzero(t->lp[i], t->nc);
213 t->r = t->c = 0;
214 restorecurs(t);
215 }
216
217
218 xt_move(t, r, c) /* move to new position */
219 register TEXTWIND *t;
220 int r, c;
221 {
222 if (r < 0 || c < 0 || r >= t->nr || c >= t->nc)
223 return;
224 checkcurs(t);
225 t->r = r;
226 t->c = c;
227 restorecurs(t);
228 }
229
230
231 int
232 xt_cursor(t, curs) /* change cursor */
233 register TEXTWIND *t;
234 register int curs;
235 {
236 register int oldcurs;
237
238 if (curs != TNOCURS && curs != TBLKCURS)
239 return(-1);
240 oldcurs = t->cursor;
241 if (curs != oldcurs)
242 togglecurs(t);
243 t->cursor = curs;
244 return(oldcurs);
245 }
246
247
248 xt_close(t) /* close text window */
249 register TEXTWIND *t;
250 {
251 register int i;
252
253 XFreeFont(t->dpy, t->f);
254 XFreeGC(t->dpy,t->gc);
255 XDestroyWindow(t->dpy, t->w);
256 for (i = 0; i < t->nr; i++)
257 free(t->lp[i]);
258 free((char *)t->lp);
259 free((char *)t);
260 }
261
262
263 static
264 togglecurs(t)
265 register TEXTWIND *t;
266 {
267 XSetFunction(t->dpy, t->gc, GXinvert);
268 XSetPlaneMask(t->dpy, t->gc, 1L);
269 XFillRectangle(t->dpy, t->w, t->gc,
270 t->c*Width(t->f)+LEFTMAR, t->r*Height(t->f),
271 Width(t->f), Height(t->f));
272 XSetFunction(t->dpy, t->gc, GXcopy);
273 XSetPlaneMask(t->dpy, t->gc, ~0L);
274 }