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

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.5 static const char RCSid[] = "$Id$";
3 greg 1.1 #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 greg 2.6 #include "copyright.h"
15 greg 2.5
16 greg 1.1 #include <stdio.h>
17    
18 greg 2.5 #include <stdlib.h>
19    
20 greg 1.1 #include <X11/Xlib.h>
21    
22     #include "x11twind.h"
23    
24 greg 1.2 #ifndef BSD
25     #define bzero(d,n) (void)memset(d,0,n)
26     #endif
27    
28 greg 1.1 #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 greg 2.5 static void togglecurs();
38 greg 2.3
39 greg 1.1
40     TEXTWIND *
41 greg 2.2 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 greg 1.1 {
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 greg 2.2 t->w = XCreateSimpleWindow(dpy, parent, x, y, width, height,
58     bw, fore, back);
59 greg 1.1 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 greg 2.2
69 greg 1.1 t->gc = XCreateGC(dpy,t->w,0,NULL);
70 greg 2.2 XSetState(dpy, t->gc, fore, back, GXcopy, AllPlanes);
71 greg 1.1 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 greg 2.5 void
92 greg 1.1 xt_putc(c, t) /* output a character */
93 greg 2.7 int c;
94 greg 1.1 register TEXTWIND *t;
95     {
96 greg 2.8 char ch[2];
97    
98 greg 1.1 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 greg 2.8 ch[0] = c; ch[1] = '\0';
119 greg 1.1 XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR+t->c*Width(t->f),
120 greg 2.8 YStart(t->f)+t->r*Height(t->f), ch, 1);
121 greg 1.1 t->lp[t->r][t->c++] = c;
122     break;
123     }
124     restorecurs(t);
125 greg 2.7 }
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 greg 1.1 }
140    
141    
142 greg 2.5 void
143 greg 1.1 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 greg 2.5 void
171 greg 1.1 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 greg 2.5 void
198 greg 1.1 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 greg 2.5 void
214 greg 1.1 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 greg 2.5 void
228 greg 1.1 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 greg 2.5 void
259 greg 1.1 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 greg 2.5 free((void *)t->lp);
270     free((void *)t);
271 greg 1.1 }
272    
273    
274 greg 2.5 static void
275 greg 1.1 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     }