21 Keyshade = 0xaaaa55ff,
30 char *lines[24]; /* plus one so last line gets terminated by getfields */
40 int ctldeletequits = 1;
45 resizecontrolset(Controlset *cs)
54 if(getwindow(display, Refnone) < 0)
55 ctlerror("resize failed: %r");
56 draw(screen, screen->r, cols[Back], nil, ZP);
57 r = insetrect(screen->r, 4);
58 for(i=0; i<Nline; i++){
59 r.max.y = r.min.y + font->height;
60 ctlprint(entry[i], "rect %R", r);
61 ctlprint(entry[i], "show");
68 r.max.y = screen->r.max.y;
69 r.min.y = r.max.y - 2*2 - 5*13;
70 if(r.min.y >= r.max.y)
74 r.max.x = (3*r.max.x + r.min.x)/4;
75 ctlprint(kbd, "rect %R", r);
76 ctlprint(kbd, "show");
78 r1.min.x = (3*r1.max.x + r1.min.x)/4;
79 ctlprint(scrib, "rect %R", r1);
80 ctlprint(scrib, "show");
93 fprint(2, "prompter: can't open %s: %r\n", s);
98 fprint(2, "prompter: can't stat %s: %r\n", s);
101 buf = ctlmalloc(d->length+1); /* +1 for NUL on end */
102 if(read(fd, buf, d->length) != d->length){
103 fprint(2, "prompter: can't read %s: %r\n", s);
106 nline = getfields(buf, lines, nelem(lines), 0, "\n");
122 if(m.buttons & 0x20) {
123 sendp(eventchan, "mouse: exit");
127 send(keyboard->mousec, &m);
129 send(text->mousec, &m);
143 send(keyboard->resizec, nil);
144 send(text->resizec, nil);
154 fd = create(s, OWRITE, 0666);
156 fprint(2, "prompter: can't create %s: %r\n", s);
160 for(n=Nline; --n>=0; )
161 if(lines[n][0] != '\0')
165 fprint(fd, "%s\n", lines[i]);
172 fprint(2, "usage: prompter file\n");
173 threadexitsall("usage");
177 threadmain(int argc, char *argv[])
182 char buf[32], *args[3];
186 Channel *mtok, *mtot, *ktok, *rtok, *rtot;
203 initdraw(0, 0, "prompter");
204 mousectl = initmouse(nil, screen);
205 kbdctl = initkeyboard(nil);
207 mtok = chancreate(sizeof(Mouse), 0);
208 mtot = chancreate(sizeof(Mouse), 0);
209 ktok = chancreate(sizeof(Rune), 20);
210 rtok = chancreate(sizeof(int), 2);
211 rtot = chancreate(sizeof(int), 2);
215 keyboard = newcontrolset(screen, ktok, mtok, rtok);
216 text = newcontrolset(screen, kbdctl->c, mtot, rtot);
217 text->clicktotype = 1;
219 threadcreate(mousemux, mousectl->c, 4096);
220 threadcreate(resizemux, mousectl->resizec, 4096);
222 eventchan = chancreate(sizeof(char*), 0);
224 cols[Back] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, Keyback);
225 namectlimage(cols[Back], "keyback");
226 cols[Light] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, Keylight);
227 namectlimage(cols[Light], "keylight");
228 cols[Shade] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, Keyshade);
229 namectlimage(cols[Shade], "keyshade");
230 cols[Mask] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, Keymask);
231 namectlimage(cols[Shade], "keymask");
232 f = openfont(display, "/lib/font/bit/lucidasans/boldlatin1.6.font");
233 namectlfont(f, "bold");
234 f = openfont(display, "/lib/font/bit/lucidasans/unicode.6.font");
235 namectlfont(f, "roman");
238 Nline = (screen->r.max.y - 2*2 - 5*13 - 8)/font->height;
239 if (Nline > nelem(entry)) Nline = nelem(entry);
241 for(i=0; i<Nline; i++){
242 snprint(buf, sizeof buf, "line.%.2d", i);
243 entry[i] = createentry(text, buf);
244 ctlprint(entry[i], "font roman");
245 ctlprint(entry[i], "image keyback");
247 ctlprint(entry[i], "value %q", lines[i]);
248 controlwire(entry[i], "event", eventchan);
252 kbd = createkeyboard(keyboard, "keyboard");
253 ctlprint(kbd, "font bold roman");
254 ctlprint(kbd, "image keyback");
255 ctlprint(kbd, "light keylight");
256 ctlprint(kbd, "mask keymask");
257 ctlprint(kbd, "border 1");
258 controlwire(kbd, "event", eventchan);
262 scrib = createscribble(keyboard, "scribble");
263 ctlprint(scrib, "font bold");
264 ctlprint(scrib, "image keyback");
265 ctlprint(scrib, "border 1");
266 controlwire(scrib, "event", eventchan);
272 resizecontrolset(keyboard);
275 s = recvp(eventchan);
276 n = tokenize(s, args, nelem(args));
277 if(n == 2 && strcmp(args[0], "mouse:")==0 && strcmp(args[1], "exit")==0)
280 if(strcmp(args[0], "keyboard:")==0 || strcmp(args[0], "scribble:")==0)
281 if(strcmp(args[1], "value") == 0){
282 n = strtol(args[2], 0, 0);
283 if(n == '\033') /* Escape exits */
292 for(i=0; i<Nline; i++){
293 ctlprint(entry[i], "data");
294 lines[i] = ctlstrdup(recvp(entry[i]->data));
299 draw(screen, screen->r, display->white, nil, ZP);
300 flushimage(display, 1);