void cut(Text *t, int w, int save, int check) { long p0, p1; Flayer *l; l = &t->l[w]; p0 = l->p0; p1 = l->p1; if(p0 == p1) return; if(p0 < 0) panic("cut"); if(save) snarf(t, w); outTsll(Tcut, t->tag, p0, p1); flsetselect(l, p0, p0); t->lock++; hcut(t->tag, p0, p1-p0); if(check) hcheck(t->tag); }
void type(Flayer *l, int res) /* what a bloody mess this is */ { Text *t = (Text *)l->user1; Rune buf[100]; Rune *p = buf; int c, backspacing; long a; int scrollkey, upkey; scrollkey = 0; upkey = 0; if(res == RKeyboard) { scrollkey = qpeekc()==SCROLLKEY; /* ICK */ upkey = qpeekc() == UPKEY; } if(lock || t->lock){ kbdblock(); return; } a = l->p0; if(a!=l->p1 && !scrollkey && !upkey){ flushtyping(1); cut(t, t->front, 1, 1); return; /* it may now be locked */ } backspacing = 0; while((c = kbdchar())>0){ if(res == RKeyboard){ if(c == UPKEY || c==SCROLLKEY || c==ESC) break; /* backspace, ctrl-u, ctrl-w, del, ctrl-x */ if(c=='\b' || c==0x15 || c==0x17 || c==0x7F || c==0x18){ backspacing = 1; break; } } *p++ = c; if(c == '\n' || p >= buf+sizeof(buf)/sizeof(buf[0])) break; } if(p > buf){ if(typestart < 0) typestart = a; if(typeesc < 0) typeesc = a; hgrow(t->tag, a, p-buf, 0); t->lock++; /* pretend we Trequest'ed for hdatarune*/ hdatarune(t->tag, a, buf, p-buf); a += p-buf; l->p0 = a; l->p1 = a; typeend = a; if(c=='\n' || typeend-typestart>100) flushtyping(0); onethird(l, a); } if(c == SCROLLKEY){ flushtyping(0); center(l, l->origin+l->f.nchars+1); } else if (c == UPKEY) { flushtyping(0); outTsll(Torigin, t->tag, l->origin, l->f.maxlines+1); /* backspacing immediately after outcmd(): sorry */ }else if(backspacing && !lock){ if(l->f.p0>0 && a>0){ switch(c){ case '\b': case 0x7F: /* del */ l->p0 = a-1; break; case 0x18: /* ctrl-x */ case 0x15: /* ctrl-u */ l->p0 = ctlu(&t->rasp, l->origin, a); break; case 0x17: /* ctrl-w */ l->p0 = ctlw(&t->rasp, l->origin, a); break; } l->p1 = a; if(l->p1 != l->p0){ /* cut locally if possible */ if(typestart<=l->p0 && l->p1<=typeend){ t->lock++; /* to call hcut */ hcut(t->tag, l->p0, l->p1-l->p0); /* hcheck is local because we know rasp is contiguous */ hcheck(t->tag); }else{ flushtyping(0); cut(t, t->front, 0, 1); } } if(typeesc >= l->p0) typeesc = l->p0; if(typestart >= 0){ if(typestart >= l->p0) typestart = l->p0; typeend = l->p0; if(typestart == typeend){ typestart = -1; typeend = -1; modified = 0; } } } }else{ if(c==ESC && typeesc>=0){ l->p0 = typeesc; l->p1 = a; flushtyping(1); } for(l=t->l; l<&t->l[NL]; l++) if(l->textfn) flsetselect(l, l->p0, l->p1); } }
void type(Flayer *l, int res) /* what a bloody mess this is */ { Text *t = (Text *)l->user1; Rune buf[100]; Rune *p = buf; int c, backspacing; int32_t a, a0; int scrollkey; scrollkey = 0; if(res == RKeyboard) scrollkey = nontypingkey(qpeekc()); /* ICK */ if(hostlock || t->lock){ kbdblock(); return; } a = l->p0; if(a!=l->p1 && !scrollkey){ flushtyping(1); cut(t, t->front, 1, 1); return; /* it may now be locked */ } backspacing = 0; while((c = kbdchar())>0){ if(res == RKeyboard){ if(nontypingkey(c) || c==ESC) break; /* backspace, ctrl-u, ctrl-w, del */ if(c=='\b' || c==0x15 || c==0x17 || c==0x7F){ backspacing = 1; break; } } *p++ = c; if(autoindent) if(c == '\n'){ /* autoindent */ int cursor, ch; cursor = ctlu(&t->rasp, 0, a+(p-buf)-1); while(p < buf+nelem(buf)){ ch = raspc(&t->rasp, cursor++); if(ch == ' ' || ch == '\t') *p++ = ch; else break; } } if(c == '\n' || p >= buf+sizeof(buf)/sizeof(buf[0])) break; } if(p > buf){ if(typestart < 0) typestart = a; if(typeesc < 0) typeesc = a; hgrow(t->tag, a, p-buf, 0); t->lock++; /* pretend we Trequest'ed for hdatarune*/ hdatarune(t->tag, a, buf, p-buf); a += p-buf; l->p0 = a; l->p1 = a; typeend = a; if(c=='\n' || typeend-typestart>100) flushtyping(0); onethird(l, a); } if(c==SCROLLKEY || c==PAGEDOWN){ flushtyping(0); center(l, l->origin+l->f.nchars+1); /* backspacing immediately after outcmd(): sorry */ }else if(c==BACKSCROLLKEY || c==PAGEUP){ flushtyping(0); a0 = l->origin-l->f.nchars; if(a0 < 0) a0 = 0; center(l, a0); }else if(c == RIGHTARROW){ flushtyping(0); a0 = l->p0; if(a0 < t->rasp.nrunes) a0++; flsetselect(l, a0, a0); center(l, a0); }else if(c == LEFTARROW){ flushtyping(0); a0 = l->p0; if(a0 > 0) a0--; flsetselect(l, a0, a0); center(l, a0); }else if(c == HOMEKEY){ flushtyping(0); center(l, 0); }else if(c == ENDKEY){ flushtyping(0); center(l, t->rasp.nrunes); }else if(c == LINESTART || c == LINEEND){ flushtyping(1); if(c == LINESTART) while(a > 0 && raspc(&t->rasp, a-1)!='\n') a--; else while(a < t->rasp.nrunes && raspc(&t->rasp, a)!='\n') a++; l->p0 = l->p1 = a; for(l=t->l; l<&t->l[NL]; l++) if(l->textfn) flsetselect(l, l->p0, l->p1); }else if(backspacing && !hostlock){ /* backspacing immediately after outcmd(): sorry */ if(l->f.p0>0 && a>0){ switch(c){ case '\b': case 0x7F: /* del */ l->p0 = a-1; break; case 0x15: /* ctrl-u */ l->p0 = ctlu(&t->rasp, l->origin, a); break; case 0x17: /* ctrl-w */ l->p0 = ctlw(&t->rasp, l->origin, a); break; } l->p1 = a; if(l->p1 != l->p0){ /* cut locally if possible */ if(typestart<=l->p0 && l->p1<=typeend){ t->lock++; /* to call hcut */ hcut(t->tag, l->p0, l->p1-l->p0); /* hcheck is local because we know rasp is contiguous */ hcheck(t->tag); }else{ flushtyping(0); cut(t, t->front, 0, 1); } } if(typeesc >= l->p0) typeesc = l->p0; if(typestart >= 0){ if(typestart >= l->p0) typestart = l->p0; typeend = l->p0; if(typestart == typeend){ typestart = -1; typeend = -1; modified = 0; } } } }else{ if(c==ESC && typeesc>=0){ l->p0 = typeesc; l->p1 = a; flushtyping(1); } for(l=t->l; l<&t->l[NL]; l++) if(l->textfn) flsetselect(l, l->p0, l->p1); } }
void type(Flayer *l, int res) /* what a bloody mess this is */ { Text *t = (Text *)l->user1; Rune buf[100]; Rune *p = buf; int c, backspacing; // long a, a0, a2, ao; long a, a0; int scrollkey; scrollkey = 0; if(res == RKeyboard) scrollkey = nontypingkey(qpeekc()); /* ICK */ if(hostlock || t->lock){ kbdblock(); return; } a = l->p0; if(a!=l->p1 && !scrollkey){ flushtyping(1); cut(t, t->front, 1, 1); return; /* it may now be locked */ } backspacing = 0; while((c = kbdchar())>0){ if(res == RKeyboard){ if(nontypingkey(c) || c==ESC) break; /* backspace, ctrl-u, ctrl-w, del */ //if(c=='\b' || c==0x15 || c==0x17 || c==0x7F){ if(c=='\b' || c==0x06 || c==0x17 || c==0x7F || c==0x11){ backspacing = 1; break; } } //*p++ = c; if(spacesindent && c == '\t'){ int i, col, n; col = getcol(&t->rasp, a); n = maxtab - col % maxtab; for(i = 0; i < n && p < buf+nelem(buf); i++) *p++ = ' '; } else *p++ = c; if(autoindent) if(c == '\n'){ /* autoindent */ int cursor, ch; cursor = ctlu(&t->rasp, 0, a+(p-buf)-1); while(p < buf+nelem(buf)){ ch = raspc(&t->rasp, cursor++); if(ch == ' ' || ch == '\t') *p++ = ch; else break; } } if(c == '\n' || p >= buf+nelem(buf)) break; } if(p > buf){ if(typestart < 0) typestart = a; if(typeesc < 0) typeesc = a; hgrow(t->tag, a, p-buf, 0); t->lock++; /* pretend we Trequest'ed for hdatarune*/ hdatarune(t->tag, a, buf, p-buf); a += p-buf; l->p0 = a; l->p1 = a; typeend = a; if(c=='\n' || typeend-typestart>100) flushtyping(0); onethird(l, a); } if(c==SCROLLKEY || c==PAGEDOWN){ flushtyping(0); center(l, l->origin+l->f.nchars+1); }else if(c==BACKSCROLLKEY || c==PAGEUP){ flushtyping(0); a0 = l->origin-l->f.nchars; if(a0 < 0) a0 = 0; center(l, a0); }else if(c == RIGHTARROW){ flushtyping(0); a0 = l->p0; if(a0 < t->rasp.nrunes) a0++; flsetselect(l, a0, a0); center(l, a0); }else if(c == LEFTARROW){ flushtyping(0); a0 = l->p0; if(a0 > 0) a0--; flsetselect(l, a0, a0); center(l, a0); }else if(c == HOMEKEY){ flushtyping(0); center(l, 0); }else if(c == ENDKEY){ flushtyping(0); center(l, t->rasp.nrunes); }else if(c == LINESTART || c == LINEEND){ flushtyping(1); if(c == LINESTART) while(a > 0 && raspc(&t->rasp, a-1)!='\n') a--; else while(a < t->rasp.nrunes && raspc(&t->rasp, a)!='\n') a++; l->p0 = l->p1 = a; for(l=t->l; l<&t->l[NL]; l++) if(l->textfn) flsetselect(l, l->p0, l->p1); }else if(backspacing && !hostlock){ /* backspacing immediately after outcmd(): sorry */ if(l->f.p0>0 && a>0){ switch(c){ case '\b': case 0x7F: /* del */ //case 0x11: /* del */ //l->p0 = a-1; l->p0 = del(&t->rasp, l->origin, a); break; case 0x15: /* ctrl-u */ //case 0x06: /* ctrl-f */ l->p0 = ctlu(&t->rasp, l->origin, a); break; case 0x17: /* ctrl-w */ l->p0 = ctlw(&t->rasp, l->origin, a); break; } l->p1 = a; if(l->p1 != l->p0){ /* cut locally if possible */ if(typestart<=l->p0 && l->p1<=typeend){ t->lock++; /* to call hcut */ hcut(t->tag, l->p0, l->p1-l->p0); /* hcheck is local because we know rasp is contiguous */ hcheck(t->tag); }else{ flushtyping(0); cut(t, t->front, 0, 1); } } if(typeesc >= l->p0) typeesc = l->p0; if(typestart >= 0){ if(typestart >= l->p0) typestart = l->p0; typeend = l->p0; if(typestart == typeend){ typestart = -1; typeend = -1; modified = 0; } } } }else{ if(c==ESC && typeesc>=0){ l->p0 = typeesc; l->p1 = a; flushtyping(1); } // if(c==MID){ // flushtyping(1); // a2 = a; // while(a2 > 0 && raspc(&t->rasp, a2-1)!='\n') // a2--; // if(a2!=t->rasp.nrunes){ // a2--; // } // flushtyping(0); // flsetselect(l, a, a); // outTsll(Torigin, t->tag, a2, 1L); // } // if(c==CWIN){ // if (inCMD==0) { // tp = t; // t = &cmd; // for(l=t->l; l->textfn==0; l++) // ; // current(l); // flushtyping(0); // a = t->rasp.nrunes; // flsetselect(l, a, a); // center(l, a); // inCMD = 1; // } else { // for(l=tp->l; l->textfn==0; l++) // ; // current(l); // flushtyping(0); // inCMD = 0; // } // } // if(c==GFO) // sendcmd("<gfo", 4, t); // if(c==GFU) // sendcmd("<gfu", 4, t); // if(c==GI) // sendcmd("<gi", 3, t); // if(c==GIE) // sendcmd("<gie", 4, t); // if(c==GIEI) // sendcmd("<giei", 5, t); // if(c==GP) // sendcmd("<gp", 3, t); // if(c==MK) // sendcmd("!mk", 3, t); // if(c==MCO) // sendcmd("|mco", 4, t); // if(c==MLI) // sendcmd(",|mli", 5, t); // if(c==MFU) // sendcmd("<mfu", 4, t); // if(c==UNDO) // sendcmd("u", 1, t); // if(c==REDO) // sendcmd("u-1", 3, t); // if(c==ALL) // sendcmd(",", 1, t); // if(c==MARK) // sendcmd("k", 1, t); // if(c==GO) // sendcmd("'", 1, t); // if(c==SEL) // sendcmd("',.", 3, t); // if(c==SAVE){ // for(l=t->l; l->textfn==0; l++) // ; // current(l); // flushtyping(0); // ao = l->p0; // a = t->rasp.nrunes; // flsetselect(l, a, a); // if(raspc(&t->rasp, a-1)!='\n'){ // *p++ = '\n'; // if(typestart < 0) // typestart = a; // if(typeesc < 0) // typeesc = a; // hgrow(t->tag, a, p-buf, 0); // t->lock++; /* pretend we Trequest'ed for hdatarune*/ // hdatarune(t->tag, a, buf, p-buf); // a += p-buf; // } // l->p0 = ao; // l->p1 = ao; // typeend = ao; // flushtyping(0); // flsetselect(l, ao, ao); // center(l, ao); // sendcmd("w", 1, t); // } // if(c==FMT) // sendcmd("|par", 4, t); // if(c==FFMT) // sendcmd(",|par", 5, t); // if(c==WC) // sendcmd(">wc", 3, t); // if(c==MI) // sendcmd("|a+", 3, t); // if(c==LI) // sendcmd("|a-", 3, t); // if(c==RIOEXCH){ // snarf(t, t->front); // outT0(Tstartsnarf); // setlock(); // } // if(c==PLUMB){ // if(hversion > 0) // outTsll(Tplumb, t->tag, which->p0, which->p1); // } // if(c==LOOK){ // outTsll(Tlook, t->tag, which->p0, which->p1); // setlock(); // } // if(c==NEW){ // sweeptext(1, 0); // } // if(c==CLOSE){ // t=(Text *)l->user1; // if (t->nwin>1) // closeup(l); // else if(t!=&cmd) { // outTs(Tclose, t->tag); // setlock(); // } // } for(l=t->l; l<&t->l[NL]; l++) if(l->textfn) flsetselect(l, l->p0, l->p1); switch(c) { case CUT: flushtyping(0); cut(t, t->front, 1, 1); break; case COPY: flushtyping(0); snarf(t, t->front); break; case PASTE: flushtyping(0); paste(t, t->front); break; } } }