ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/x11twind.c
Revision: 2.4
Committed: Wed Jun 17 13:34:10 1998 UTC (25 years, 10 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 2.3: +0 -1 lines
Log Message:
got rid of problematic memset() declaration

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