Blame


1 b330c942 2005-10-31 devnull #include <u.h>
2 b330c942 2005-10-31 devnull #include <libc.h>
3 b330c942 2005-10-31 devnull #include <draw.h>
4 b330c942 2005-10-31 devnull #include <plumb.h>
5 b330c942 2005-10-31 devnull #include <regexp.h>
6 b330c942 2005-10-31 devnull //jpc #include <event.h> /* for support routines only */
7 b330c942 2005-10-31 devnull #include <bio.h>
8 b330c942 2005-10-31 devnull #include <thread.h>
9 b330c942 2005-10-31 devnull #include <mouse.h>
10 b330c942 2005-10-31 devnull #include <cursor.h>
11 b330c942 2005-10-31 devnull #include <9pclient.h>
12 b330c942 2005-10-31 devnull #include "faces.h"
13 b330c942 2005-10-31 devnull
14 b330c942 2005-10-31 devnull int history = 0; /* use old interface, showing history of mailbox rather than current state */
15 b330c942 2005-10-31 devnull int initload = 0; /* initialize program with contents of mail box */
16 b330c942 2005-10-31 devnull
17 b330c942 2005-10-31 devnull enum
18 b330c942 2005-10-31 devnull {
19 b330c942 2005-10-31 devnull Facesep = 6, /* must be even to avoid damaging background stipple */
20 b330c942 2005-10-31 devnull Infolines = 9,
21 b330c942 2005-10-31 devnull
22 b330c942 2005-10-31 devnull HhmmTime = 18*60*60, /* max age of face to display hh:mm time */
23 b330c942 2005-10-31 devnull };
24 b330c942 2005-10-31 devnull
25 b330c942 2005-10-31 devnull enum
26 b330c942 2005-10-31 devnull {
27 b330c942 2005-10-31 devnull Mainp,
28 b330c942 2005-10-31 devnull Timep,
29 b330c942 2005-10-31 devnull Mousep,
30 b330c942 2005-10-31 devnull NPROC
31 b330c942 2005-10-31 devnull };
32 b330c942 2005-10-31 devnull
33 b330c942 2005-10-31 devnull int pids[NPROC];
34 b330c942 2005-10-31 devnull char *procnames[] = {
35 b330c942 2005-10-31 devnull "main",
36 b330c942 2005-10-31 devnull "time",
37 b330c942 2005-10-31 devnull "mouse"
38 b330c942 2005-10-31 devnull };
39 b330c942 2005-10-31 devnull
40 b330c942 2005-10-31 devnull Rectangle leftright = {0, 0, 20, 15};
41 b330c942 2005-10-31 devnull
42 b330c942 2005-10-31 devnull uchar leftdata[] = {
43 b330c942 2005-10-31 devnull 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80,
44 b330c942 2005-10-31 devnull 0x00, 0x07, 0x80, 0x00, 0x0f, 0x00, 0x00, 0x1f,
45 b330c942 2005-10-31 devnull 0xff, 0xf0, 0x3f, 0xff, 0xf0, 0xff, 0xff, 0xf0,
46 b330c942 2005-10-31 devnull 0x3f, 0xff, 0xf0, 0x1f, 0xff, 0xf0, 0x0f, 0x00,
47 b330c942 2005-10-31 devnull 0x00, 0x07, 0x80, 0x00, 0x03, 0x80, 0x00, 0x01,
48 b330c942 2005-10-31 devnull 0x80, 0x00, 0x00, 0x80, 0x00
49 b330c942 2005-10-31 devnull };
50 b330c942 2005-10-31 devnull
51 b330c942 2005-10-31 devnull uchar rightdata[] = {
52 b330c942 2005-10-31 devnull 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1c,
53 b330c942 2005-10-31 devnull 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0f, 0x00, 0xff,
54 b330c942 2005-10-31 devnull 0xff, 0x80, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf0,
55 b330c942 2005-10-31 devnull 0xff, 0xff, 0xc0, 0xff, 0xff, 0x80, 0x00, 0x0f,
56 b330c942 2005-10-31 devnull 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00,
57 b330c942 2005-10-31 devnull 0x18, 0x00, 0x00, 0x10, 0x00
58 b330c942 2005-10-31 devnull };
59 b330c942 2005-10-31 devnull
60 b330c942 2005-10-31 devnull CFsys *upasfs;
61 b330c942 2005-10-31 devnull Mousectl *mousectl;
62 b330c942 2005-10-31 devnull Image *blue; /* full arrow */
63 b330c942 2005-10-31 devnull Image *bgrnd; /* pale blue background color */
64 b330c942 2005-10-31 devnull Image *left; /* left-pointing arrow mask */
65 b330c942 2005-10-31 devnull Image *right; /* right-pointing arrow mask */
66 b330c942 2005-10-31 devnull Font *tinyfont;
67 b330c942 2005-10-31 devnull Font *mediumfont;
68 b330c942 2005-10-31 devnull Font *datefont;
69 b330c942 2005-10-31 devnull int first, last; /* first and last visible face; last is first invisible */
70 b330c942 2005-10-31 devnull int nfaces;
71 b330c942 2005-10-31 devnull int mousefd;
72 b330c942 2005-10-31 devnull int nacross;
73 b330c942 2005-10-31 devnull int ndown;
74 b330c942 2005-10-31 devnull
75 b330c942 2005-10-31 devnull char date[64];
76 b330c942 2005-10-31 devnull Face **faces;
77 b330c942 2005-10-31 devnull char *maildir = "/mail/fs/mbox";
78 b330c942 2005-10-31 devnull ulong now;
79 b330c942 2005-10-31 devnull
80 b330c942 2005-10-31 devnull Point datep = { 8, 6 };
81 b330c942 2005-10-31 devnull Point facep = { 8, 6+0+4 }; /* 0 updated to datefont->height in init() */
82 b330c942 2005-10-31 devnull Point enddate; /* where date ends on display; used to place arrows */
83 b330c942 2005-10-31 devnull Rectangle leftr; /* location of left arrow on display */
84 b330c942 2005-10-31 devnull Rectangle rightr; /* location of right arrow on display */
85 b330c942 2005-10-31 devnull void updatetimes(void);
86 b330c942 2005-10-31 devnull
87 b330c942 2005-10-31 devnull void
88 b330c942 2005-10-31 devnull setdate(void)
89 b330c942 2005-10-31 devnull {
90 b330c942 2005-10-31 devnull now = time(nil);
91 b330c942 2005-10-31 devnull strcpy(date, ctime(now));
92 b330c942 2005-10-31 devnull date[4+4+3+5] = '\0'; /* change from Thu Jul 22 14:28:43 EDT 1999\n to Thu Jul 22 14:28 */
93 b330c942 2005-10-31 devnull }
94 b330c942 2005-10-31 devnull
95 b330c942 2005-10-31 devnull void
96 b330c942 2005-10-31 devnull init(void)
97 b330c942 2005-10-31 devnull {
98 b330c942 2005-10-31 devnull #if 0
99 b330c942 2005-10-31 devnull mousefd = open("/dev/mouse", OREAD);
100 b330c942 2005-10-31 devnull if(mousefd < 0){
101 b330c942 2005-10-31 devnull fprint(2, "faces: can't open mouse: %r\n");
102 b330c942 2005-10-31 devnull threadexitsall("mouse");
103 b330c942 2005-10-31 devnull }
104 b330c942 2005-10-31 devnull #endif
105 b330c942 2005-10-31 devnull upasfs = nsmount("upasfs",nil);
106 b330c942 2005-10-31 devnull mousectl = initmouse(nil,screen);
107 b330c942 2005-10-31 devnull initplumb();
108 b330c942 2005-10-31 devnull
109 b330c942 2005-10-31 devnull /* make background color */
110 b330c942 2005-10-31 devnull bgrnd = allocimagemix(display, DPalebluegreen, DWhite);
111 b330c942 2005-10-31 devnull blue = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x008888FF); /* blue-green */
112 b330c942 2005-10-31 devnull left = allocimage(display, leftright, GREY1, 0, DWhite);
113 b330c942 2005-10-31 devnull right = allocimage(display, leftright, GREY1, 0, DWhite);
114 b330c942 2005-10-31 devnull if(bgrnd==nil || blue==nil || left==nil || right==nil){
115 b330c942 2005-10-31 devnull fprint(2, "faces: can't create images: %r\n");
116 b330c942 2005-10-31 devnull threadexitsall("image");
117 b330c942 2005-10-31 devnull }
118 b330c942 2005-10-31 devnull
119 b330c942 2005-10-31 devnull loadimage(left, leftright, leftdata, sizeof leftdata);
120 b330c942 2005-10-31 devnull loadimage(right, leftright, rightdata, sizeof rightdata);
121 b330c942 2005-10-31 devnull
122 b330c942 2005-10-31 devnull /* initialize little fonts */
123 b330c942 2005-10-31 devnull tinyfont = openfont(display, "/lib/font/bit/misc/ascii.5x7.font");
124 b330c942 2005-10-31 devnull if(tinyfont == nil)
125 b330c942 2005-10-31 devnull tinyfont = font;
126 b330c942 2005-10-31 devnull mediumfont = openfont(display, "/lib/font/bit/pelm/latin1.8.font");
127 b330c942 2005-10-31 devnull if(mediumfont == nil)
128 b330c942 2005-10-31 devnull mediumfont = font;
129 b330c942 2005-10-31 devnull datefont = font;
130 b330c942 2005-10-31 devnull
131 b330c942 2005-10-31 devnull facep.y += datefont->height;
132 b330c942 2005-10-31 devnull if(datefont->height & 1) /* stipple parity */
133 b330c942 2005-10-31 devnull facep.y++;
134 b330c942 2005-10-31 devnull faces = nil;
135 b330c942 2005-10-31 devnull }
136 b330c942 2005-10-31 devnull
137 b330c942 2005-10-31 devnull void
138 b330c942 2005-10-31 devnull drawtime(void)
139 b330c942 2005-10-31 devnull {
140 b330c942 2005-10-31 devnull Rectangle r;
141 b330c942 2005-10-31 devnull
142 b330c942 2005-10-31 devnull r.min = addpt(screen->r.min, datep);
143 b330c942 2005-10-31 devnull if(eqpt(enddate, ZP)){
144 b330c942 2005-10-31 devnull enddate = r.min;
145 b330c942 2005-10-31 devnull enddate.x += stringwidth(datefont, "Wed May 30 22:54"); /* nice wide string */
146 b330c942 2005-10-31 devnull enddate.x += Facesep; /* for safety */
147 b330c942 2005-10-31 devnull }
148 b330c942 2005-10-31 devnull r.max.x = enddate.x;
149 b330c942 2005-10-31 devnull r.max.y = enddate.y+datefont->height;
150 b330c942 2005-10-31 devnull draw(screen, r, bgrnd, nil, ZP);
151 b330c942 2005-10-31 devnull string(screen, r.min, display->black, ZP, datefont, date);
152 b330c942 2005-10-31 devnull }
153 b330c942 2005-10-31 devnull
154 b330c942 2005-10-31 devnull void
155 b330c942 2005-10-31 devnull timeproc(void *dummy)
156 b330c942 2005-10-31 devnull {
157 b330c942 2005-10-31 devnull for(;;){
158 b330c942 2005-10-31 devnull lockdisplay(display);
159 b330c942 2005-10-31 devnull drawtime();
160 b330c942 2005-10-31 devnull updatetimes();
161 b330c942 2005-10-31 devnull flushimage(display, 1);
162 b330c942 2005-10-31 devnull unlockdisplay(display);
163 b330c942 2005-10-31 devnull sleep(60000);
164 b330c942 2005-10-31 devnull setdate();
165 b330c942 2005-10-31 devnull }
166 b330c942 2005-10-31 devnull }
167 b330c942 2005-10-31 devnull
168 b330c942 2005-10-31 devnull int
169 b330c942 2005-10-31 devnull alreadyseen(char *digest)
170 b330c942 2005-10-31 devnull {
171 b330c942 2005-10-31 devnull int i;
172 b330c942 2005-10-31 devnull Face *f;
173 b330c942 2005-10-31 devnull
174 b330c942 2005-10-31 devnull if(!digest)
175 b330c942 2005-10-31 devnull return 0;
176 b330c942 2005-10-31 devnull
177 b330c942 2005-10-31 devnull /* can do accurate check */
178 b330c942 2005-10-31 devnull for(i=0; i<nfaces; i++){
179 b330c942 2005-10-31 devnull f = faces[i];
180 b330c942 2005-10-31 devnull if(f->str[Sdigest]!=nil && strcmp(digest, f->str[Sdigest])==0)
181 b330c942 2005-10-31 devnull return 1;
182 b330c942 2005-10-31 devnull }
183 b330c942 2005-10-31 devnull return 0;
184 b330c942 2005-10-31 devnull }
185 b330c942 2005-10-31 devnull
186 b330c942 2005-10-31 devnull int
187 b330c942 2005-10-31 devnull torune(Rune *r, char *s, int nr)
188 b330c942 2005-10-31 devnull {
189 b330c942 2005-10-31 devnull int i;
190 b330c942 2005-10-31 devnull
191 b330c942 2005-10-31 devnull for(i=0; i<nr-1 && *s!='\0'; i++)
192 b330c942 2005-10-31 devnull s += chartorune(r+i, s);
193 b330c942 2005-10-31 devnull r[i] = L'\0';
194 b330c942 2005-10-31 devnull return i;
195 b330c942 2005-10-31 devnull }
196 b330c942 2005-10-31 devnull
197 b330c942 2005-10-31 devnull void
198 b330c942 2005-10-31 devnull center(Font *f, Point p, char *s, Image *color)
199 b330c942 2005-10-31 devnull {
200 b330c942 2005-10-31 devnull int i, n, dx;
201 b330c942 2005-10-31 devnull Rune rbuf[32];
202 b330c942 2005-10-31 devnull char sbuf[32*UTFmax+1];
203 b330c942 2005-10-31 devnull
204 b330c942 2005-10-31 devnull dx = stringwidth(f, s);
205 b330c942 2005-10-31 devnull if(dx > Facesize){
206 b330c942 2005-10-31 devnull n = torune(rbuf, s, nelem(rbuf));
207 b330c942 2005-10-31 devnull for(i=0; i<n; i++){
208 b330c942 2005-10-31 devnull dx = runestringnwidth(f, rbuf, i+1);
209 b330c942 2005-10-31 devnull if(dx > Facesize)
210 b330c942 2005-10-31 devnull break;
211 b330c942 2005-10-31 devnull }
212 b330c942 2005-10-31 devnull sprint(sbuf, "%.*S", i, rbuf);
213 b330c942 2005-10-31 devnull s = sbuf;
214 b330c942 2005-10-31 devnull dx = stringwidth(f, s);
215 b330c942 2005-10-31 devnull }
216 b330c942 2005-10-31 devnull p.x += (Facesize-dx)/2;
217 b330c942 2005-10-31 devnull string(screen, p, color, ZP, f, s);
218 b330c942 2005-10-31 devnull }
219 b330c942 2005-10-31 devnull
220 b330c942 2005-10-31 devnull Rectangle
221 b330c942 2005-10-31 devnull facerect(int index) /* index is geometric; 0 is always upper left face */
222 b330c942 2005-10-31 devnull {
223 b330c942 2005-10-31 devnull Rectangle r;
224 b330c942 2005-10-31 devnull int x, y;
225 b330c942 2005-10-31 devnull
226 b330c942 2005-10-31 devnull x = index % nacross;
227 b330c942 2005-10-31 devnull y = index / nacross;
228 b330c942 2005-10-31 devnull r.min = addpt(screen->r.min, facep);
229 b330c942 2005-10-31 devnull r.min.x += x*(Facesize+Facesep);
230 b330c942 2005-10-31 devnull r.min.y += y*(Facesize+Facesep+2*mediumfont->height);
231 b330c942 2005-10-31 devnull r.max = addpt(r.min, Pt(Facesize, Facesize));
232 b330c942 2005-10-31 devnull r.max.y += 2*mediumfont->height;
233 b330c942 2005-10-31 devnull /* simple fix to avoid drawing off screen, allowing customers to use position */
234 b330c942 2005-10-31 devnull if(index<0 || index>=nacross*ndown)
235 b330c942 2005-10-31 devnull r.max.x = r.min.x;
236 b330c942 2005-10-31 devnull return r;
237 b330c942 2005-10-31 devnull }
238 b330c942 2005-10-31 devnull
239 b330c942 2005-10-31 devnull static char *mon = "JanFebMarAprMayJunJulAugSepOctNovDec";
240 b330c942 2005-10-31 devnull char*
241 b330c942 2005-10-31 devnull facetime(Face *f, int *recent)
242 b330c942 2005-10-31 devnull {
243 b330c942 2005-10-31 devnull static char buf[30];
244 b330c942 2005-10-31 devnull
245 b330c942 2005-10-31 devnull if((long)(now - f->time) > HhmmTime){
246 b330c942 2005-10-31 devnull *recent = 0;
247 b330c942 2005-10-31 devnull sprint(buf, "%.3s %2d", mon+3*f->tm.mon, f->tm.mday);
248 b330c942 2005-10-31 devnull return buf;
249 b330c942 2005-10-31 devnull }else{
250 b330c942 2005-10-31 devnull *recent = 1;
251 b330c942 2005-10-31 devnull sprint(buf, "%02d:%02d", f->tm.hour, f->tm.min);
252 b330c942 2005-10-31 devnull return buf;
253 b330c942 2005-10-31 devnull }
254 b330c942 2005-10-31 devnull }
255 b330c942 2005-10-31 devnull
256 b330c942 2005-10-31 devnull void
257 b330c942 2005-10-31 devnull drawface(Face *f, int i)
258 b330c942 2005-10-31 devnull {
259 b330c942 2005-10-31 devnull char *tstr;
260 b330c942 2005-10-31 devnull Rectangle r;
261 b330c942 2005-10-31 devnull Point p;
262 b330c942 2005-10-31 devnull
263 b330c942 2005-10-31 devnull if(f == nil)
264 b330c942 2005-10-31 devnull return;
265 b330c942 2005-10-31 devnull if(i<first || i>=last)
266 b330c942 2005-10-31 devnull return;
267 b330c942 2005-10-31 devnull r = facerect(i-first);
268 b330c942 2005-10-31 devnull draw(screen, r, bgrnd, nil, ZP);
269 b330c942 2005-10-31 devnull draw(screen, r, f->bit, f->mask, ZP);
270 b330c942 2005-10-31 devnull r.min.y += Facesize;
271 b330c942 2005-10-31 devnull center(mediumfont, r.min, f->str[Suser], display->black);
272 b330c942 2005-10-31 devnull r.min.y += mediumfont->height;
273 b330c942 2005-10-31 devnull tstr = facetime(f, &f->recent);
274 b330c942 2005-10-31 devnull center(mediumfont, r.min, tstr, display->black);
275 b330c942 2005-10-31 devnull if(f->unknown){
276 b330c942 2005-10-31 devnull r.min.y -= mediumfont->height + tinyfont->height + 2;
277 b330c942 2005-10-31 devnull for(p.x=-1; p.x<=1; p.x++)
278 b330c942 2005-10-31 devnull for(p.y=-1; p.y<=1; p.y++)
279 b330c942 2005-10-31 devnull center(tinyfont, addpt(r.min, p), f->str[Sdomain], display->white);
280 b330c942 2005-10-31 devnull center(tinyfont, r.min, f->str[Sdomain], display->black);
281 b330c942 2005-10-31 devnull }
282 b330c942 2005-10-31 devnull }
283 b330c942 2005-10-31 devnull
284 b330c942 2005-10-31 devnull void
285 b330c942 2005-10-31 devnull updatetimes(void)
286 b330c942 2005-10-31 devnull {
287 b330c942 2005-10-31 devnull int i;
288 b330c942 2005-10-31 devnull Face *f;
289 b330c942 2005-10-31 devnull
290 b330c942 2005-10-31 devnull for(i=0; i<nfaces; i++){
291 b330c942 2005-10-31 devnull f = faces[i];
292 b330c942 2005-10-31 devnull if(f == nil)
293 b330c942 2005-10-31 devnull continue;
294 b330c942 2005-10-31 devnull if(((long)(now - f->time) <= HhmmTime) != f->recent)
295 b330c942 2005-10-31 devnull drawface(f, i);
296 b330c942 2005-10-31 devnull }
297 b330c942 2005-10-31 devnull }
298 b330c942 2005-10-31 devnull
299 b330c942 2005-10-31 devnull void
300 b330c942 2005-10-31 devnull setlast(void)
301 b330c942 2005-10-31 devnull {
302 b330c942 2005-10-31 devnull last = first+nacross*ndown;
303 b330c942 2005-10-31 devnull if(last > nfaces)
304 b330c942 2005-10-31 devnull last = nfaces;
305 b330c942 2005-10-31 devnull }
306 b330c942 2005-10-31 devnull
307 b330c942 2005-10-31 devnull void
308 b330c942 2005-10-31 devnull drawarrows(void)
309 b330c942 2005-10-31 devnull {
310 b330c942 2005-10-31 devnull Point p;
311 b330c942 2005-10-31 devnull
312 b330c942 2005-10-31 devnull p = enddate;
313 b330c942 2005-10-31 devnull p.x += Facesep;
314 b330c942 2005-10-31 devnull if(p.x & 1)
315 b330c942 2005-10-31 devnull p.x++; /* align background texture */
316 b330c942 2005-10-31 devnull leftr = rectaddpt(leftright, p);
317 b330c942 2005-10-31 devnull p.x += Dx(leftright) + Facesep;
318 b330c942 2005-10-31 devnull rightr = rectaddpt(leftright, p);
319 b330c942 2005-10-31 devnull draw(screen, leftr, first>0? blue : bgrnd, left, leftright.min);
320 b330c942 2005-10-31 devnull draw(screen, rightr, last<nfaces? blue : bgrnd, right, leftright.min);
321 b330c942 2005-10-31 devnull }
322 b330c942 2005-10-31 devnull
323 b330c942 2005-10-31 devnull void
324 b330c942 2005-10-31 devnull addface(Face *f) /* always adds at 0 */
325 b330c942 2005-10-31 devnull {
326 b330c942 2005-10-31 devnull Face **ofaces;
327 b330c942 2005-10-31 devnull Rectangle r0, r1, r;
328 b330c942 2005-10-31 devnull int y, nx, ny;
329 b330c942 2005-10-31 devnull
330 b330c942 2005-10-31 devnull if(f == nil)
331 b330c942 2005-10-31 devnull return;
332 b330c942 2005-10-31 devnull lockdisplay(display);
333 b330c942 2005-10-31 devnull if(first != 0){
334 b330c942 2005-10-31 devnull first = 0;
335 b330c942 2005-10-31 devnull resized();
336 b330c942 2005-10-31 devnull }
337 b330c942 2005-10-31 devnull findbit(f);
338 b330c942 2005-10-31 devnull
339 b330c942 2005-10-31 devnull nx = nacross;
340 b330c942 2005-10-31 devnull ny = (nfaces+(nx-1)) / nx;
341 b330c942 2005-10-31 devnull
342 b330c942 2005-10-31 devnull for(y=ny; y>=0; y--){
343 b330c942 2005-10-31 devnull /* move them along */
344 b330c942 2005-10-31 devnull r0 = facerect(y*nx+0);
345 b330c942 2005-10-31 devnull r1 = facerect(y*nx+1);
346 b330c942 2005-10-31 devnull r = r1;
347 b330c942 2005-10-31 devnull r.max.x = r.min.x + (nx - 1)*(Facesize+Facesep);
348 b330c942 2005-10-31 devnull draw(screen, r, screen, nil, r0.min);
349 b330c942 2005-10-31 devnull /* copy one down from row above */
350 b330c942 2005-10-31 devnull if(y != 0){
351 b330c942 2005-10-31 devnull r = facerect((y-1)*nx+nx-1);
352 b330c942 2005-10-31 devnull draw(screen, r0, screen, nil, r.min);
353 b330c942 2005-10-31 devnull }
354 b330c942 2005-10-31 devnull }
355 b330c942 2005-10-31 devnull
356 b330c942 2005-10-31 devnull ofaces = faces;
357 b330c942 2005-10-31 devnull faces = emalloc((nfaces+1)*sizeof(Face*));
358 b330c942 2005-10-31 devnull memmove(faces+1, ofaces, nfaces*(sizeof(Face*)));
359 b330c942 2005-10-31 devnull free(ofaces);
360 b330c942 2005-10-31 devnull nfaces++;
361 b330c942 2005-10-31 devnull setlast();
362 b330c942 2005-10-31 devnull drawarrows();
363 b330c942 2005-10-31 devnull faces[0] = f;
364 b330c942 2005-10-31 devnull drawface(f, 0);
365 b330c942 2005-10-31 devnull flushimage(display, 1);
366 b330c942 2005-10-31 devnull unlockdisplay(display);
367 b330c942 2005-10-31 devnull }
368 b330c942 2005-10-31 devnull
369 b330c942 2005-10-31 devnull #if 0
370 b330c942 2005-10-31 devnull void
371 b330c942 2005-10-31 devnull loadmboxfaces(char *maildir)
372 b330c942 2005-10-31 devnull {
373 b330c942 2005-10-31 devnull int dirfd;
374 b330c942 2005-10-31 devnull Dir *d;
375 b330c942 2005-10-31 devnull int i, n;
376 b330c942 2005-10-31 devnull
377 b330c942 2005-10-31 devnull dirfd = open(maildir, OREAD);
378 b330c942 2005-10-31 devnull if(dirfd >= 0){
379 b330c942 2005-10-31 devnull chdir(maildir);
380 b330c942 2005-10-31 devnull while((n = dirread(dirfd, &d)) > 0){
381 b330c942 2005-10-31 devnull for(i=0; i<n; i++)
382 b330c942 2005-10-31 devnull addface(dirface(maildir, d[i].name));
383 b330c942 2005-10-31 devnull free(d);
384 b330c942 2005-10-31 devnull }
385 b330c942 2005-10-31 devnull close(dirfd);
386 b330c942 2005-10-31 devnull }
387 b330c942 2005-10-31 devnull }
388 b330c942 2005-10-31 devnull #endif
389 b330c942 2005-10-31 devnull
390 b330c942 2005-10-31 devnull void
391 b330c942 2005-10-31 devnull loadmboxfaces(char *maildir)
392 b330c942 2005-10-31 devnull {
393 b330c942 2005-10-31 devnull CFid *dirfd;
394 b330c942 2005-10-31 devnull Dir *d;
395 b330c942 2005-10-31 devnull int i, n;
396 b330c942 2005-10-31 devnull
397 b330c942 2005-10-31 devnull dirfd = fsopen(upasfs,maildir, OREAD);
398 b330c942 2005-10-31 devnull if(dirfd != nil){
399 b330c942 2005-10-31 devnull //jpc chdir(maildir);
400 b330c942 2005-10-31 devnull while((n = fsdirread(dirfd, &d)) > 0){
401 b330c942 2005-10-31 devnull for(i=0; i<n; i++) {
402 b330c942 2005-10-31 devnull addface(dirface(maildir, d[i].name));
403 b330c942 2005-10-31 devnull }
404 b330c942 2005-10-31 devnull free(d);
405 b330c942 2005-10-31 devnull }
406 b330c942 2005-10-31 devnull fsclose(dirfd);
407 b330c942 2005-10-31 devnull }
408 b330c942 2005-10-31 devnull else {
409 b330c942 2005-10-31 devnull error("cannot open %s: %r",maildir);
410 b330c942 2005-10-31 devnull }
411 b330c942 2005-10-31 devnull }
412 b330c942 2005-10-31 devnull
413 b330c942 2005-10-31 devnull void
414 b330c942 2005-10-31 devnull freeface(Face *f)
415 b330c942 2005-10-31 devnull {
416 b330c942 2005-10-31 devnull int i;
417 b330c942 2005-10-31 devnull
418 b330c942 2005-10-31 devnull if(f->file!=nil && f->bit!=f->file->image)
419 b330c942 2005-10-31 devnull freeimage(f->bit);
420 b330c942 2005-10-31 devnull freefacefile(f->file);
421 b330c942 2005-10-31 devnull for(i=0; i<Nstring; i++)
422 b330c942 2005-10-31 devnull free(f->str[i]);
423 b330c942 2005-10-31 devnull free(f);
424 b330c942 2005-10-31 devnull }
425 b330c942 2005-10-31 devnull
426 b330c942 2005-10-31 devnull void
427 b330c942 2005-10-31 devnull delface(int j)
428 b330c942 2005-10-31 devnull {
429 b330c942 2005-10-31 devnull Rectangle r0, r1, r;
430 b330c942 2005-10-31 devnull int nx, ny, x, y;
431 b330c942 2005-10-31 devnull
432 b330c942 2005-10-31 devnull if(j < first)
433 b330c942 2005-10-31 devnull first--;
434 b330c942 2005-10-31 devnull else if(j < last){
435 b330c942 2005-10-31 devnull nx = nacross;
436 b330c942 2005-10-31 devnull ny = (nfaces+(nx-1)) / nx;
437 b330c942 2005-10-31 devnull x = (j-first)%nx;
438 b330c942 2005-10-31 devnull for(y=(j-first)/nx; y<ny; y++){
439 b330c942 2005-10-31 devnull if(x != nx-1){
440 b330c942 2005-10-31 devnull /* move them along */
441 b330c942 2005-10-31 devnull r0 = facerect(y*nx+x);
442 b330c942 2005-10-31 devnull r1 = facerect(y*nx+x+1);
443 b330c942 2005-10-31 devnull r = r0;
444 b330c942 2005-10-31 devnull r.max.x = r.min.x + (nx - x - 1)*(Facesize+Facesep);
445 b330c942 2005-10-31 devnull draw(screen, r, screen, nil, r1.min);
446 b330c942 2005-10-31 devnull }
447 b330c942 2005-10-31 devnull if(y != ny-1){
448 b330c942 2005-10-31 devnull /* copy one up from row below */
449 b330c942 2005-10-31 devnull r = facerect((y+1)*nx);
450 b330c942 2005-10-31 devnull draw(screen, facerect(y*nx+nx-1), screen, nil, r.min);
451 b330c942 2005-10-31 devnull }
452 b330c942 2005-10-31 devnull x = 0;
453 b330c942 2005-10-31 devnull }
454 b330c942 2005-10-31 devnull if(last < nfaces) /* first off-screen becomes visible */
455 b330c942 2005-10-31 devnull drawface(faces[last], last-1);
456 b330c942 2005-10-31 devnull else{
457 b330c942 2005-10-31 devnull /* clear final spot */
458 b330c942 2005-10-31 devnull r = facerect(last-first-1);
459 b330c942 2005-10-31 devnull draw(screen, r, bgrnd, nil, r.min);
460 b330c942 2005-10-31 devnull }
461 b330c942 2005-10-31 devnull }
462 b330c942 2005-10-31 devnull freeface(faces[j]);
463 b330c942 2005-10-31 devnull memmove(faces+j, faces+j+1, (nfaces-(j+1))*sizeof(Face*));
464 b330c942 2005-10-31 devnull nfaces--;
465 b330c942 2005-10-31 devnull setlast();
466 b330c942 2005-10-31 devnull drawarrows();
467 b330c942 2005-10-31 devnull }
468 b330c942 2005-10-31 devnull
469 b330c942 2005-10-31 devnull void
470 b330c942 2005-10-31 devnull dodelete(int i)
471 b330c942 2005-10-31 devnull {
472 b330c942 2005-10-31 devnull Face *f;
473 b330c942 2005-10-31 devnull
474 b330c942 2005-10-31 devnull f = faces[i];
475 b330c942 2005-10-31 devnull if(history){
476 b330c942 2005-10-31 devnull free(f->str[Sshow]);
477 b330c942 2005-10-31 devnull f->str[Sshow] = estrdup("");
478 b330c942 2005-10-31 devnull }else{
479 b330c942 2005-10-31 devnull delface(i);
480 b330c942 2005-10-31 devnull flushimage(display, 1);
481 b330c942 2005-10-31 devnull }
482 b330c942 2005-10-31 devnull }
483 b330c942 2005-10-31 devnull
484 b330c942 2005-10-31 devnull void
485 b330c942 2005-10-31 devnull delete(char *s, char *digest)
486 b330c942 2005-10-31 devnull {
487 b330c942 2005-10-31 devnull int i;
488 b330c942 2005-10-31 devnull Face *f;
489 b330c942 2005-10-31 devnull
490 b330c942 2005-10-31 devnull lockdisplay(display);
491 b330c942 2005-10-31 devnull for(i=0; i<nfaces; i++){
492 b330c942 2005-10-31 devnull f = faces[i];
493 b330c942 2005-10-31 devnull if(digest != nil){
494 b330c942 2005-10-31 devnull if(f->str[Sdigest]!=nil && strcmp(digest, f->str[Sdigest]) == 0){
495 b330c942 2005-10-31 devnull dodelete(i);
496 b330c942 2005-10-31 devnull break;
497 b330c942 2005-10-31 devnull }
498 b330c942 2005-10-31 devnull }else{
499 b330c942 2005-10-31 devnull if(f->str[Sshow] && strcmp(s, f->str[Sshow]) == 0){
500 b330c942 2005-10-31 devnull dodelete(i);
501 b330c942 2005-10-31 devnull break;
502 b330c942 2005-10-31 devnull }
503 b330c942 2005-10-31 devnull }
504 b330c942 2005-10-31 devnull }
505 b330c942 2005-10-31 devnull unlockdisplay(display);
506 b330c942 2005-10-31 devnull }
507 b330c942 2005-10-31 devnull
508 b330c942 2005-10-31 devnull void
509 b330c942 2005-10-31 devnull faceproc(void)
510 b330c942 2005-10-31 devnull {
511 b330c942 2005-10-31 devnull for(;;)
512 b330c942 2005-10-31 devnull addface(nextface());
513 b330c942 2005-10-31 devnull }
514 b330c942 2005-10-31 devnull
515 b330c942 2005-10-31 devnull void
516 b330c942 2005-10-31 devnull resized(void)
517 b330c942 2005-10-31 devnull {
518 b330c942 2005-10-31 devnull int i;
519 b330c942 2005-10-31 devnull
520 b330c942 2005-10-31 devnull nacross = (Dx(screen->r)-2*facep.x+Facesep)/(Facesize+Facesep);
521 b330c942 2005-10-31 devnull for(ndown=1; rectinrect(facerect(ndown*nacross), screen->r); ndown++)
522 b330c942 2005-10-31 devnull ;
523 b330c942 2005-10-31 devnull setlast();
524 b330c942 2005-10-31 devnull draw(screen, screen->r, bgrnd, nil, ZP);
525 b330c942 2005-10-31 devnull enddate = ZP;
526 b330c942 2005-10-31 devnull drawtime();
527 b330c942 2005-10-31 devnull for(i=0; i<nfaces; i++)
528 b330c942 2005-10-31 devnull drawface(faces[i], i);
529 b330c942 2005-10-31 devnull drawarrows();
530 b330c942 2005-10-31 devnull flushimage(display, 1);
531 b330c942 2005-10-31 devnull }
532 b330c942 2005-10-31 devnull
533 b330c942 2005-10-31 devnull void
534 b330c942 2005-10-31 devnull eresized(int new)
535 b330c942 2005-10-31 devnull {
536 b330c942 2005-10-31 devnull lockdisplay(display);
537 b330c942 2005-10-31 devnull if(new && getwindow(display, Refnone) < 0) {
538 b330c942 2005-10-31 devnull fprint(2, "can't reattach to window\n");
539 b330c942 2005-10-31 devnull killall("reattach");
540 b330c942 2005-10-31 devnull }
541 b330c942 2005-10-31 devnull resized();
542 b330c942 2005-10-31 devnull unlockdisplay(display);
543 b330c942 2005-10-31 devnull }
544 b330c942 2005-10-31 devnull
545 b330c942 2005-10-31 devnull #if 0
546 b330c942 2005-10-31 devnull int
547 b330c942 2005-10-31 devnull getmouse(Mouse *m)
548 b330c942 2005-10-31 devnull {
549 b330c942 2005-10-31 devnull int n;
550 b330c942 2005-10-31 devnull static int eof;
551 b330c942 2005-10-31 devnull char buf[128];
552 b330c942 2005-10-31 devnull
553 b330c942 2005-10-31 devnull if(eof)
554 b330c942 2005-10-31 devnull return 0;
555 b330c942 2005-10-31 devnull for(;;){
556 b330c942 2005-10-31 devnull n = read(mousefd, buf, sizeof(buf));
557 b330c942 2005-10-31 devnull if(n <= 0){
558 b330c942 2005-10-31 devnull /* so callers needn't check return value every time */
559 b330c942 2005-10-31 devnull eof = 1;
560 b330c942 2005-10-31 devnull m->buttons = 0;
561 b330c942 2005-10-31 devnull return 0;
562 b330c942 2005-10-31 devnull }
563 b330c942 2005-10-31 devnull //jpc n = eatomouse(m, buf, n);
564 b330c942 2005-10-31 devnull if(n > 0)
565 b330c942 2005-10-31 devnull return 1;
566 b330c942 2005-10-31 devnull }
567 b330c942 2005-10-31 devnull }
568 b330c942 2005-10-31 devnull #endif
569 b330c942 2005-10-31 devnull int
570 b330c942 2005-10-31 devnull getmouse(Mouse *m)
571 b330c942 2005-10-31 devnull {
572 b330c942 2005-10-31 devnull static int eof;
573 b330c942 2005-10-31 devnull
574 b330c942 2005-10-31 devnull if(eof)
575 b330c942 2005-10-31 devnull return 0;
576 b330c942 2005-10-31 devnull if( readmouse(mousectl) < 0 ) {
577 b330c942 2005-10-31 devnull eof = 1;
578 b330c942 2005-10-31 devnull m->buttons = 0;
579 b330c942 2005-10-31 devnull return 0;
580 b330c942 2005-10-31 devnull }
581 b330c942 2005-10-31 devnull else {
582 b330c942 2005-10-31 devnull *m = mousectl->m;
583 b330c942 2005-10-31 devnull /* m->buttons = mousectl->m.buttons;
584 b330c942 2005-10-31 devnull m->xy.x = mousectl->m.xy.x;
585 b330c942 2005-10-31 devnull m->xy.y = mousectl->m.xy.y;
586 b330c942 2005-10-31 devnull m->msec = mousectl->m.msec; */
587 b330c942 2005-10-31 devnull return 1;
588 b330c942 2005-10-31 devnull }
589 b330c942 2005-10-31 devnull }
590 b330c942 2005-10-31 devnull
591 b330c942 2005-10-31 devnull enum
592 b330c942 2005-10-31 devnull {
593 b330c942 2005-10-31 devnull Clicksize = 3, /* pixels */
594 b330c942 2005-10-31 devnull };
595 b330c942 2005-10-31 devnull
596 b330c942 2005-10-31 devnull int
597 b330c942 2005-10-31 devnull scroll(int but, Point p)
598 b330c942 2005-10-31 devnull {
599 b330c942 2005-10-31 devnull int delta;
600 b330c942 2005-10-31 devnull
601 b330c942 2005-10-31 devnull delta = 0;
602 b330c942 2005-10-31 devnull lockdisplay(display);
603 b330c942 2005-10-31 devnull if(ptinrect(p, leftr) && first>0){
604 b330c942 2005-10-31 devnull if(but == 2)
605 b330c942 2005-10-31 devnull delta = -first;
606 b330c942 2005-10-31 devnull else{
607 b330c942 2005-10-31 devnull delta = nacross;
608 b330c942 2005-10-31 devnull if(delta > first)
609 b330c942 2005-10-31 devnull delta = first;
610 b330c942 2005-10-31 devnull delta = -delta;
611 b330c942 2005-10-31 devnull }
612 b330c942 2005-10-31 devnull }else if(ptinrect(p, rightr) && last<nfaces){
613 b330c942 2005-10-31 devnull if(but == 2)
614 b330c942 2005-10-31 devnull delta = (nfaces-nacross*ndown) - first;
615 b330c942 2005-10-31 devnull else{
616 b330c942 2005-10-31 devnull delta = nacross;
617 b330c942 2005-10-31 devnull if(delta > nfaces-last)
618 b330c942 2005-10-31 devnull delta = nfaces-last;
619 b330c942 2005-10-31 devnull }
620 b330c942 2005-10-31 devnull }
621 b330c942 2005-10-31 devnull first += delta;
622 b330c942 2005-10-31 devnull last += delta;
623 b330c942 2005-10-31 devnull unlockdisplay(display);
624 b330c942 2005-10-31 devnull if(delta)
625 b330c942 2005-10-31 devnull eresized(0);
626 b330c942 2005-10-31 devnull return delta;
627 b330c942 2005-10-31 devnull }
628 b330c942 2005-10-31 devnull
629 b330c942 2005-10-31 devnull void
630 b330c942 2005-10-31 devnull click(int button, Mouse *m)
631 b330c942 2005-10-31 devnull {
632 b330c942 2005-10-31 devnull Point p;
633 b330c942 2005-10-31 devnull int i;
634 b330c942 2005-10-31 devnull
635 b330c942 2005-10-31 devnull p = m->xy;
636 b330c942 2005-10-31 devnull while(m->buttons == (1<<(button-1)))
637 b330c942 2005-10-31 devnull getmouse(m);
638 b330c942 2005-10-31 devnull if(m->buttons)
639 b330c942 2005-10-31 devnull return;
640 b330c942 2005-10-31 devnull if(abs(p.x-m->xy.x)>Clicksize || abs(p.y-m->xy.y)>Clicksize)
641 b330c942 2005-10-31 devnull return;
642 b330c942 2005-10-31 devnull switch(button){
643 b330c942 2005-10-31 devnull case 1:
644 b330c942 2005-10-31 devnull if(scroll(1, p))
645 b330c942 2005-10-31 devnull break;
646 b330c942 2005-10-31 devnull if(history){
647 b330c942 2005-10-31 devnull /* click clears display */
648 b330c942 2005-10-31 devnull lockdisplay(display);
649 b330c942 2005-10-31 devnull for(i=0; i<nfaces; i++)
650 b330c942 2005-10-31 devnull freeface(faces[i]);
651 b330c942 2005-10-31 devnull free(faces);
652 b330c942 2005-10-31 devnull faces=nil;
653 b330c942 2005-10-31 devnull nfaces = 0;
654 b330c942 2005-10-31 devnull unlockdisplay(display);
655 b330c942 2005-10-31 devnull eresized(0);
656 b330c942 2005-10-31 devnull return;
657 b330c942 2005-10-31 devnull }else{
658 b330c942 2005-10-31 devnull for(i=first; i<last; i++) /* clear vwhois faces */
659 b330c942 2005-10-31 devnull if(ptinrect(p, facerect(i-first))
660 b330c942 2005-10-31 devnull && strstr(faces[i]->str[Sshow], "/XXXvwhois")){
661 b330c942 2005-10-31 devnull delface(i);
662 b330c942 2005-10-31 devnull flushimage(display, 1);
663 b330c942 2005-10-31 devnull }
664 b330c942 2005-10-31 devnull }
665 b330c942 2005-10-31 devnull break;
666 b330c942 2005-10-31 devnull case 2:
667 b330c942 2005-10-31 devnull scroll(2, p);
668 b330c942 2005-10-31 devnull break;
669 b330c942 2005-10-31 devnull case 3:
670 b330c942 2005-10-31 devnull scroll(3, p);
671 b330c942 2005-10-31 devnull lockdisplay(display);
672 b330c942 2005-10-31 devnull for(i=first; i<last; i++)
673 b330c942 2005-10-31 devnull if(ptinrect(p, facerect(i-first))){
674 b330c942 2005-10-31 devnull showmail(faces[i]);
675 b330c942 2005-10-31 devnull break;
676 b330c942 2005-10-31 devnull }
677 b330c942 2005-10-31 devnull unlockdisplay(display);
678 b330c942 2005-10-31 devnull break;
679 b330c942 2005-10-31 devnull }
680 b330c942 2005-10-31 devnull }
681 b330c942 2005-10-31 devnull
682 b330c942 2005-10-31 devnull void
683 b330c942 2005-10-31 devnull mouseproc(void *dummy)
684 b330c942 2005-10-31 devnull {
685 b330c942 2005-10-31 devnull Mouse mouse;
686 b330c942 2005-10-31 devnull
687 b330c942 2005-10-31 devnull while(getmouse(&mouse)){
688 b330c942 2005-10-31 devnull if(mouse.buttons == 1)
689 b330c942 2005-10-31 devnull click(1, &mouse);
690 b330c942 2005-10-31 devnull else if(mouse.buttons == 2)
691 b330c942 2005-10-31 devnull click(2, &mouse);
692 b330c942 2005-10-31 devnull else if(mouse.buttons == 4)
693 b330c942 2005-10-31 devnull click(3, &mouse);
694 b330c942 2005-10-31 devnull
695 b330c942 2005-10-31 devnull while(mouse.buttons)
696 b330c942 2005-10-31 devnull getmouse(&mouse);
697 b330c942 2005-10-31 devnull }
698 b330c942 2005-10-31 devnull }
699 b330c942 2005-10-31 devnull
700 b330c942 2005-10-31 devnull void
701 b330c942 2005-10-31 devnull killall(char *s)
702 b330c942 2005-10-31 devnull {
703 b330c942 2005-10-31 devnull int i, pid;
704 b330c942 2005-10-31 devnull
705 b330c942 2005-10-31 devnull pid = getpid();
706 b330c942 2005-10-31 devnull for(i=0; i<NPROC; i++)
707 b330c942 2005-10-31 devnull if(pids[i] && pids[i]!=pid)
708 b330c942 2005-10-31 devnull postnote(PNPROC, pids[i], "kill");
709 b330c942 2005-10-31 devnull threadexitsall(s);
710 b330c942 2005-10-31 devnull }
711 b330c942 2005-10-31 devnull
712 b330c942 2005-10-31 devnull void
713 b330c942 2005-10-31 devnull startproc(void (*f)(void), int index)
714 b330c942 2005-10-31 devnull {
715 b330c942 2005-10-31 devnull int pid;
716 b330c942 2005-10-31 devnull
717 b330c942 2005-10-31 devnull switch(pid = rfork(RFPROC|RFNOWAIT)){ //jpc removed |RFMEM
718 b330c942 2005-10-31 devnull case -1:
719 b330c942 2005-10-31 devnull fprint(2, "faces: fork failed: %r\n");
720 b330c942 2005-10-31 devnull killall("fork failed");
721 b330c942 2005-10-31 devnull case 0:
722 b330c942 2005-10-31 devnull f();
723 b330c942 2005-10-31 devnull fprint(2, "faces: %s process exits\n", procnames[index]);
724 b330c942 2005-10-31 devnull if(index >= 0)
725 b330c942 2005-10-31 devnull killall("process died");
726 b330c942 2005-10-31 devnull threadexitsall(nil);
727 b330c942 2005-10-31 devnull }
728 b330c942 2005-10-31 devnull if(index >= 0)
729 b330c942 2005-10-31 devnull pids[index] = pid;
730 b330c942 2005-10-31 devnull }
731 b330c942 2005-10-31 devnull
732 b330c942 2005-10-31 devnull void
733 b330c942 2005-10-31 devnull usage(void)
734 b330c942 2005-10-31 devnull {
735 b330c942 2005-10-31 devnull fprint(2, "usage: faces [-hi] [-m maildir] -W winsize\n");
736 b330c942 2005-10-31 devnull threadexitsall("usage");
737 b330c942 2005-10-31 devnull }
738 b330c942 2005-10-31 devnull
739 b330c942 2005-10-31 devnull void
740 b330c942 2005-10-31 devnull threadmain(int argc, char *argv[])
741 b330c942 2005-10-31 devnull {
742 b330c942 2005-10-31 devnull int i;
743 b330c942 2005-10-31 devnull
744 b330c942 2005-10-31 devnull ARGBEGIN{
745 b330c942 2005-10-31 devnull case 'h':
746 b330c942 2005-10-31 devnull history++;
747 b330c942 2005-10-31 devnull break;
748 b330c942 2005-10-31 devnull case 'i':
749 b330c942 2005-10-31 devnull initload++;
750 b330c942 2005-10-31 devnull break;
751 b330c942 2005-10-31 devnull case 'm':
752 b330c942 2005-10-31 devnull addmaildir(EARGF(usage()));
753 b330c942 2005-10-31 devnull maildir = nil;
754 b330c942 2005-10-31 devnull break;
755 b330c942 2005-10-31 devnull case 'W':
756 b330c942 2005-10-31 devnull winsize = EARGF(usage());
757 b330c942 2005-10-31 devnull break;
758 b330c942 2005-10-31 devnull default:
759 b330c942 2005-10-31 devnull usage();
760 b330c942 2005-10-31 devnull }ARGEND
761 b330c942 2005-10-31 devnull
762 b330c942 2005-10-31 devnull if(initdraw(nil, nil, "faces") < 0){
763 b330c942 2005-10-31 devnull fprint(2, "faces: initdraw failed: %r\n");
764 b330c942 2005-10-31 devnull threadexitsall("initdraw");
765 b330c942 2005-10-31 devnull }
766 b330c942 2005-10-31 devnull if(maildir)
767 b330c942 2005-10-31 devnull addmaildir(maildir);
768 b330c942 2005-10-31 devnull init();
769 b330c942 2005-10-31 devnull unlockdisplay(display); /* initdraw leaves it locked */
770 b330c942 2005-10-31 devnull display->locking = 1; /* tell library we're using the display lock */
771 b330c942 2005-10-31 devnull setdate();
772 b330c942 2005-10-31 devnull eresized(0);
773 b330c942 2005-10-31 devnull
774 b330c942 2005-10-31 devnull pids[Mainp] = getpid();
775 b330c942 2005-10-31 devnull pids[Timep] = proccreate(timeproc, nil, 16000);
776 b330c942 2005-10-31 devnull pids[Mousep] = proccreate(mouseproc, nil, 16000);
777 b330c942 2005-10-31 devnull if(initload)
778 b330c942 2005-10-31 devnull for(i = 0; i < nmaildirs; i++)
779 b330c942 2005-10-31 devnull loadmboxfaces(maildirs[i]);
780 b330c942 2005-10-31 devnull faceproc();
781 b330c942 2005-10-31 devnull fprint(2, "faces: %s process exits\n", procnames[Mainp]);
782 b330c942 2005-10-31 devnull killall(nil);
783 b330c942 2005-10-31 devnull }