static void mouseclose(Chan *c) { if((c->qid.type&QTDIR)==0 && (c->flag&COPEN)){ if(c->qid.path == Qsnarf){ if(c->mode == OWRITE){ if(c->aux) putsnarf(c->aux); else putsnarf(""); } free(c->aux); } lock(&mouse.ref.lk); if(c->qid.path == Qmouse) mouse.open = 0; if(--mouse.ref.ref == 0){ curs = arrow; Cursortocursor(&arrow); } unlock(&mouse.ref.lk); if(c->qid.path == Qmouse) termredraw(); } }
void acmeputsnarf(void) { int i, n; Fmt f; char *s; if(snarfbuf.nc==0) return; if(snarfbuf.nc > MAXSNARF) return; fmtstrinit(&f); for(i=0; i<snarfbuf.nc; i+=n){ n = snarfbuf.nc-i; if(n >= NSnarf) n = NSnarf; bufread(&snarfbuf, i, snarfrune, n); if(fmtprint(&f, "%.*S", n, snarfrune) < 0) break; } s = fmtstrflush(&f); if(s && s[0]) putsnarf(s); free(s); }
void pagesnarf(Page *p) { Runestr rs; memset(&rs, 0, sizeof(Runestr)); laysnarf(p, p->lay, &rs); putsnarf(&rs); closerunestr(&rs); }
int snarfswap(char *fromsam, int nc, char **tosam) { char *s; s = getsnarf(); putsnarf(fromsam); *tosam = s; return s ? strlen(s) : 0; }
/* * Handle a single wsysmsg. * Might queue for later (kbd, mouse read) */ void runmsg(Wsysmsg *m) { static uchar buf[65536]; int n; Memimage *i; switch(m->type){ case Tinit: memimageinit(); i = attachscreen(m->label, m->winsize); _initdisplaymemimage(i); replymsg(m); break; case Trdmouse: zlock(); mousetags.t[mousetags.wi++] = m->tag; if(mousetags.wi == nelem(mousetags.t)) mousetags.wi = 0; if(mousetags.wi == mousetags.ri) sysfatal("too many queued mouse reads"); mouse.stall = 0; matchmouse(); zunlock(); break; case Trdkbd: zlock(); kbdtags.t[kbdtags.wi++] = m->tag; if(kbdtags.wi == nelem(kbdtags.t)) kbdtags.wi = 0; if(kbdtags.wi == kbdtags.ri) sysfatal("too many queued keyboard reads"); kbd.stall = 0; matchkbd(); zunlock(); break; case Tmoveto: setmouse(m->mouse.xy); replymsg(m); break; case Tcursor: if(m->arrowcursor) setcursor(nil); else setcursor(&m->cursor); replymsg(m); break; case Tbouncemouse: // _xbouncemouse(&m->mouse); replymsg(m); break; case Tlabel: kicklabel(m->label); replymsg(m); break; case Trdsnarf: m->snarf = getsnarf(); replymsg(m); free(m->snarf); break; case Twrsnarf: putsnarf(m->snarf); replymsg(m); break; case Trddraw: n = m->count; if(n > sizeof buf) n = sizeof buf; n = _drawmsgread(buf, n); if(n < 0) replyerror(m); else{ m->count = n; m->data = buf; replymsg(m); } break; case Twrdraw: if(_drawmsgwrite(m->data, m->count) < 0) replyerror(m); else replymsg(m); break; case Ttop: // _xtopwindow(); replymsg(m); break; case Tresize: // _xresizewindow(m->rect); replymsg(m); break; } }