#include #include #include #include #include #include #include #include "flayer.h" #include "samterm.h" int cursorfd; int plumbfd = -1; int input; int got; int block; int kbdc; int resized; uchar *hostp; uchar *hoststop; uchar *plumbbase; uchar *plumbp; uchar *plumbstop; Channel *plumbc; Channel *hostc; Mousectl *mousectl; Mouse *mousep; Keyboardctl *keyboardctl; void panic(char*); void initio(void) { threadsetname("main"); mousectl = initmouse(nil, display->image); if(mousectl == nil){ fprint(2, "samterm: mouse init failed: %r\n"); threadexitsall("mouse"); } mousep = mousectl; keyboardctl = initkeyboard(nil); if(keyboardctl == nil){ fprint(2, "samterm: keyboard init failed: %r\n"); threadexitsall("kbd"); } hoststart(); if(plumbstart() < 0) extstart(); } void getmouse(void) { if(readmouse(mousectl) < 0) panic("mouse"); } void mouseunblock(void) { got &= ~(1<buttons&(1<<(but-1)); } void externload(int i) { plumbbase = malloc(plumbbuf[i].n); if(plumbbase == 0) return; memmove(plumbbase, plumbbuf[i].data, plumbbuf[i].n); plumbp = plumbbase; plumbstop = plumbbase + plumbbuf[i].n; got |= 1<c; alts[RKeyboard].v = &r; alts[RKeyboard].op = CHANRCV; if(block & (1<c; alts[RMouse].v = &mousectl->Mouse; alts[RMouse].op = CHANRCV; if(block & (1<resizec; alts[RResize].v = nil; alts[RResize].op = CHANRCV; if(block & (1<= plumbstop){ got &= ~(1<= 0) return 1; if(nbrecv(keyboardctl->c, &r) > 0){ kpeekc = r; return 1; } return 0; } int ekbd(void) { int c; Rune r; if(kpeekc >= 0){ c = kpeekc; kpeekc = -1; return c; } if(recv(keyboardctl->c, &r) < 0){ fprint(2, "samterm: keybard recv error: %r\n"); panic("kbd"); } return r; } int kbdchar(void) { int c, i; c = externchar(); if(c > 0) return c; if(got & (1<0){ externload(i); c = externchar(); if(c > 0) return c; } if(!ecankbd()) return -1; return ekbd(); } int qpeekc(void) { return kbdc; } int RESIZED(void) { if(resized){ if(getwindow(display, Refnone) < 0) panic("can't reattach to window"); resized = 0; return 1; } return 0; }