#include #include #include #include #include extern Mouse mouse; static Image *offwhite; static Rectangle kbdrect; int kbdchar(void){ return ekbd(); } void paintkbd(char *kbdstr){ draw(screen, kbdrect, offwhite, nil, ZP); string(screen, addpt(kbdrect.min, Pt(1,1)), display->black, ZP, font, kbdstr); } static void getstr(char *s, char *start, int bs, int at){ char c; for(;;){ fprint(2, "for(;;)...\n"); if(((c=kbdchar()) == '\r') || (c == '\n')){ *s = '\0'; return; } fprint(2, "for(;;)...c=0x%x\n", c); if((c == bs) && (s>start)){ *--s = 0; }else if((c == at) && (s>start)){ s = start; *s = 0; }else if((c >= ' ') && (c <= '~') && (s-start<50)){ *s++ = c; *s = 0; } paintkbd(start); } } void kbordstr(char *str, char *start, int bs, int at){ Image *b, *red, *bord; Point p; Rectangle r; red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed); offwhite = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xEEEEEEFF); bord = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DBlack); p = mouse.xy; #define min(x,y) (((x) > (y)) ? (x) : (y)) p.x = min(p.x, screen->r.min.x-300); r = rectaddpt(Rect(0,0,300,font->height+4), p); b = allocimage(display, r, screen->chan, 0, 0); if(b == 0) b = screen; draw(b, r, screen, nil, r.min); draw(screen, r, offwhite, nil, ZP); border(screen, r, 1, bord, ZP); kbdrect = insetrect(r, 1); p = addpt(kbdrect.min, Pt(1,1)); p = string(screen, p, display->black, ZP, font, str); getstr(start+strlen((unsigned char *)start), start, bs, at); draw(screen, r, b, nil, r.min); if(b != screen) freeimage(b); flushimage(display, 1); /* in case display->locking is set */ } void kbdstr(char *s){ kbordstr(s, s+strlen((unsigned char *)s), '\b', '@'); }