1 84b1cb73 2003-09-30 devnull #include <u.h>
2 84b1cb73 2003-09-30 devnull #include <libc.h>
3 84b1cb73 2003-09-30 devnull #include <draw.h>
4 84b1cb73 2003-09-30 devnull #include <thread.h>
5 84b1cb73 2003-09-30 devnull #include <mouse.h>
6 84b1cb73 2003-09-30 devnull #include <cursor.h>
7 84b1cb73 2003-09-30 devnull #include <keyboard.h>
8 84b1cb73 2003-09-30 devnull #include <frame.h>
9 84b1cb73 2003-09-30 devnull #include <plumb.h>
10 84b1cb73 2003-09-30 devnull #include "flayer.h"
11 84b1cb73 2003-09-30 devnull #include "samterm.h"
13 84b1cb73 2003-09-30 devnull #define HSIZE 3 /* Type + short count */
14 84b1cb73 2003-09-30 devnull Header h;
15 84b1cb73 2003-09-30 devnull uchar indata[DATASIZE+1]; /* room for NUL */
16 84b1cb73 2003-09-30 devnull uchar outdata[DATASIZE];
17 84b1cb73 2003-09-30 devnull short outcount;
18 84b1cb73 2003-09-30 devnull int hversion;
19 941c9f36 2003-10-11 devnull int hostfd[2];
21 84b1cb73 2003-09-30 devnull void inmesg(Hmesg, int);
22 84b1cb73 2003-09-30 devnull int inshort(int);
23 84b1cb73 2003-09-30 devnull long inlong(int);
24 84b1cb73 2003-09-30 devnull long invlong(int);
25 84b1cb73 2003-09-30 devnull void hsetdot(int, long, long);
26 84b1cb73 2003-09-30 devnull void hmoveto(int, long);
27 84b1cb73 2003-09-30 devnull void hsetsnarf(int);
28 af78a4cd 2004-03-02 devnull void hplumb(int);
29 84b1cb73 2003-09-30 devnull void clrlock(void);
30 84b1cb73 2003-09-30 devnull int snarfswap(char*, int, char**);
33 84b1cb73 2003-09-30 devnull rcv(void)
36 84b1cb73 2003-09-30 devnull static int state = 0;
37 84b1cb73 2003-09-30 devnull static int count = 0;
38 84b1cb73 2003-09-30 devnull static int i = 0;
39 84b1cb73 2003-09-30 devnull static int errs = 0;
41 b4135f04 2005-01-07 devnull if(protodebug) print("rcv in\n");
42 93f2ae0d 2004-12-27 devnull while((c=rcvchar()) != -1){
43 b4135f04 2005-01-07 devnull if(protodebug) print(".");
44 84b1cb73 2003-09-30 devnull switch(state){
46 84b1cb73 2003-09-30 devnull h.type = c;
51 84b1cb73 2003-09-30 devnull h.count0 = c;
56 84b1cb73 2003-09-30 devnull h.count1 = c;
57 84b1cb73 2003-09-30 devnull count = h.count0|(h.count1<<8);
59 84b1cb73 2003-09-30 devnull if(count > DATASIZE){
60 84b1cb73 2003-09-30 devnull if(++errs < 5){
61 84b1cb73 2003-09-30 devnull dumperrmsg(count, h.type, h.count0, c);
62 84b1cb73 2003-09-30 devnull state = 0;
63 84b1cb73 2003-09-30 devnull continue;
65 84b1cb73 2003-09-30 devnull fprint(2, "type %d count %d\n", h.type, count);
66 84b1cb73 2003-09-30 devnull panic("count>DATASIZE");
68 84b1cb73 2003-09-30 devnull if(count == 0)
69 84b1cb73 2003-09-30 devnull goto zerocount;
74 84b1cb73 2003-09-30 devnull indata[i++] = c;
75 84b1cb73 2003-09-30 devnull if(i == count){
76 84b1cb73 2003-09-30 devnull zerocount:
77 84b1cb73 2003-09-30 devnull indata[i] = 0;
78 84b1cb73 2003-09-30 devnull inmesg(h.type, count);
79 84b1cb73 2003-09-30 devnull state = count = 0;
80 84b1cb73 2003-09-30 devnull continue;
84 b4135f04 2005-01-07 devnull if(protodebug) print(":");
87 b4135f04 2005-01-07 devnull if(protodebug) print("rcv out\n");
91 84b1cb73 2003-09-30 devnull whichtext(int tg)
95 84b1cb73 2003-09-30 devnull for(i=0; i<nname; i++)
96 84b1cb73 2003-09-30 devnull if(tag[i] == tg)
97 84b1cb73 2003-09-30 devnull return text[i];
98 84b1cb73 2003-09-30 devnull panic("whichtext");
99 84b1cb73 2003-09-30 devnull return 0;
103 84b1cb73 2003-09-30 devnull inmesg(Hmesg type, int count)
105 84b1cb73 2003-09-30 devnull Text *t;
106 84b1cb73 2003-09-30 devnull int i, m;
108 84b1cb73 2003-09-30 devnull Flayer *lp;
110 84b1cb73 2003-09-30 devnull m = inshort(0);
111 84b1cb73 2003-09-30 devnull l = inlong(2);
112 84b1cb73 2003-09-30 devnull switch(type){
113 84b1cb73 2003-09-30 devnull case -1:
114 84b1cb73 2003-09-30 devnull panic("rcv error");
115 84b1cb73 2003-09-30 devnull default:
116 84b1cb73 2003-09-30 devnull fprint(2, "type %d\n", type);
117 84b1cb73 2003-09-30 devnull panic("rcv unknown");
119 84b1cb73 2003-09-30 devnull case Hversion:
120 84b1cb73 2003-09-30 devnull hversion = m;
123 84b1cb73 2003-09-30 devnull case Hbindname:
124 84b1cb73 2003-09-30 devnull l = invlong(2); /* for 64-bit pointers */
125 84b1cb73 2003-09-30 devnull if((i=whichmenu(m)) < 0)
127 84b1cb73 2003-09-30 devnull /* in case of a race, a bindname may already have occurred */
128 84b1cb73 2003-09-30 devnull if((t=whichtext(m)) == 0)
129 84b1cb73 2003-09-30 devnull t=(Text *)l;
130 84b1cb73 2003-09-30 devnull else /* let the old one win; clean up the new one */
131 84b1cb73 2003-09-30 devnull while(((Text *)l)->nwin>0)
132 84b1cb73 2003-09-30 devnull closeup(&((Text *)l)->l[((Text *)l)->front]);
133 84b1cb73 2003-09-30 devnull text[i] = t;
134 84b1cb73 2003-09-30 devnull text[i]->tag = m;
137 84b1cb73 2003-09-30 devnull case Hcurrent:
138 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0)
140 84b1cb73 2003-09-30 devnull t = whichtext(m);
141 84b1cb73 2003-09-30 devnull i = which && ((Text *)which->user1)==&cmd && m!=cmd.tag;
142 84b1cb73 2003-09-30 devnull if(t==0 && (t = sweeptext(0, m))==0)
144 84b1cb73 2003-09-30 devnull if(t->l[t->front].textfn==0)
145 84b1cb73 2003-09-30 devnull panic("Hcurrent");
146 84b1cb73 2003-09-30 devnull lp = &t->l[t->front];
148 84b1cb73 2003-09-30 devnull flupfront(lp);
149 84b1cb73 2003-09-30 devnull flborder(lp, 0);
150 84b1cb73 2003-09-30 devnull work = lp;
152 84b1cb73 2003-09-30 devnull current(lp);
155 84b1cb73 2003-09-30 devnull case Hmovname:
156 84b1cb73 2003-09-30 devnull if((m=whichmenu(m)) < 0)
158 84b1cb73 2003-09-30 devnull t = text[m];
159 84b1cb73 2003-09-30 devnull l = tag[m];
160 84b1cb73 2003-09-30 devnull i = name[m][0];
161 84b1cb73 2003-09-30 devnull text[m] = 0; /* suppress panic in menudel */
162 84b1cb73 2003-09-30 devnull menudel(m);
163 84b1cb73 2003-09-30 devnull if(t == &cmd)
166 84b1cb73 2003-09-30 devnull if (nname>0 && text[0]==&cmd)
168 84b1cb73 2003-09-30 devnull else m = 0;
169 84b1cb73 2003-09-30 devnull for(; m<nname; m++)
170 84b1cb73 2003-09-30 devnull if(strcmp((char*)indata+2, (char*)name[m]+1)<0)
173 84b1cb73 2003-09-30 devnull menuins(m, indata+2, t, i, (int)l);
176 84b1cb73 2003-09-30 devnull case Hgrow:
177 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
178 84b1cb73 2003-09-30 devnull hgrow(m, l, inlong(6), 1);
181 84b1cb73 2003-09-30 devnull case Hnewname:
182 84b1cb73 2003-09-30 devnull menuins(0, (uchar *)"", (Text *)0, ' ', m);
185 84b1cb73 2003-09-30 devnull case Hcheck0:
186 84b1cb73 2003-09-30 devnull i = whichmenu(m);
187 84b1cb73 2003-09-30 devnull if(i>=0) {
188 84b1cb73 2003-09-30 devnull t = text[i];
190 84b1cb73 2003-09-30 devnull t->lock++;
191 84b1cb73 2003-09-30 devnull outTs(Tcheck, m);
195 84b1cb73 2003-09-30 devnull case Hcheck:
196 84b1cb73 2003-09-30 devnull i = whichmenu(m);
197 84b1cb73 2003-09-30 devnull if(i>=0) {
198 84b1cb73 2003-09-30 devnull t = text[i];
199 84b1cb73 2003-09-30 devnull if(t && t->lock)
200 84b1cb73 2003-09-30 devnull t->lock--;
201 84b1cb73 2003-09-30 devnull hcheck(m);
205 84b1cb73 2003-09-30 devnull case Hunlock:
206 84b1cb73 2003-09-30 devnull clrlock();
209 84b1cb73 2003-09-30 devnull case Hdata:
210 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
211 84b1cb73 2003-09-30 devnull l += hdata(m, l, indata+6, count-6);
212 84b1cb73 2003-09-30 devnull Checkscroll:
213 84b1cb73 2003-09-30 devnull if(m == cmd.tag){
214 84b1cb73 2003-09-30 devnull for(i=0; i<NL; i++){
215 84b1cb73 2003-09-30 devnull lp = &cmd.l[i];
216 84b1cb73 2003-09-30 devnull if(lp->textfn)
217 84b1cb73 2003-09-30 devnull center(lp, l>=0? l : lp->p1);
222 84b1cb73 2003-09-30 devnull case Horigin:
223 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
224 84b1cb73 2003-09-30 devnull horigin(m, l);
227 84b1cb73 2003-09-30 devnull case Hunlockfile:
228 84b1cb73 2003-09-30 devnull if(whichmenu(m)>=0 && (t = whichtext(m))->lock){
229 84b1cb73 2003-09-30 devnull --t->lock;
231 84b1cb73 2003-09-30 devnull goto Checkscroll;
235 84b1cb73 2003-09-30 devnull case Hsetdot:
236 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
237 84b1cb73 2003-09-30 devnull hsetdot(m, l, inlong(6));
240 84b1cb73 2003-09-30 devnull case Hgrowdata:
241 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0)
243 84b1cb73 2003-09-30 devnull hgrow(m, l, inlong(6), 0);
244 84b1cb73 2003-09-30 devnull whichtext(m)->lock++; /* fake the request */
245 84b1cb73 2003-09-30 devnull l += hdata(m, l, indata+10, count-10);
246 84b1cb73 2003-09-30 devnull goto Checkscroll;
248 84b1cb73 2003-09-30 devnull case Hmoveto:
249 84b1cb73 2003-09-30 devnull if(whichmenu(m)>=0)
250 84b1cb73 2003-09-30 devnull hmoveto(m, l);
253 84b1cb73 2003-09-30 devnull case Hclean:
254 84b1cb73 2003-09-30 devnull if((m = whichmenu(m)) >= 0)
255 84b1cb73 2003-09-30 devnull name[m][0] = ' ';
258 84b1cb73 2003-09-30 devnull case Hdirty:
259 84b1cb73 2003-09-30 devnull if((m = whichmenu(m))>=0)
260 84b1cb73 2003-09-30 devnull name[m][0] = '\'';
263 84b1cb73 2003-09-30 devnull case Hdelname:
264 84b1cb73 2003-09-30 devnull if((m=whichmenu(m)) >= 0)
265 84b1cb73 2003-09-30 devnull menudel(m);
268 84b1cb73 2003-09-30 devnull case Hcut:
269 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
270 84b1cb73 2003-09-30 devnull hcut(m, l, inlong(6));
273 84b1cb73 2003-09-30 devnull case Hclose:
274 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0 || (t = whichtext(m))==0)
276 84b1cb73 2003-09-30 devnull l = t->nwin;
277 84b1cb73 2003-09-30 devnull for(i = 0,lp = t->l; l>0 && i<NL; i++,lp++)
278 84b1cb73 2003-09-30 devnull if(lp->textfn){
279 84b1cb73 2003-09-30 devnull closeup(lp);
284 84b1cb73 2003-09-30 devnull case Hsetpat:
285 84b1cb73 2003-09-30 devnull setpat((char *)indata);
288 84b1cb73 2003-09-30 devnull case Hsetsnarf:
289 84b1cb73 2003-09-30 devnull hsetsnarf(m);
292 84b1cb73 2003-09-30 devnull case Hsnarflen:
293 84b1cb73 2003-09-30 devnull snarflen = inlong(0);
296 84b1cb73 2003-09-30 devnull case Hack:
297 84b1cb73 2003-09-30 devnull outT0(Tack);
300 84b1cb73 2003-09-30 devnull case Hexit:
301 84b1cb73 2003-09-30 devnull outT0(Texit);
302 84b1cb73 2003-09-30 devnull threadexitsall(nil);
305 84b1cb73 2003-09-30 devnull case Hplumb:
306 84b1cb73 2003-09-30 devnull hplumb(m);
312 84b1cb73 2003-09-30 devnull setlock(void)
314 84b1cb73 2003-09-30 devnull hostlock++;
315 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor = &lockarrow);
319 84b1cb73 2003-09-30 devnull clrlock(void)
321 84b1cb73 2003-09-30 devnull hasunlocked = 1;
322 84b1cb73 2003-09-30 devnull if(hostlock > 0)
323 84b1cb73 2003-09-30 devnull hostlock--;
324 84b1cb73 2003-09-30 devnull if(hostlock == 0)
325 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor=(Cursor *)0);
329 84b1cb73 2003-09-30 devnull startfile(Text *t)
331 84b1cb73 2003-09-30 devnull outTsv(Tstartfile, t->tag, t); /* for 64-bit pointers */
332 84b1cb73 2003-09-30 devnull setlock();
336 84b1cb73 2003-09-30 devnull startnewfile(int type, Text *t)
338 84b1cb73 2003-09-30 devnull t->tag = Untagged;
339 84b1cb73 2003-09-30 devnull outTv(type, t); /* for 64-bit pointers */
343 84b1cb73 2003-09-30 devnull inshort(int n)
345 84b1cb73 2003-09-30 devnull return indata[n]|(indata[n+1]<<8);
349 84b1cb73 2003-09-30 devnull inlong(int n)
351 84b1cb73 2003-09-30 devnull return indata[n]|(indata[n+1]<<8)|
352 84b1cb73 2003-09-30 devnull ((long)indata[n+2]<<16)|((long)indata[n+3]<<24);
356 84b1cb73 2003-09-30 devnull invlong(int n)
360 84b1cb73 2003-09-30 devnull l = (indata[n+7]<<24) | (indata[n+6]<<16) | (indata[n+5]<<8) | indata[n+4];
361 84b1cb73 2003-09-30 devnull l = (l<<16) | (indata[n+3]<<8) | indata[n+2];
362 84b1cb73 2003-09-30 devnull l = (l<<16) | (indata[n+1]<<8) | indata[n];
363 84b1cb73 2003-09-30 devnull return l;
367 84b1cb73 2003-09-30 devnull outT0(Tmesg type)
369 84b1cb73 2003-09-30 devnull outstart(type);
370 84b1cb73 2003-09-30 devnull outsend();
374 84b1cb73 2003-09-30 devnull outTl(Tmesg type, long l)
376 84b1cb73 2003-09-30 devnull outstart(type);
377 84b1cb73 2003-09-30 devnull outlong(l);
378 84b1cb73 2003-09-30 devnull outsend();
382 84b1cb73 2003-09-30 devnull outTs(Tmesg type, int s)
384 84b1cb73 2003-09-30 devnull outstart(type);
385 84b1cb73 2003-09-30 devnull outshort(s);
386 84b1cb73 2003-09-30 devnull outsend();
390 84b1cb73 2003-09-30 devnull outTss(Tmesg type, int s1, int s2)
392 84b1cb73 2003-09-30 devnull outstart(type);
393 84b1cb73 2003-09-30 devnull outshort(s1);
394 84b1cb73 2003-09-30 devnull outshort(s2);
395 84b1cb73 2003-09-30 devnull outsend();
399 84b1cb73 2003-09-30 devnull outTsll(Tmesg type, int s1, long l1, long l2)
401 84b1cb73 2003-09-30 devnull outstart(type);
402 84b1cb73 2003-09-30 devnull outshort(s1);
403 84b1cb73 2003-09-30 devnull outlong(l1);
404 84b1cb73 2003-09-30 devnull outlong(l2);
405 84b1cb73 2003-09-30 devnull outsend();
409 84b1cb73 2003-09-30 devnull outTsl(Tmesg type, int s1, long l1)
411 84b1cb73 2003-09-30 devnull outstart(type);
412 84b1cb73 2003-09-30 devnull outshort(s1);
413 84b1cb73 2003-09-30 devnull outlong(l1);
414 84b1cb73 2003-09-30 devnull outsend();
418 84b1cb73 2003-09-30 devnull outTsv(Tmesg type, int s1, void *l1)
420 84b1cb73 2003-09-30 devnull outstart(type);
421 84b1cb73 2003-09-30 devnull outshort(s1);
422 84b1cb73 2003-09-30 devnull outvlong(l1);
423 84b1cb73 2003-09-30 devnull outsend();
427 84b1cb73 2003-09-30 devnull outTv(Tmesg type, void *l1)
429 84b1cb73 2003-09-30 devnull outstart(type);
430 84b1cb73 2003-09-30 devnull outvlong(l1);
431 84b1cb73 2003-09-30 devnull outsend();
435 84b1cb73 2003-09-30 devnull outTslS(Tmesg type, int s1, long l1, Rune *s)
437 84b1cb73 2003-09-30 devnull char buf[DATASIZE*3+1];
438 84b1cb73 2003-09-30 devnull char *c;
440 84b1cb73 2003-09-30 devnull outstart(type);
441 84b1cb73 2003-09-30 devnull outshort(s1);
442 84b1cb73 2003-09-30 devnull outlong(l1);
443 84b1cb73 2003-09-30 devnull c = buf;
444 84b1cb73 2003-09-30 devnull while(*s)
445 84b1cb73 2003-09-30 devnull c += runetochar(c, s++);
446 84b1cb73 2003-09-30 devnull *c++ = 0;
447 84b1cb73 2003-09-30 devnull outcopy(c-buf, (uchar *)buf);
448 84b1cb73 2003-09-30 devnull outsend();
452 84b1cb73 2003-09-30 devnull outTsls(Tmesg type, int s1, long l1, int s2)
454 84b1cb73 2003-09-30 devnull outstart(type);
455 84b1cb73 2003-09-30 devnull outshort(s1);
456 84b1cb73 2003-09-30 devnull outlong(l1);
457 84b1cb73 2003-09-30 devnull outshort(s2);
458 84b1cb73 2003-09-30 devnull outsend();
462 84b1cb73 2003-09-30 devnull outstart(Tmesg type)
464 84b1cb73 2003-09-30 devnull outdata[0] = type;
465 84b1cb73 2003-09-30 devnull outcount = 0;
469 84b1cb73 2003-09-30 devnull outcopy(int count, uchar *data)
471 84b1cb73 2003-09-30 devnull while(count--)
472 84b1cb73 2003-09-30 devnull outdata[HSIZE+outcount++] = *data++;
476 84b1cb73 2003-09-30 devnull outshort(int s)
478 84b1cb73 2003-09-30 devnull uchar buf[2];
480 84b1cb73 2003-09-30 devnull buf[0]=s;
481 84b1cb73 2003-09-30 devnull buf[1]=s>>8;
482 84b1cb73 2003-09-30 devnull outcopy(2, buf);
486 84b1cb73 2003-09-30 devnull outlong(long l)
488 84b1cb73 2003-09-30 devnull uchar buf[4];
490 84b1cb73 2003-09-30 devnull buf[0]=l;
491 84b1cb73 2003-09-30 devnull buf[1]=l>>8;
492 84b1cb73 2003-09-30 devnull buf[2]=l>>16;
493 84b1cb73 2003-09-30 devnull buf[3]=l>>24;
494 84b1cb73 2003-09-30 devnull outcopy(4, buf);
498 84b1cb73 2003-09-30 devnull outvlong(void *v)
501 84b1cb73 2003-09-30 devnull ulong l;
502 84b1cb73 2003-09-30 devnull uchar buf[8];
504 84b1cb73 2003-09-30 devnull l = (ulong) v;
505 84b1cb73 2003-09-30 devnull for(i = 0; i < sizeof(buf); i++, l >>= 8)
506 84b1cb73 2003-09-30 devnull buf[i] = l;
508 84b1cb73 2003-09-30 devnull outcopy(8, buf);
512 84b1cb73 2003-09-30 devnull outsend(void)
514 84b1cb73 2003-09-30 devnull if(outcount>DATASIZE-HSIZE)
515 84b1cb73 2003-09-30 devnull panic("outcount>sizeof outdata");
516 84b1cb73 2003-09-30 devnull outdata[1]=outcount;
517 84b1cb73 2003-09-30 devnull outdata[2]=outcount>>8;
518 941c9f36 2003-10-11 devnull if(write(hostfd[1], (char *)outdata, outcount+HSIZE)!=outcount+HSIZE)
519 84b1cb73 2003-09-30 devnull panic("write error");
524 84b1cb73 2003-09-30 devnull hsetdot(int m, long p0, long p1)
526 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
527 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
529 84b1cb73 2003-09-30 devnull flushtyping(1);
530 84b1cb73 2003-09-30 devnull flsetselect(l, p0, p1);
534 84b1cb73 2003-09-30 devnull horigin(int m, long p0)
536 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
537 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
539 84b1cb73 2003-09-30 devnull ulong n;
540 84b1cb73 2003-09-30 devnull Rune *r;
542 84b1cb73 2003-09-30 devnull if(!flprepare(l)){
543 84b1cb73 2003-09-30 devnull l->origin = p0;
546 84b1cb73 2003-09-30 devnull a = p0-l->origin;
547 84b1cb73 2003-09-30 devnull if(a>=0 && a<l->f.nchars)
548 84b1cb73 2003-09-30 devnull frdelete(&l->f, 0, a);
549 84b1cb73 2003-09-30 devnull else if(a<0 && -a<l->f.nchars){
550 84b1cb73 2003-09-30 devnull r = rload(&t->rasp, p0, l->origin, &n);
551 84b1cb73 2003-09-30 devnull frinsert(&l->f, r, r+n, 0);
553 84b1cb73 2003-09-30 devnull frdelete(&l->f, 0, l->f.nchars);
554 84b1cb73 2003-09-30 devnull l->origin = p0;
555 84b1cb73 2003-09-30 devnull scrdraw(l, t->rasp.nrunes);
556 84b1cb73 2003-09-30 devnull if(l->visible==Some)
557 84b1cb73 2003-09-30 devnull flrefresh(l, l->entire, 0);
558 84b1cb73 2003-09-30 devnull hcheck(m);
562 84b1cb73 2003-09-30 devnull hmoveto(int m, long p0)
564 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
565 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
567 84b1cb73 2003-09-30 devnull if(p0<l->origin || p0-l->origin>l->f.nchars*9/10)
568 84b1cb73 2003-09-30 devnull outTsll(Torigin, m, p0, 2L);
572 84b1cb73 2003-09-30 devnull hcheck(int m)
574 84b1cb73 2003-09-30 devnull Flayer *l;
575 84b1cb73 2003-09-30 devnull Text *t;
576 84b1cb73 2003-09-30 devnull int reqd = 0, i;
577 84b1cb73 2003-09-30 devnull long n, nl, a;
578 84b1cb73 2003-09-30 devnull Rune *r;
580 84b1cb73 2003-09-30 devnull if(m == Untagged)
582 84b1cb73 2003-09-30 devnull t = whichtext(m);
583 84b1cb73 2003-09-30 devnull if(t == 0) /* possible in a half-built window */
585 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
586 84b1cb73 2003-09-30 devnull if(l->textfn==0 || !flprepare(l)) /* BUG: don't
587 84b1cb73 2003-09-30 devnull need this if BUG below
588 84b1cb73 2003-09-30 devnull is fixed */
589 84b1cb73 2003-09-30 devnull continue;
590 84b1cb73 2003-09-30 devnull a = t->l[i].origin;
591 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+l->f.nchars, 1);
592 84b1cb73 2003-09-30 devnull if(n<l->f.nchars) /* text missing in middle of screen */
594 84b1cb73 2003-09-30 devnull else{ /* text missing at end of screen? */
596 84b1cb73 2003-09-30 devnull if(l->f.lastlinefull)
597 84b1cb73 2003-09-30 devnull goto Checksel; /* all's well */
598 84b1cb73 2003-09-30 devnull a = t->l[i].origin+l->f.nchars;
599 84b1cb73 2003-09-30 devnull n = t->rasp.nrunes-a;
600 84b1cb73 2003-09-30 devnull if(n==0)
601 84b1cb73 2003-09-30 devnull goto Checksel;
602 84b1cb73 2003-09-30 devnull if(n>TBLOCKSIZE)
603 84b1cb73 2003-09-30 devnull n = TBLOCKSIZE;
604 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+n, 1);
605 84b1cb73 2003-09-30 devnull if(n>0){
606 84b1cb73 2003-09-30 devnull rload(&t->rasp, a, a+n, 0);
607 84b1cb73 2003-09-30 devnull nl = l->f.nchars;
608 84b1cb73 2003-09-30 devnull r = scratch;
609 84b1cb73 2003-09-30 devnull flinsert(l, r, r+n, l->origin+nl);
610 84b1cb73 2003-09-30 devnull if(nl == l->f.nchars) /* made no progress */
611 84b1cb73 2003-09-30 devnull goto Checksel;
612 84b1cb73 2003-09-30 devnull goto Again;
615 84b1cb73 2003-09-30 devnull if(!reqd){
616 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+TBLOCKSIZE, 0);
617 84b1cb73 2003-09-30 devnull if(n <= 0)
618 84b1cb73 2003-09-30 devnull panic("hcheck request==0");
619 84b1cb73 2003-09-30 devnull outTsls(Trequest, m, a, (int)n);
620 84b1cb73 2003-09-30 devnull outTs(Tcheck, m);
621 84b1cb73 2003-09-30 devnull t->lock++; /* for the Trequest */
622 84b1cb73 2003-09-30 devnull t->lock++; /* for the Tcheck */
625 84b1cb73 2003-09-30 devnull Checksel:
626 84b1cb73 2003-09-30 devnull flsetselect(l, l->p0, l->p1);
631 84b1cb73 2003-09-30 devnull flnewlyvisible(Flayer *l)
633 84b1cb73 2003-09-30 devnull hcheck(((Text *)l->user1)->tag);
637 84b1cb73 2003-09-30 devnull hsetsnarf(int nc)
639 84b1cb73 2003-09-30 devnull char *s2;
640 84b1cb73 2003-09-30 devnull char *s1;
644 84b1cb73 2003-09-30 devnull setcursor(mousectl, &deadmouse);
645 84b1cb73 2003-09-30 devnull s2 = alloc(nc+1);
646 84b1cb73 2003-09-30 devnull for(i=0; i<nc; i++)
647 84b1cb73 2003-09-30 devnull s2[i] = getch();
648 84b1cb73 2003-09-30 devnull s2[nc] = 0;
649 84b1cb73 2003-09-30 devnull n = snarfswap(s2, nc, &s1);
650 84b1cb73 2003-09-30 devnull if(n >= 0){
653 efc2b0c9 2004-03-02 devnull if(n > 65535){
654 efc2b0c9 2004-03-02 devnull s1 = strdup("<snarf too long>");
655 efc2b0c9 2004-03-02 devnull if (!s1)
656 efc2b0c9 2004-03-02 devnull panic("strdup");
657 efc2b0c9 2004-03-02 devnull n = strlen(s1);
659 efc2b0c9 2004-03-02 devnull s1 = realloc(s1, n+1);
660 efc2b0c9 2004-03-02 devnull if (!s1)
661 efc2b0c9 2004-03-02 devnull panic("realloc");
662 efc2b0c9 2004-03-02 devnull s1[n] = 0;
664 84b1cb73 2003-09-30 devnull snarflen = n;
665 84b1cb73 2003-09-30 devnull outTs(Tsetsnarf, n);
666 941c9f36 2003-10-11 devnull if(n>0 && write(hostfd[1], s1, n)!=n)
667 84b1cb73 2003-09-30 devnull panic("snarf write error");
668 84b1cb73 2003-09-30 devnull free(s1);
670 84b1cb73 2003-09-30 devnull outTs(Tsetsnarf, 0);
671 84b1cb73 2003-09-30 devnull free(s2);
672 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
676 84b1cb73 2003-09-30 devnull hplumb(int nc)
679 84b1cb73 2003-09-30 devnull char *s;
680 84b1cb73 2003-09-30 devnull Plumbmsg *m;
682 84b1cb73 2003-09-30 devnull s = alloc(nc);
683 84b1cb73 2003-09-30 devnull for(i=0; i<nc; i++)
684 84b1cb73 2003-09-30 devnull s[i] = getch();
685 84b1cb73 2003-09-30 devnull if(plumbfd > 0){
686 84b1cb73 2003-09-30 devnull m = plumbunpack(s, nc);
687 84b1cb73 2003-09-30 devnull if(m != 0)
688 84b1cb73 2003-09-30 devnull plumbsend(plumbfd, m);
689 84b1cb73 2003-09-30 devnull plumbfree(m);
691 84b1cb73 2003-09-30 devnull free(s);
695 84b1cb73 2003-09-30 devnull hgrow(int m, long a, long new, int req)
698 84b1cb73 2003-09-30 devnull Flayer *l;
699 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
700 84b1cb73 2003-09-30 devnull long o, b;
702 84b1cb73 2003-09-30 devnull if(new <= 0)
703 84b1cb73 2003-09-30 devnull panic("hgrow");
704 84b1cb73 2003-09-30 devnull rresize(&t->rasp, a, 0L, new);
705 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
706 84b1cb73 2003-09-30 devnull if(l->textfn == 0)
707 84b1cb73 2003-09-30 devnull continue;
708 84b1cb73 2003-09-30 devnull o = l->origin;
709 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
710 84b1cb73 2003-09-30 devnull if(a < o)
711 84b1cb73 2003-09-30 devnull l->origin+=new;
712 84b1cb73 2003-09-30 devnull if(a < l->p0)
713 84b1cb73 2003-09-30 devnull l->p0+=new;
714 84b1cb73 2003-09-30 devnull if(a < l->p1)
715 84b1cb73 2003-09-30 devnull l->p1+=new;
716 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
717 84b1cb73 2003-09-30 devnull if(!req || a<o || (b>0 && b>l->f.nchars) ||
718 84b1cb73 2003-09-30 devnull (l->f.nchars==0 && a-o>0))
719 84b1cb73 2003-09-30 devnull continue;
720 84b1cb73 2003-09-30 devnull if(new>TBLOCKSIZE)
721 84b1cb73 2003-09-30 devnull new = TBLOCKSIZE;
722 84b1cb73 2003-09-30 devnull outTsls(Trequest, m, a, (int)new);
723 84b1cb73 2003-09-30 devnull t->lock++;
724 84b1cb73 2003-09-30 devnull req = 0;
729 84b1cb73 2003-09-30 devnull hdata1(Text *t, long a, Rune *r, int len)
732 84b1cb73 2003-09-30 devnull Flayer *l;
733 84b1cb73 2003-09-30 devnull long o, b;
735 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i=0; i<NL; i++, l++){
736 84b1cb73 2003-09-30 devnull if(l->textfn==0)
737 84b1cb73 2003-09-30 devnull continue;
738 84b1cb73 2003-09-30 devnull o = l->origin;
739 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
740 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
741 84b1cb73 2003-09-30 devnull if(a<o || (b>0 && b>l->f.nchars))
742 84b1cb73 2003-09-30 devnull continue;
743 84b1cb73 2003-09-30 devnull flinsert(l, r, r+len, o+b);
745 84b1cb73 2003-09-30 devnull rdata(&t->rasp, a, a+len, r);
746 84b1cb73 2003-09-30 devnull rclean(&t->rasp);
747 84b1cb73 2003-09-30 devnull return len;
751 84b1cb73 2003-09-30 devnull hdata(int m, long a, uchar *s, int len)
753 84b1cb73 2003-09-30 devnull int i, w;
754 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
755 84b1cb73 2003-09-30 devnull Rune buf[DATASIZE], *r;
757 84b1cb73 2003-09-30 devnull if(t->lock)
758 84b1cb73 2003-09-30 devnull --t->lock;
759 84b1cb73 2003-09-30 devnull if(len == 0)
760 84b1cb73 2003-09-30 devnull return 0;
761 84b1cb73 2003-09-30 devnull r = buf;
762 84b1cb73 2003-09-30 devnull for(i=0; i<len; i+=w,s+=w)
763 84b1cb73 2003-09-30 devnull w = chartorune(r++, (char*)s);
764 84b1cb73 2003-09-30 devnull return hdata1(t, a, buf, r-buf);
768 84b1cb73 2003-09-30 devnull hdatarune(int m, long a, Rune *r, int len)
770 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
772 84b1cb73 2003-09-30 devnull if(t->lock)
773 84b1cb73 2003-09-30 devnull --t->lock;
774 84b1cb73 2003-09-30 devnull if(len == 0)
775 84b1cb73 2003-09-30 devnull return 0;
776 84b1cb73 2003-09-30 devnull return hdata1(t, a, r, len);
780 84b1cb73 2003-09-30 devnull hcut(int m, long a, long old)
782 84b1cb73 2003-09-30 devnull Flayer *l;
783 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
785 84b1cb73 2003-09-30 devnull long o, b;
787 84b1cb73 2003-09-30 devnull if(t->lock)
788 84b1cb73 2003-09-30 devnull --t->lock;
789 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
790 84b1cb73 2003-09-30 devnull if(l->textfn == 0)
791 84b1cb73 2003-09-30 devnull continue;
792 84b1cb73 2003-09-30 devnull o = l->origin;
793 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
794 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
795 84b1cb73 2003-09-30 devnull if((b<0 || b<l->f.nchars) && a+old>=o){
796 84b1cb73 2003-09-30 devnull fldelete(l, b<0? o : o+b,
797 84b1cb73 2003-09-30 devnull a+old-rmissing(&t->rasp, o, a+old));
799 84b1cb73 2003-09-30 devnull if(a+old<o)
800 84b1cb73 2003-09-30 devnull l->origin-=old;
801 84b1cb73 2003-09-30 devnull else if(a<=o)
802 84b1cb73 2003-09-30 devnull l->origin = a;
803 84b1cb73 2003-09-30 devnull if(a+old<l->p0)
804 84b1cb73 2003-09-30 devnull l->p0-=old;
805 84b1cb73 2003-09-30 devnull else if(a<=l->p0)
806 84b1cb73 2003-09-30 devnull l->p0 = a;
807 84b1cb73 2003-09-30 devnull if(a+old<l->p1)
808 84b1cb73 2003-09-30 devnull l->p1-=old;
809 84b1cb73 2003-09-30 devnull else if(a<=l->p1)
810 84b1cb73 2003-09-30 devnull l->p1 = a;
812 84b1cb73 2003-09-30 devnull rresize(&t->rasp, a, old, 0L);
813 84b1cb73 2003-09-30 devnull rclean(&t->rasp);