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

# User Rev Content
1 greg 1.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 greg 1.2 #ifndef BSD
24     #define bzero(d,n) (void)memset(d,0,n)
25     extern char *memset();
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     extern char *calloc(), *malloc();
38    
39 greg 2.3 static togglecurs();
40    
41 greg 1.1
42     TEXTWIND *
43 greg 2.2 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 greg 1.1 {
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 greg 2.2 t->w = XCreateSimpleWindow(dpy, parent, x, y, width, height,
60     bw, fore, back);
61 greg 1.1 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 greg 2.2
71 greg 1.1 t->gc = XCreateGC(dpy,t->w,0,NULL);
72 greg 2.2 XSetState(dpy, t->gc, fore, back, GXcopy, AllPlanes);
73 greg 1.1 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     }