From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/cmd/kbmap.c | 256 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100755 sys/src/cmd/kbmap.c (limited to 'sys/src/cmd/kbmap.c') diff --git a/sys/src/cmd/kbmap.c b/sys/src/cmd/kbmap.c new file mode 100755 index 000000000..d5cc99387 --- /dev/null +++ b/sys/src/cmd/kbmap.c @@ -0,0 +1,256 @@ +#include +#include +#include +#include + +typedef struct KbMap KbMap; +struct KbMap { + char *name; + char *file; + Rectangle r; + int current; +}; + +KbMap *map; +int nmap; +Image *lightblue; +Image *justblue; + +enum { + PAD = 3, + MARGIN = 5 +}; + +char *dir = "/sys/lib/kbmap"; + +void* +erealloc(void *v, ulong n) +{ + v = realloc(v, n); + if(v == nil) + sysfatal("out of memory reallocating %lud", n); + return v; +} + +void* +emalloc(ulong n) +{ + void *v; + + v = malloc(n); + if(v == nil) + sysfatal("out of memory allocating %lud", n); + memset(v, 0, n); + return v; +} + +char* +estrdup(char *s) +{ + int l; + char *t; + + if (s == nil) + return nil; + l = strlen(s)+1; + t = emalloc(l); + memcpy(t, s, l); + + return t; +} + +void +init(void) +{ + int i, fd, nr; + Dir *pd; + char buf[128]; + + if((fd = open(dir, OREAD)) < 0) + return; + + nmap = nr = dirreadall(fd, &pd); + map = emalloc(nr * sizeof(KbMap)); + for(i=0; iblack, ZP, + font, map[i].name, nil, strlen(map[i].name), + map[i].r, nil, ZP, SoverD); + border(screen, map[i].r, 1, display->black, ZP); +} + +void +geometry(void) +{ + int i, rows; + Rectangle r; + + rows = (Dy(screen->r)-2*MARGIN+PAD)/(font->height+PAD); + + r = Rect(0,0,(Dx(screen->r)-2*MARGIN), font->height); + for(i=0; ir.min); + +} + +void +redraw(Image *screen) +{ + int i; + + draw(screen, screen->r, lightblue, nil, ZP); + for(i=0; i 0) + if(write(ofd, buf, i) != i){ + fprint(2, "writing /dev/kbmap: %r"); + break; + } + + close(fd); + close(ofd); + return 0; +} + +void +click(Mouse m) +{ + int i, j; + char buf[128]; + + if(m.buttons == 0 || (m.buttons & ~4)) + return; + + for(i=0; i 1) { + argv++; argc--; + map = emalloc((argc)*sizeof(KbMap)); + while(argc--) { + map[argc].file = estrdup(argv[argc]); + c = strrchr(map[argc].file, '/'); + map[argc].name = (c == nil ? map[argc].file : c+1); + map[argc].current = 0; + nmap++; + } + } else + init(); + + initdraw(0, 0, "kbmap"); + lightblue = allocimagemix(display, DPalebluegreen, DWhite); + if(lightblue == nil) + sysfatal("allocimagemix: %r"); + justblue = allocimagemix(display, DBlue, DWhite); + if(justblue == nil) + sysfatal("allocimagemix: %r"); + + eresized(0); + einit(Emouse|Ekeyboard); + + for(;;){ + switch(eread(Emouse|Ekeyboard, &e)){ + case Ekeyboard: + if(e.kbdc==0x7F || e.kbdc=='q') + exits(0); + break; + case Emouse: + if(e.mouse.buttons) + click(e.mouse); + break; + } + } +} + -- cgit v1.2.3