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

# 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     #endif
26    
27 greg 1.1 #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 greg 2.3 static togglecurs();
39    
40 greg 1.1
41     TEXTWIND *
42 greg 2.2 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 greg 1.1 {
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 greg 2.2 t->w = XCreateSimpleWindow(dpy, parent, x, y, width, height,
59     bw, fore, back);
60 greg 1.1 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 greg 2.2
70 greg 1.1 t->gc = XCreateGC(dpy,t->w,0,NULL);
71 greg 2.2 XSetState(dpy, t->gc, fore, back, GXcopy, AllPlanes);
72 greg 1.1 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     }