--- ../others/plan9front/sys/src/games/blit/blit.c 2017-04-26 21:26:05.918471287 +0200 +++ blit.c 2017-04-14 15:55:19.338245717 +0200 @@ -10,7 +10,6 @@ int baud = 40000; int scale = 1; -Rectangle picr; Image *tmp, *bg; Channel *keych, *uartrxch, *uarttxch; Mousectl *mc; @@ -22,14 +21,11 @@ Rectangle updated; u32int colbgv, colfgv; Image *colbg, *colfg; int realcolors; +Keyboardctl *keyboard; static void screeninit(void) { - Point p; - - p = divpt(addpt(screen->r.min, screen->r.max), 2); - picr = (Rectangle){subpt(p, Pt(scale * SX/2, scale * SY/2)), addpt(p, Pt(scale * SX/2, scale * SY/2))}; if(tmp != nil) freeimage(tmp); tmp = allocimage(display, Rect(0, 0, scale * SX, scale > 1 ? 1 : scale * SY), CHAN1(CMap, 1), scale > 1, 0); if(bg != nil) freeimage(bg); @@ -50,15 +46,15 @@ redraw(void) Mouse m; Rectangle r; - if(nbrecvul(mc->resizec) > 0){ + if((long)nbrecvul(mc->resizec) > 0){ if(getwindow(display, Refnone) < 0) sysfatal("resize failed: %r"); screeninit(); } while(nbrecv(mc->c, &m) > 0){ - if(ptinrect(m.xy, picr)){ - mousex = picr.max.x - m.xy.x - 1; - mousey = picr.max.y - m.xy.y - 1; + if(ptinrect(m.xy, screen->r)){ + mousex = screen->r.max.x - m.xy.x - 1; + mousey = screen->r.max.y - m.xy.y - 1; } n = m.buttons >> 2 & 1 | m.buttons & 2 | m.buttons << 2 & 4; if(n != mousebut){ @@ -88,44 +84,41 @@ redraw(void) loadimage(tmp, r, pic+o, Dy(r)*(SX/8)); if(realcolors){ - draw(screen, rectaddpt(r, picr.min), colfg, nil, r.min); - draw(screen, rectaddpt(r, picr.min), colbg, tmp, r.min); + draw(screen, rectaddpt(r, screen->r.min), colfg, nil, r.min); + draw(screen, rectaddpt(r, screen->r.min), colbg, tmp, r.min); }else - draw(screen, rectaddpt(r, picr.min), tmp, nil, r.min); + draw(screen, rectaddpt(r, screen->r.min), tmp, nil, r.min); updated = Rect(SX, SY, 0, 0); flushimage(display, 1); } static uchar keymap[] = { - [Kup-KF] 0xf1, - [Kdown-KF] 0xf2, - [Kleft-KF] 0xf3, - [Kright-KF] 0xf4, - [1] 0xf6, /* PF1 */ - [2] 0xf7, /* PF2 */ - [3] 0xf8, /* PF3 */ - [4] 0xf9, /* PF4 */ - [12] 0xfe, /* SET-UP */ - [Kpgdown-KF] 0xb0, /* SCROLL */ - [Kins-KF] 0xe0, /* BREAK */ + [Kup-KF] = 0xf1, +// [Kdown-KF] = 0xf2, + [0x80] = 0xf2, + [Kleft-KF] = 0xf3, + [Kright-KF] = 0xf4, + [1] = 0xf6, /* PF1 */ + [2] = 0xf7, /* PF2 */ + [3] = 0xf8, /* PF3 */ + [4] = 0xf9, /* PF4 */ + [12] = 0xfe, /* SET-UP */ + [Kpgdown-KF] = 0xb0, /* SCROLL */ + [Kins-KF] = 0xe0, /* BREAK */ }; - +/* static void -keyproc(void *) +keyproc(void *unused) { - int fd, cfd, ch, rc; + int fd, ch, rc; static char buf[256]; char *p; Rune r; - fd = open("/dev/cons", OREAD); + fd = open("/dev/tty", OREAD); if(fd < 0) sysfatal("open: %r"); - cfd = open("/dev/consctl", OWRITE); - if(cfd < 0) - sysfatal("open: %r"); - fprint(cfd, "rawon"); for(;;){ rc = read(fd, buf, sizeof(buf) - 1); if(rc <= 0) @@ -146,6 +139,29 @@ keyproc(void *) } } } +*/ + +static void +keyproc(void *unused) +{ + int ch; + Rune r; + + for(;;){ + recv(keyboard->c, &r); + if(r == Kend) + threadexitsall(nil); + ch = r; + if(ch == '\n') ch = '\r'; + else if(ch >= KF){ + if(ch >= KF + nelem(keymap)) continue; + ch = keymap[ch - KF]; + if(ch == 0) continue; + }else if(ch >= 0x80) continue; + //fprint(2, "%s", ch); + send(keych, &ch); + } +} void usage(void) @@ -157,12 +173,13 @@ usage(void) void threadmain(int argc, char **argv) { - int n; + int n, ms; static Cursor blank; char *telnet; char *p; extern int diag; + ms = 0; telnet = nil; ARGBEGIN{ case 'b': @@ -184,6 +201,9 @@ threadmain(int argc, char **argv) case 'd': diag++; break; + case 'm': + ms++; + break; default: usage(); }ARGEND; if(argc != 0) usage(); @@ -197,11 +217,13 @@ threadmain(int argc, char **argv) sysfatal("initdraw: %r"); screeninit(); + keyboard = initkeyboard(nil); proccreate(keyproc, nil, mainstacksize); mc = initmouse(nil, screen); if(mc == nil) sysfatal("initmouse: %r"); - setcursor(mc, &blank); + if(!ms) + setcursor(mc, &blank); cpureset(); for(;;){