ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/x11twind.c
Revision: 2.2
Committed: Fri May 29 15:25:13 1992 UTC (31 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.1: +12 -20 lines
Log Message:
fixed text and background color for 24-bit screens

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    
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     xt_puts(s, t) /* output a string */
92     register char *s;
93     TEXTWIND *t;
94     {
95     int oldcurs;
96    
97     oldcurs = xt_cursor(t, TNOCURS); /* for efficiency */
98     while (*s)
99     xt_putc(*s++, t);
100     xt_cursor(t, oldcurs);
101     }
102    
103    
104     xt_putc(c, t) /* output a character */
105     char c;
106     register TEXTWIND *t;
107     {
108     checkcurs(t);
109     switch (c) {
110     case '\n':
111     if (t->r >= t->nr - 1)
112     xt_delete(t, 0); /* scroll up 1 line */
113     else if (t->r < t->nr - 1)
114     t->r++;
115     /* fall through */
116     case '\r':
117     t->c = 0;
118     break;
119     case '\b':
120     while (t->c < 1 && t->r > 0)
121     t->c = strlen(t->lp[--t->r]);
122     if (t->c > 0)
123     t->c--;
124     break;
125     default:
126     if (t->c >= t->nc)
127     xt_putc('\n', t);
128     XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR+t->c*Width(t->f),
129     YStart(t->f)+t->r*Height(t->f), &c, 1);
130     t->lp[t->r][t->c++] = c;
131     break;
132     }
133     restorecurs(t);
134     }
135    
136    
137     xt_delete(t, r) /* delete a line */
138     register TEXTWIND *t;
139     int r;
140     {
141     char *cp;
142     register int i;
143    
144     if (r < 0 || r >= t->nr)
145     return;
146     checkcurs(t);
147     /* move lines */
148     XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, (r+1)*Height(t->f),
149     t->nc*Width(t->f), (t->nr-1-r)*Height(t->f),
150     LEFTMAR, r*Height(t->f));
151     cp = t->lp[r];
152     for (i = r; i < t->nr-1; i++)
153     t->lp[i] = t->lp[i+1];
154     t->lp[t->nr-1] = cp;
155     /* clear bottom */
156     XClearArea(t->dpy, t->w, LEFTMAR, (t->nr-1)*Height(t->f),
157     t->nc*Width(t->f), Height(t->f),(Bool) 0);
158    
159     bzero(cp, t->nc);
160     restorecurs(t); /* should we reposition cursor? */
161     }
162    
163    
164     xt_insert(t, r) /* insert a line */
165     register TEXTWIND *t;
166     int r;
167     {
168     char *cp;
169     register int i;
170    
171     if (r < 0 || r >= t->nr)
172     return;
173     checkcurs(t);
174     /* move lines */
175     XCopyArea(t->dpy, t->w, t->w, t->gc, LEFTMAR, r*Height(t->f), LEFTMAR,
176     (r+1)*Height(t->f), t->nc*Width(t->f),
177     (t->nr-1-r)*Height(t->f));
178     cp = t->lp[t->nr-1];
179     for (i = t->nr-1; i > r; i--)
180     t->lp[i] = t->lp[i-1];
181     t->lp[r] = cp;
182     /* clear new line */
183     XClearArea(t->dpy, t->w, LEFTMAR, r*Height(t->f),
184     t->nc*Width(t->f), Height(t->f), (Bool) 0);
185     bzero(cp, t->nc);
186     restorecurs(t); /* should we reposition cursor? */
187     }
188    
189    
190     xt_redraw(t) /* redraw text window */
191     register TEXTWIND *t;
192     {
193     register int i;
194    
195     XClearWindow(t->dpy, t->w);
196     for (i = 0; i < t->nr; i++)
197     if (strlen(t->lp[i]) > 0)
198     XDrawImageString(t->dpy, t->w, t->gc, LEFTMAR,
199     YStart(t->f)+i*Height(t->f),
200     t->lp[i], strlen(t->lp[i]));
201     restorecurs(t);
202     }
203    
204    
205     xt_clear(t) /* clear text window */
206     register TEXTWIND *t;
207     {
208     register int i;
209    
210     XClearWindow(t->dpy, t->w);
211     for (i = 0; i < t->nr; i++)
212     bzero(t->lp[i], t->nc);
213     t->r = t->c = 0;
214     restorecurs(t);
215     }
216    
217    
218     xt_move(t, r, c) /* move to new position */
219     register TEXTWIND *t;
220     int r, c;
221     {
222     if (r < 0 || c < 0 || r >= t->nr || c >= t->nc)
223     return;
224     checkcurs(t);
225     t->r = r;
226     t->c = c;
227     restorecurs(t);
228     }
229    
230    
231     int
232     xt_cursor(t, curs) /* change cursor */
233     register TEXTWIND *t;
234     register int curs;
235     {
236     register int oldcurs;
237    
238     if (curs != TNOCURS && curs != TBLKCURS)
239     return(-1);
240     oldcurs = t->cursor;
241     if (curs != oldcurs)
242     togglecurs(t);
243     t->cursor = curs;
244     return(oldcurs);
245     }
246    
247    
248     xt_close(t) /* close text window */
249     register TEXTWIND *t;
250     {
251     register int i;
252    
253     XFreeFont(t->dpy, t->f);
254     XFreeGC(t->dpy,t->gc);
255     XDestroyWindow(t->dpy, t->w);
256     for (i = 0; i < t->nr; i++)
257     free(t->lp[i]);
258     free((char *)t->lp);
259     free((char *)t);
260     }
261    
262    
263     static
264     togglecurs(t)
265     register TEXTWIND *t;
266     {
267     XSetFunction(t->dpy, t->gc, GXinvert);
268     XSetPlaneMask(t->dpy, t->gc, 1L);
269     XFillRectangle(t->dpy, t->w, t->gc,
270     t->c*Width(t->f)+LEFTMAR, t->r*Height(t->f),
271     Width(t->f), Height(t->f));
272     XSetFunction(t->dpy, t->gc, GXcopy);
273     XSetPlaneMask(t->dpy, t->gc, ~0L);
274     }