11 typedef struct Win Win;
31 Rectangle r, rk, rs, rw;
32 Font *keyfont, *keyctlfont;
48 Keyshade = 0xaaaa55ff,
60 int ctldeletequits = 1;
70 if ((wctl = open("/dev/wctl", ORDWR)) < 0)
72 n = read(wctl, buf, sizeof buf-1);
74 sysfatal("wctl read: %r");
76 return strstr(buf, "visible") == nil;
88 for(ob = 0;;ob = m.buttons){
91 if ((m.buttons & 0x20) == 0) {
93 /* hide button just came up */
95 if (debug) fprint(2, "unhide");
96 if (fprint(wctl, "unhide") <= 0)
97 fprint(2, "unhide failed: %r\n");
99 if (debug) fprint(2, "hide");
100 if (fprint(wctl, "hide") <= 0)
101 fprint(2, "hide failed: %r\n");
104 send(cs->mousec, &m);
113 int i, fd, lfd, n, nr, nw, m;
116 if((fd = open("/dev/wsys", OREAD)) < 0)
120 /* i'd rather read one at a time but rio won't let me */
121 while((nr=dirread(fd, &pd)) > 0){
123 n = atoi(pd[i].name);
124 sprint(label, "/dev/wsys/%d/label", n);
125 if((lfd = open(label, OREAD)) < 0)
127 m = read(lfd, label, sizeof(label)-1);
132 if(nw < nwin && win[nw].n == n && strcmp(win[nw].label, label)==0){
143 win = ctlrealloc(win, mwin*sizeof(win[0]));
144 memset(&win[mwin-8], 0, 8*sizeof(win[0]));
147 win[nw].label = ctlstrdup(label);
149 sprint(label, "%d", nw);
150 if (win[nw].button == nil){
151 win[nw].button = createtextbutton(cs, label);
152 chanprint(cs->ctl, "%q font keyfont", label);
153 chanprint(cs->ctl, "%q image keyback", label);
154 chanprint(cs->ctl, "%q pressedtextcolor red", label);
155 chanprint(cs->ctl, "%q mask transparent", label);
156 chanprint(cs->ctl, "%q border 1", label);
157 chanprint(cs->ctl, "%q bordercolor black", label);
158 chanprint(cs->ctl, "%q align centerleft", label);
159 chanprint(cs->ctl, "%q size 16 %d 512 %d", label, keyfont->height+2, keyfont->height+2);
160 controlwire(win[nw].button, "event", ec);
163 activate(win[nw].button);
164 chanprint(cs->ctl, "cols add %q", label);
166 chanprint(cs->ctl, "%q text %q", win[nw].button->name, win[nw].label);
170 for(i = nw; i < nwin; i++){
173 deactivate(win[i].button);
174 chanprint(cs->ctl, "cols remove %q", win[i].button->name);
179 chanprint(cs->ctl, "cols rect %R\ncols show", rw);
183 resizecontrolset(Controlset*)
189 if(getwindow(display, Refnone) < 0)
190 ctlerror("resize failed: %r");
193 if (debug) fprint(2, "resizecontrolset: hidden\n");
197 fd = open("/dev/screen", OREAD);
199 r = display->image->r;
200 if (debug) fprint(2, "display->imgae->r: %R\n", r);
202 if (read(fd, buf, 60) != 60)
203 sysfatal("resizecontrolset: read: /dev/screen: %r");
206 r.min.x = atoi(buf+1+1*12);
207 r.min.y = atoi(buf+1+2*12);
208 r.max.x = atoi(buf+1+3*12);
209 r.max.y = atoi(buf+1+4*12);
210 if (debug) fprint(2, "/dev/screen: %R\n", r);
213 r.min.y = r.max.y - kbdheight - 2*Borderwidth;
214 if (debug) fprint(2, "before eqrect: %R\n", r);
215 if (eqrect(r, screen->r) == 0) {
216 if (debug) fprint(2, "resizecontrolset: resize %R\n", r);
217 if (fprint(wctl, "resize -r %R", insetrect(r, -4)) <= 0) {
218 fprint(2, "resizecontrolset: resize failed\n");
223 if (debug) fprint(2, "after eqrect: %R\n", r);
227 rw.min.x = (3*rk.max.x + rk.min.x)/4;
229 if (debug) fprint(2, "rw: rect %R\n", rw);
230 chanprint(cs->ctl, "cols rect %R\ncols show", rw);
233 chanprint(cs->ctl, "keyboard rect %R\nkeyboard show", rk);
237 rk.min.x = (rk.max.x + 3*rk.min.x)/4;
240 rk.max.x = (3*rk.max.x + rk.min.x)/4;
243 chanprint(cs->ctl, "keyboard rect %R\nkeyboard show", rk);
244 if (debug) fprint(2, "rk: rect %R\nkeyboard show\n", rk);
245 chanprint(cs->ctl, "scribble rect %R\nscribble show", rs);
246 if (debug) fprint(2, "rs: rect %R\nscribble show\n", rs);
253 fprint(2, "usage: keyboard\n");
254 threadexitsall("usage");
277 threadmain(int argc, char *argv[])
284 char *e, buf[128], *args[8];
308 kbdfd = open("/dev/kbdin", OWRITE);
309 if (kbdfd < 0 && (kbdfd = open("#r/kbdin", OWRITE)) < 0) {
310 if (debug) fprint(2, "open %s: %r\n", "#r/kbdin");
314 initdraw(0, 0, "keyboard");
315 mousectl = initmouse(nil, screen);
317 wctl = open("/dev/wctl", ORDWR);
319 fprint(2, "open %s: %r\n", "/dev/wctl");
320 wctl = 2; /* for debugging */
323 mtok = chancreate(sizeof(Mouse), 0);
327 cs = newcontrolset(screen, nil, mtok, mousectl->resizec);
329 threadcreate(mousemux, mousectl->c, 4096);
331 kc = chancreate(sizeof(char*), 0);
332 tc = chancreate(sizeof(int), 1);
333 ec = chancreate(sizeof(char*), 1);
335 colors[Back] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, Keyback);
336 namectlimage(colors[Back], "keyback");
337 colors[Light] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, Keylight);
338 namectlimage(colors[Light], "keylight");
339 colors[Shade] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, Keyshade);
340 namectlimage(colors[Shade], "keyshade");
341 colors[Mask] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, Keymask);
342 namectlimage(colors[Shade], "keymask");
343 keyfont = openfont(display, "/lib/font/bit/lucidasans/boldlatin1.6.font");
344 namectlfont(keyfont, "keyfont");
345 keyctlfont = openfont(display, "/lib/font/bit/lucidasans/unicode.6.font");
346 namectlfont(keyctlfont, "keyctlfont");
348 kbd = createkeyboard(cs, "keyboard");
349 chanprint(cs->ctl, "keyboard font keyfont keyctlfont");
350 chanprint(cs->ctl, "keyboard image keyback");
351 chanprint(cs->ctl, "keyboard light keylight");
352 chanprint(cs->ctl, "keyboard mask keymask");
353 chanprint(cs->ctl, "keyboard border 1");
354 chanprint(cs->ctl, "keyboard size %d %d %d %d", 246, 2 + 5 * (keyfont->height + 1), 512, 256);
355 controlwire(kbd, "event", kc);
358 scrib = createscribble(cs, "scribble");
360 sysfatal("createscribble");
361 chanprint(cs->ctl, "scribble font keyfont");
362 chanprint(cs->ctl, "scribble image keyback");
363 chanprint(cs->ctl, "scribble border 1");
364 controlwire(scrib, "event", kc);
368 boxbox = createboxbox(cs, "cols");
370 chanprint(cs->ctl, "cols border 2");
371 chanprint(cs->ctl, "cols bordercolor keyback");
374 resizecontrolset(nil);
381 proccreate(timerproc, tc, 2048);
389 { nil, nil, CHANEND }
392 case 0: /* Keyboard */
393 n = tokenize(e, args, nelem(args));
395 if(strcmp(args[0], "keyboard:")==0 || strcmp(args[0], "scribble:")==0)
396 if(strcmp(args[1], "value") == 0){
400 i = runetochar(str, &r);
401 write(kbdfd, str, i);
405 case 1: /* Button event */
406 n = tokenize(e, args, nelem(args));
407 if (n != 3 || strcmp(args[1], "value"))
408 sysfatal("event string");
410 if (i < 0 || i >= nwin)
411 sysfatal("win out of range: %d of %d", i, nwin);
414 sprint(buf, "/dev/wsys/%d/wctl", win[i].n);
415 if((fd = open(buf, OWRITE)) >= 0){
416 while (write(fd, "top\n", 4) < 0) {
417 /* wait until mouse comes up */
418 rerrstr(buf, sizeof buf);
419 if (strncmp(buf, "action disallowed when mouse active", sizeof buf)){
420 fprint(2, "write top: %s\n", buf);
425 if (write(fd, "current\n", 8) < 0)
426 fprint(2, "write current: %r\n");
429 chanprint(cs->ctl, "%q value 0", win[i].button->name);