ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/x11twind.c
Revision: 2.3
Committed: Mon Mar 8 12:37:44 1993 UTC (31 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +2 -0 lines
Log Message:
portability fixes (removed gcc warnings)

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