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 84b1cb73 2003-09-30 devnull while((c=rcvchar()) != -1)
42 84b1cb73 2003-09-30 devnull switch(state){
44 84b1cb73 2003-09-30 devnull h.type = c;
49 84b1cb73 2003-09-30 devnull h.count0 = c;
54 84b1cb73 2003-09-30 devnull h.count1 = c;
55 84b1cb73 2003-09-30 devnull count = h.count0|(h.count1<<8);
57 84b1cb73 2003-09-30 devnull if(count > DATASIZE){
58 84b1cb73 2003-09-30 devnull if(++errs < 5){
59 84b1cb73 2003-09-30 devnull dumperrmsg(count, h.type, h.count0, c);
60 84b1cb73 2003-09-30 devnull state = 0;
61 84b1cb73 2003-09-30 devnull continue;
63 84b1cb73 2003-09-30 devnull fprint(2, "type %d count %d\n", h.type, count);
64 84b1cb73 2003-09-30 devnull panic("count>DATASIZE");
66 84b1cb73 2003-09-30 devnull if(count == 0)
67 84b1cb73 2003-09-30 devnull goto zerocount;
72 84b1cb73 2003-09-30 devnull indata[i++] = c;
73 84b1cb73 2003-09-30 devnull if(i == count){
74 84b1cb73 2003-09-30 devnull zerocount:
75 84b1cb73 2003-09-30 devnull indata[i] = 0;
76 84b1cb73 2003-09-30 devnull inmesg(h.type, count);
77 84b1cb73 2003-09-30 devnull state = count = 0;
78 84b1cb73 2003-09-30 devnull continue;
85 84b1cb73 2003-09-30 devnull whichtext(int tg)
89 84b1cb73 2003-09-30 devnull for(i=0; i<nname; i++)
90 84b1cb73 2003-09-30 devnull if(tag[i] == tg)
91 84b1cb73 2003-09-30 devnull return text[i];
92 84b1cb73 2003-09-30 devnull panic("whichtext");
93 84b1cb73 2003-09-30 devnull return 0;
97 84b1cb73 2003-09-30 devnull inmesg(Hmesg type, int count)
100 84b1cb73 2003-09-30 devnull int i, m;
102 84b1cb73 2003-09-30 devnull Flayer *lp;
104 84b1cb73 2003-09-30 devnull m = inshort(0);
105 84b1cb73 2003-09-30 devnull l = inlong(2);
106 84b1cb73 2003-09-30 devnull switch(type){
107 84b1cb73 2003-09-30 devnull case -1:
108 84b1cb73 2003-09-30 devnull panic("rcv error");
109 84b1cb73 2003-09-30 devnull default:
110 84b1cb73 2003-09-30 devnull fprint(2, "type %d\n", type);
111 84b1cb73 2003-09-30 devnull panic("rcv unknown");
113 84b1cb73 2003-09-30 devnull case Hversion:
114 84b1cb73 2003-09-30 devnull hversion = m;
117 84b1cb73 2003-09-30 devnull case Hbindname:
118 84b1cb73 2003-09-30 devnull l = invlong(2); /* for 64-bit pointers */
119 84b1cb73 2003-09-30 devnull if((i=whichmenu(m)) < 0)
121 84b1cb73 2003-09-30 devnull /* in case of a race, a bindname may already have occurred */
122 84b1cb73 2003-09-30 devnull if((t=whichtext(m)) == 0)
123 84b1cb73 2003-09-30 devnull t=(Text *)l;
124 84b1cb73 2003-09-30 devnull else /* let the old one win; clean up the new one */
125 84b1cb73 2003-09-30 devnull while(((Text *)l)->nwin>0)
126 84b1cb73 2003-09-30 devnull closeup(&((Text *)l)->l[((Text *)l)->front]);
127 84b1cb73 2003-09-30 devnull text[i] = t;
128 84b1cb73 2003-09-30 devnull text[i]->tag = m;
131 84b1cb73 2003-09-30 devnull case Hcurrent:
132 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0)
134 84b1cb73 2003-09-30 devnull t = whichtext(m);
135 84b1cb73 2003-09-30 devnull i = which && ((Text *)which->user1)==&cmd && m!=cmd.tag;
136 84b1cb73 2003-09-30 devnull if(t==0 && (t = sweeptext(0, m))==0)
138 84b1cb73 2003-09-30 devnull if(t->l[t->front].textfn==0)
139 84b1cb73 2003-09-30 devnull panic("Hcurrent");
140 84b1cb73 2003-09-30 devnull lp = &t->l[t->front];
142 84b1cb73 2003-09-30 devnull flupfront(lp);
143 84b1cb73 2003-09-30 devnull flborder(lp, 0);
144 84b1cb73 2003-09-30 devnull work = lp;
146 84b1cb73 2003-09-30 devnull current(lp);
149 84b1cb73 2003-09-30 devnull case Hmovname:
150 84b1cb73 2003-09-30 devnull if((m=whichmenu(m)) < 0)
152 84b1cb73 2003-09-30 devnull t = text[m];
153 84b1cb73 2003-09-30 devnull l = tag[m];
154 84b1cb73 2003-09-30 devnull i = name[m][0];
155 84b1cb73 2003-09-30 devnull text[m] = 0; /* suppress panic in menudel */
156 84b1cb73 2003-09-30 devnull menudel(m);
157 84b1cb73 2003-09-30 devnull if(t == &cmd)
160 84b1cb73 2003-09-30 devnull if (nname>0 && text[0]==&cmd)
162 84b1cb73 2003-09-30 devnull else m = 0;
163 84b1cb73 2003-09-30 devnull for(; m<nname; m++)
164 84b1cb73 2003-09-30 devnull if(strcmp((char*)indata+2, (char*)name[m]+1)<0)
167 84b1cb73 2003-09-30 devnull menuins(m, indata+2, t, i, (int)l);
170 84b1cb73 2003-09-30 devnull case Hgrow:
171 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
172 84b1cb73 2003-09-30 devnull hgrow(m, l, inlong(6), 1);
175 84b1cb73 2003-09-30 devnull case Hnewname:
176 84b1cb73 2003-09-30 devnull menuins(0, (uchar *)"", (Text *)0, ' ', m);
179 84b1cb73 2003-09-30 devnull case Hcheck0:
180 84b1cb73 2003-09-30 devnull i = whichmenu(m);
181 84b1cb73 2003-09-30 devnull if(i>=0) {
182 84b1cb73 2003-09-30 devnull t = text[i];
184 84b1cb73 2003-09-30 devnull t->lock++;
185 84b1cb73 2003-09-30 devnull outTs(Tcheck, m);
189 84b1cb73 2003-09-30 devnull case Hcheck:
190 84b1cb73 2003-09-30 devnull i = whichmenu(m);
191 84b1cb73 2003-09-30 devnull if(i>=0) {
192 84b1cb73 2003-09-30 devnull t = text[i];
193 84b1cb73 2003-09-30 devnull if(t && t->lock)
194 84b1cb73 2003-09-30 devnull t->lock--;
195 84b1cb73 2003-09-30 devnull hcheck(m);
199 84b1cb73 2003-09-30 devnull case Hunlock:
200 84b1cb73 2003-09-30 devnull clrlock();
203 84b1cb73 2003-09-30 devnull case Hdata:
204 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
205 84b1cb73 2003-09-30 devnull l += hdata(m, l, indata+6, count-6);
206 84b1cb73 2003-09-30 devnull Checkscroll:
207 84b1cb73 2003-09-30 devnull if(m == cmd.tag){
208 84b1cb73 2003-09-30 devnull for(i=0; i<NL; i++){
209 84b1cb73 2003-09-30 devnull lp = &cmd.l[i];
210 84b1cb73 2003-09-30 devnull if(lp->textfn)
211 84b1cb73 2003-09-30 devnull center(lp, l>=0? l : lp->p1);
216 84b1cb73 2003-09-30 devnull case Horigin:
217 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
218 84b1cb73 2003-09-30 devnull horigin(m, l);
221 84b1cb73 2003-09-30 devnull case Hunlockfile:
222 84b1cb73 2003-09-30 devnull if(whichmenu(m)>=0 && (t = whichtext(m))->lock){
223 84b1cb73 2003-09-30 devnull --t->lock;
225 84b1cb73 2003-09-30 devnull goto Checkscroll;
229 84b1cb73 2003-09-30 devnull case Hsetdot:
230 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
231 84b1cb73 2003-09-30 devnull hsetdot(m, l, inlong(6));
234 84b1cb73 2003-09-30 devnull case Hgrowdata:
235 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0)
237 84b1cb73 2003-09-30 devnull hgrow(m, l, inlong(6), 0);
238 84b1cb73 2003-09-30 devnull whichtext(m)->lock++; /* fake the request */
239 84b1cb73 2003-09-30 devnull l += hdata(m, l, indata+10, count-10);
240 84b1cb73 2003-09-30 devnull goto Checkscroll;
242 84b1cb73 2003-09-30 devnull case Hmoveto:
243 84b1cb73 2003-09-30 devnull if(whichmenu(m)>=0)
244 84b1cb73 2003-09-30 devnull hmoveto(m, l);
247 84b1cb73 2003-09-30 devnull case Hclean:
248 84b1cb73 2003-09-30 devnull if((m = whichmenu(m)) >= 0)
249 84b1cb73 2003-09-30 devnull name[m][0] = ' ';
252 84b1cb73 2003-09-30 devnull case Hdirty:
253 84b1cb73 2003-09-30 devnull if((m = whichmenu(m))>=0)
254 84b1cb73 2003-09-30 devnull name[m][0] = '\'';
257 84b1cb73 2003-09-30 devnull case Hdelname:
258 84b1cb73 2003-09-30 devnull if((m=whichmenu(m)) >= 0)
259 84b1cb73 2003-09-30 devnull menudel(m);
262 84b1cb73 2003-09-30 devnull case Hcut:
263 84b1cb73 2003-09-30 devnull if(whichmenu(m) >= 0)
264 84b1cb73 2003-09-30 devnull hcut(m, l, inlong(6));
267 84b1cb73 2003-09-30 devnull case Hclose:
268 84b1cb73 2003-09-30 devnull if(whichmenu(m)<0 || (t = whichtext(m))==0)
270 84b1cb73 2003-09-30 devnull l = t->nwin;
271 84b1cb73 2003-09-30 devnull for(i = 0,lp = t->l; l>0 && i<NL; i++,lp++)
272 84b1cb73 2003-09-30 devnull if(lp->textfn){
273 84b1cb73 2003-09-30 devnull closeup(lp);
278 84b1cb73 2003-09-30 devnull case Hsetpat:
279 84b1cb73 2003-09-30 devnull setpat((char *)indata);
282 84b1cb73 2003-09-30 devnull case Hsetsnarf:
283 84b1cb73 2003-09-30 devnull hsetsnarf(m);
286 84b1cb73 2003-09-30 devnull case Hsnarflen:
287 84b1cb73 2003-09-30 devnull snarflen = inlong(0);
290 84b1cb73 2003-09-30 devnull case Hack:
291 84b1cb73 2003-09-30 devnull outT0(Tack);
294 84b1cb73 2003-09-30 devnull case Hexit:
295 84b1cb73 2003-09-30 devnull outT0(Texit);
296 84b1cb73 2003-09-30 devnull threadexitsall(nil);
299 84b1cb73 2003-09-30 devnull case Hplumb:
300 84b1cb73 2003-09-30 devnull hplumb(m);
306 84b1cb73 2003-09-30 devnull setlock(void)
308 84b1cb73 2003-09-30 devnull hostlock++;
309 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor = &lockarrow);
313 84b1cb73 2003-09-30 devnull clrlock(void)
315 84b1cb73 2003-09-30 devnull hasunlocked = 1;
316 84b1cb73 2003-09-30 devnull if(hostlock > 0)
317 84b1cb73 2003-09-30 devnull hostlock--;
318 84b1cb73 2003-09-30 devnull if(hostlock == 0)
319 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor=(Cursor *)0);
323 84b1cb73 2003-09-30 devnull startfile(Text *t)
325 84b1cb73 2003-09-30 devnull outTsv(Tstartfile, t->tag, t); /* for 64-bit pointers */
326 84b1cb73 2003-09-30 devnull setlock();
330 84b1cb73 2003-09-30 devnull startnewfile(int type, Text *t)
332 84b1cb73 2003-09-30 devnull t->tag = Untagged;
333 84b1cb73 2003-09-30 devnull outTv(type, t); /* for 64-bit pointers */
337 84b1cb73 2003-09-30 devnull inshort(int n)
339 84b1cb73 2003-09-30 devnull return indata[n]|(indata[n+1]<<8);
343 84b1cb73 2003-09-30 devnull inlong(int n)
345 84b1cb73 2003-09-30 devnull return indata[n]|(indata[n+1]<<8)|
346 84b1cb73 2003-09-30 devnull ((long)indata[n+2]<<16)|((long)indata[n+3]<<24);
350 84b1cb73 2003-09-30 devnull invlong(int n)
354 84b1cb73 2003-09-30 devnull l = (indata[n+7]<<24) | (indata[n+6]<<16) | (indata[n+5]<<8) | indata[n+4];
355 84b1cb73 2003-09-30 devnull l = (l<<16) | (indata[n+3]<<8) | indata[n+2];
356 84b1cb73 2003-09-30 devnull l = (l<<16) | (indata[n+1]<<8) | indata[n];
357 84b1cb73 2003-09-30 devnull return l;
361 84b1cb73 2003-09-30 devnull outT0(Tmesg type)
363 84b1cb73 2003-09-30 devnull outstart(type);
364 84b1cb73 2003-09-30 devnull outsend();
368 84b1cb73 2003-09-30 devnull outTl(Tmesg type, long l)
370 84b1cb73 2003-09-30 devnull outstart(type);
371 84b1cb73 2003-09-30 devnull outlong(l);
372 84b1cb73 2003-09-30 devnull outsend();
376 84b1cb73 2003-09-30 devnull outTs(Tmesg type, int s)
378 84b1cb73 2003-09-30 devnull outstart(type);
379 84b1cb73 2003-09-30 devnull outshort(s);
380 84b1cb73 2003-09-30 devnull outsend();
384 84b1cb73 2003-09-30 devnull outTss(Tmesg type, int s1, int s2)
386 84b1cb73 2003-09-30 devnull outstart(type);
387 84b1cb73 2003-09-30 devnull outshort(s1);
388 84b1cb73 2003-09-30 devnull outshort(s2);
389 84b1cb73 2003-09-30 devnull outsend();
393 84b1cb73 2003-09-30 devnull outTsll(Tmesg type, int s1, long l1, long l2)
395 84b1cb73 2003-09-30 devnull outstart(type);
396 84b1cb73 2003-09-30 devnull outshort(s1);
397 84b1cb73 2003-09-30 devnull outlong(l1);
398 84b1cb73 2003-09-30 devnull outlong(l2);
399 84b1cb73 2003-09-30 devnull outsend();
403 84b1cb73 2003-09-30 devnull outTsl(Tmesg type, int s1, long l1)
405 84b1cb73 2003-09-30 devnull outstart(type);
406 84b1cb73 2003-09-30 devnull outshort(s1);
407 84b1cb73 2003-09-30 devnull outlong(l1);
408 84b1cb73 2003-09-30 devnull outsend();
412 84b1cb73 2003-09-30 devnull outTsv(Tmesg type, int s1, void *l1)
414 84b1cb73 2003-09-30 devnull outstart(type);
415 84b1cb73 2003-09-30 devnull outshort(s1);
416 84b1cb73 2003-09-30 devnull outvlong(l1);
417 84b1cb73 2003-09-30 devnull outsend();
421 84b1cb73 2003-09-30 devnull outTv(Tmesg type, void *l1)
423 84b1cb73 2003-09-30 devnull outstart(type);
424 84b1cb73 2003-09-30 devnull outvlong(l1);
425 84b1cb73 2003-09-30 devnull outsend();
429 84b1cb73 2003-09-30 devnull outTslS(Tmesg type, int s1, long l1, Rune *s)
431 84b1cb73 2003-09-30 devnull char buf[DATASIZE*3+1];
432 84b1cb73 2003-09-30 devnull char *c;
434 84b1cb73 2003-09-30 devnull outstart(type);
435 84b1cb73 2003-09-30 devnull outshort(s1);
436 84b1cb73 2003-09-30 devnull outlong(l1);
437 84b1cb73 2003-09-30 devnull c = buf;
438 84b1cb73 2003-09-30 devnull while(*s)
439 84b1cb73 2003-09-30 devnull c += runetochar(c, s++);
440 84b1cb73 2003-09-30 devnull *c++ = 0;
441 84b1cb73 2003-09-30 devnull outcopy(c-buf, (uchar *)buf);
442 84b1cb73 2003-09-30 devnull outsend();
446 84b1cb73 2003-09-30 devnull outTsls(Tmesg type, int s1, long l1, int s2)
448 84b1cb73 2003-09-30 devnull outstart(type);
449 84b1cb73 2003-09-30 devnull outshort(s1);
450 84b1cb73 2003-09-30 devnull outlong(l1);
451 84b1cb73 2003-09-30 devnull outshort(s2);
452 84b1cb73 2003-09-30 devnull outsend();
456 84b1cb73 2003-09-30 devnull outstart(Tmesg type)
458 84b1cb73 2003-09-30 devnull outdata[0] = type;
459 84b1cb73 2003-09-30 devnull outcount = 0;
463 84b1cb73 2003-09-30 devnull outcopy(int count, uchar *data)
465 84b1cb73 2003-09-30 devnull while(count--)
466 84b1cb73 2003-09-30 devnull outdata[HSIZE+outcount++] = *data++;
470 84b1cb73 2003-09-30 devnull outshort(int s)
472 84b1cb73 2003-09-30 devnull uchar buf[2];
474 84b1cb73 2003-09-30 devnull buf[0]=s;
475 84b1cb73 2003-09-30 devnull buf[1]=s>>8;
476 84b1cb73 2003-09-30 devnull outcopy(2, buf);
480 84b1cb73 2003-09-30 devnull outlong(long l)
482 84b1cb73 2003-09-30 devnull uchar buf[4];
484 84b1cb73 2003-09-30 devnull buf[0]=l;
485 84b1cb73 2003-09-30 devnull buf[1]=l>>8;
486 84b1cb73 2003-09-30 devnull buf[2]=l>>16;
487 84b1cb73 2003-09-30 devnull buf[3]=l>>24;
488 84b1cb73 2003-09-30 devnull outcopy(4, buf);
492 84b1cb73 2003-09-30 devnull outvlong(void *v)
495 84b1cb73 2003-09-30 devnull ulong l;
496 84b1cb73 2003-09-30 devnull uchar buf[8];
498 84b1cb73 2003-09-30 devnull l = (ulong) v;
499 84b1cb73 2003-09-30 devnull for(i = 0; i < sizeof(buf); i++, l >>= 8)
500 84b1cb73 2003-09-30 devnull buf[i] = l;
502 84b1cb73 2003-09-30 devnull outcopy(8, buf);
506 84b1cb73 2003-09-30 devnull outsend(void)
508 84b1cb73 2003-09-30 devnull if(outcount>DATASIZE-HSIZE)
509 84b1cb73 2003-09-30 devnull panic("outcount>sizeof outdata");
510 84b1cb73 2003-09-30 devnull outdata[1]=outcount;
511 84b1cb73 2003-09-30 devnull outdata[2]=outcount>>8;
512 941c9f36 2003-10-11 devnull if(write(hostfd[1], (char *)outdata, outcount+HSIZE)!=outcount+HSIZE)
513 84b1cb73 2003-09-30 devnull panic("write error");
518 84b1cb73 2003-09-30 devnull hsetdot(int m, long p0, long p1)
520 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
521 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
523 84b1cb73 2003-09-30 devnull flushtyping(1);
524 84b1cb73 2003-09-30 devnull flsetselect(l, p0, p1);
528 84b1cb73 2003-09-30 devnull horigin(int m, long p0)
530 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
531 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
533 84b1cb73 2003-09-30 devnull ulong n;
534 84b1cb73 2003-09-30 devnull Rune *r;
536 84b1cb73 2003-09-30 devnull if(!flprepare(l)){
537 84b1cb73 2003-09-30 devnull l->origin = p0;
540 84b1cb73 2003-09-30 devnull a = p0-l->origin;
541 84b1cb73 2003-09-30 devnull if(a>=0 && a<l->f.nchars)
542 84b1cb73 2003-09-30 devnull frdelete(&l->f, 0, a);
543 84b1cb73 2003-09-30 devnull else if(a<0 && -a<l->f.nchars){
544 84b1cb73 2003-09-30 devnull r = rload(&t->rasp, p0, l->origin, &n);
545 84b1cb73 2003-09-30 devnull frinsert(&l->f, r, r+n, 0);
547 84b1cb73 2003-09-30 devnull frdelete(&l->f, 0, l->f.nchars);
548 84b1cb73 2003-09-30 devnull l->origin = p0;
549 84b1cb73 2003-09-30 devnull scrdraw(l, t->rasp.nrunes);
550 84b1cb73 2003-09-30 devnull if(l->visible==Some)
551 84b1cb73 2003-09-30 devnull flrefresh(l, l->entire, 0);
552 84b1cb73 2003-09-30 devnull hcheck(m);
556 84b1cb73 2003-09-30 devnull hmoveto(int m, long p0)
558 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
559 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[t->front];
561 84b1cb73 2003-09-30 devnull if(p0<l->origin || p0-l->origin>l->f.nchars*9/10)
562 84b1cb73 2003-09-30 devnull outTsll(Torigin, m, p0, 2L);
566 84b1cb73 2003-09-30 devnull hcheck(int m)
568 84b1cb73 2003-09-30 devnull Flayer *l;
569 84b1cb73 2003-09-30 devnull Text *t;
570 84b1cb73 2003-09-30 devnull int reqd = 0, i;
571 84b1cb73 2003-09-30 devnull long n, nl, a;
572 84b1cb73 2003-09-30 devnull Rune *r;
574 84b1cb73 2003-09-30 devnull if(m == Untagged)
576 84b1cb73 2003-09-30 devnull t = whichtext(m);
577 84b1cb73 2003-09-30 devnull if(t == 0) /* possible in a half-built window */
579 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
580 84b1cb73 2003-09-30 devnull if(l->textfn==0 || !flprepare(l)) /* BUG: don't
581 84b1cb73 2003-09-30 devnull need this if BUG below
582 84b1cb73 2003-09-30 devnull is fixed */
583 84b1cb73 2003-09-30 devnull continue;
584 84b1cb73 2003-09-30 devnull a = t->l[i].origin;
585 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+l->f.nchars, 1);
586 84b1cb73 2003-09-30 devnull if(n<l->f.nchars) /* text missing in middle of screen */
588 84b1cb73 2003-09-30 devnull else{ /* text missing at end of screen? */
590 84b1cb73 2003-09-30 devnull if(l->f.lastlinefull)
591 84b1cb73 2003-09-30 devnull goto Checksel; /* all's well */
592 84b1cb73 2003-09-30 devnull a = t->l[i].origin+l->f.nchars;
593 84b1cb73 2003-09-30 devnull n = t->rasp.nrunes-a;
594 84b1cb73 2003-09-30 devnull if(n==0)
595 84b1cb73 2003-09-30 devnull goto Checksel;
596 84b1cb73 2003-09-30 devnull if(n>TBLOCKSIZE)
597 84b1cb73 2003-09-30 devnull n = TBLOCKSIZE;
598 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+n, 1);
599 84b1cb73 2003-09-30 devnull if(n>0){
600 84b1cb73 2003-09-30 devnull rload(&t->rasp, a, a+n, 0);
601 84b1cb73 2003-09-30 devnull nl = l->f.nchars;
602 84b1cb73 2003-09-30 devnull r = scratch;
603 84b1cb73 2003-09-30 devnull flinsert(l, r, r+n, l->origin+nl);
604 84b1cb73 2003-09-30 devnull if(nl == l->f.nchars) /* made no progress */
605 84b1cb73 2003-09-30 devnull goto Checksel;
606 84b1cb73 2003-09-30 devnull goto Again;
609 84b1cb73 2003-09-30 devnull if(!reqd){
610 84b1cb73 2003-09-30 devnull n = rcontig(&t->rasp, a, a+TBLOCKSIZE, 0);
611 84b1cb73 2003-09-30 devnull if(n <= 0)
612 84b1cb73 2003-09-30 devnull panic("hcheck request==0");
613 84b1cb73 2003-09-30 devnull outTsls(Trequest, m, a, (int)n);
614 84b1cb73 2003-09-30 devnull outTs(Tcheck, m);
615 84b1cb73 2003-09-30 devnull t->lock++; /* for the Trequest */
616 84b1cb73 2003-09-30 devnull t->lock++; /* for the Tcheck */
619 84b1cb73 2003-09-30 devnull Checksel:
620 84b1cb73 2003-09-30 devnull flsetselect(l, l->p0, l->p1);
625 84b1cb73 2003-09-30 devnull flnewlyvisible(Flayer *l)
627 84b1cb73 2003-09-30 devnull hcheck(((Text *)l->user1)->tag);
631 84b1cb73 2003-09-30 devnull hsetsnarf(int nc)
633 84b1cb73 2003-09-30 devnull char *s2;
634 84b1cb73 2003-09-30 devnull char *s1;
638 84b1cb73 2003-09-30 devnull setcursor(mousectl, &deadmouse);
639 84b1cb73 2003-09-30 devnull s2 = alloc(nc+1);
640 84b1cb73 2003-09-30 devnull for(i=0; i<nc; i++)
641 84b1cb73 2003-09-30 devnull s2[i] = getch();
642 84b1cb73 2003-09-30 devnull s2[nc] = 0;
643 84b1cb73 2003-09-30 devnull n = snarfswap(s2, nc, &s1);
644 84b1cb73 2003-09-30 devnull if(n >= 0){
647 efc2b0c9 2004-03-02 devnull if(n > 65535){
648 efc2b0c9 2004-03-02 devnull s1 = strdup("<snarf too long>");
649 efc2b0c9 2004-03-02 devnull if (!s1)
650 efc2b0c9 2004-03-02 devnull panic("strdup");
651 efc2b0c9 2004-03-02 devnull n = strlen(s1);
653 efc2b0c9 2004-03-02 devnull s1 = realloc(s1, n+1);
654 efc2b0c9 2004-03-02 devnull if (!s1)
655 efc2b0c9 2004-03-02 devnull panic("realloc");
656 efc2b0c9 2004-03-02 devnull s1[n] = 0;
658 84b1cb73 2003-09-30 devnull snarflen = n;
659 84b1cb73 2003-09-30 devnull outTs(Tsetsnarf, n);
660 941c9f36 2003-10-11 devnull if(n>0 && write(hostfd[1], s1, n)!=n)
661 84b1cb73 2003-09-30 devnull panic("snarf write error");
662 84b1cb73 2003-09-30 devnull free(s1);
664 84b1cb73 2003-09-30 devnull outTs(Tsetsnarf, 0);
665 84b1cb73 2003-09-30 devnull free(s2);
666 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
670 84b1cb73 2003-09-30 devnull hplumb(int nc)
673 84b1cb73 2003-09-30 devnull char *s;
674 84b1cb73 2003-09-30 devnull Plumbmsg *m;
676 84b1cb73 2003-09-30 devnull s = alloc(nc);
677 84b1cb73 2003-09-30 devnull for(i=0; i<nc; i++)
678 84b1cb73 2003-09-30 devnull s[i] = getch();
679 84b1cb73 2003-09-30 devnull if(plumbfd > 0){
680 84b1cb73 2003-09-30 devnull m = plumbunpack(s, nc);
681 84b1cb73 2003-09-30 devnull if(m != 0)
682 84b1cb73 2003-09-30 devnull plumbsend(plumbfd, m);
683 84b1cb73 2003-09-30 devnull plumbfree(m);
685 84b1cb73 2003-09-30 devnull free(s);
689 84b1cb73 2003-09-30 devnull hgrow(int m, long a, long new, int req)
692 84b1cb73 2003-09-30 devnull Flayer *l;
693 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
694 84b1cb73 2003-09-30 devnull long o, b;
696 84b1cb73 2003-09-30 devnull if(new <= 0)
697 84b1cb73 2003-09-30 devnull panic("hgrow");
698 84b1cb73 2003-09-30 devnull rresize(&t->rasp, a, 0L, new);
699 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
700 84b1cb73 2003-09-30 devnull if(l->textfn == 0)
701 84b1cb73 2003-09-30 devnull continue;
702 84b1cb73 2003-09-30 devnull o = l->origin;
703 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
704 84b1cb73 2003-09-30 devnull if(a < o)
705 84b1cb73 2003-09-30 devnull l->origin+=new;
706 84b1cb73 2003-09-30 devnull if(a < l->p0)
707 84b1cb73 2003-09-30 devnull l->p0+=new;
708 84b1cb73 2003-09-30 devnull if(a < l->p1)
709 84b1cb73 2003-09-30 devnull l->p1+=new;
710 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
711 84b1cb73 2003-09-30 devnull if(!req || a<o || (b>0 && b>l->f.nchars) ||
712 84b1cb73 2003-09-30 devnull (l->f.nchars==0 && a-o>0))
713 84b1cb73 2003-09-30 devnull continue;
714 84b1cb73 2003-09-30 devnull if(new>TBLOCKSIZE)
715 84b1cb73 2003-09-30 devnull new = TBLOCKSIZE;
716 84b1cb73 2003-09-30 devnull outTsls(Trequest, m, a, (int)new);
717 84b1cb73 2003-09-30 devnull t->lock++;
718 84b1cb73 2003-09-30 devnull req = 0;
723 84b1cb73 2003-09-30 devnull hdata1(Text *t, long a, Rune *r, int len)
726 84b1cb73 2003-09-30 devnull Flayer *l;
727 84b1cb73 2003-09-30 devnull long o, b;
729 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i=0; i<NL; i++, l++){
730 84b1cb73 2003-09-30 devnull if(l->textfn==0)
731 84b1cb73 2003-09-30 devnull continue;
732 84b1cb73 2003-09-30 devnull o = l->origin;
733 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
734 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
735 84b1cb73 2003-09-30 devnull if(a<o || (b>0 && b>l->f.nchars))
736 84b1cb73 2003-09-30 devnull continue;
737 84b1cb73 2003-09-30 devnull flinsert(l, r, r+len, o+b);
739 84b1cb73 2003-09-30 devnull rdata(&t->rasp, a, a+len, r);
740 84b1cb73 2003-09-30 devnull rclean(&t->rasp);
741 84b1cb73 2003-09-30 devnull return len;
745 84b1cb73 2003-09-30 devnull hdata(int m, long a, uchar *s, int len)
747 84b1cb73 2003-09-30 devnull int i, w;
748 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
749 84b1cb73 2003-09-30 devnull Rune buf[DATASIZE], *r;
751 84b1cb73 2003-09-30 devnull if(t->lock)
752 84b1cb73 2003-09-30 devnull --t->lock;
753 84b1cb73 2003-09-30 devnull if(len == 0)
754 84b1cb73 2003-09-30 devnull return 0;
755 84b1cb73 2003-09-30 devnull r = buf;
756 84b1cb73 2003-09-30 devnull for(i=0; i<len; i+=w,s+=w)
757 84b1cb73 2003-09-30 devnull w = chartorune(r++, (char*)s);
758 84b1cb73 2003-09-30 devnull return hdata1(t, a, buf, r-buf);
762 84b1cb73 2003-09-30 devnull hdatarune(int m, long a, Rune *r, int len)
764 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
766 84b1cb73 2003-09-30 devnull if(t->lock)
767 84b1cb73 2003-09-30 devnull --t->lock;
768 84b1cb73 2003-09-30 devnull if(len == 0)
769 84b1cb73 2003-09-30 devnull return 0;
770 84b1cb73 2003-09-30 devnull return hdata1(t, a, r, len);
774 84b1cb73 2003-09-30 devnull hcut(int m, long a, long old)
776 84b1cb73 2003-09-30 devnull Flayer *l;
777 84b1cb73 2003-09-30 devnull Text *t = whichtext(m);
779 84b1cb73 2003-09-30 devnull long o, b;
781 84b1cb73 2003-09-30 devnull if(t->lock)
782 84b1cb73 2003-09-30 devnull --t->lock;
783 84b1cb73 2003-09-30 devnull for(l = &t->l[0], i = 0; i<NL; i++, l++){
784 84b1cb73 2003-09-30 devnull if(l->textfn == 0)
785 84b1cb73 2003-09-30 devnull continue;
786 84b1cb73 2003-09-30 devnull o = l->origin;
787 84b1cb73 2003-09-30 devnull b = a-o-rmissing(&t->rasp, o, a);
788 84b1cb73 2003-09-30 devnull /* must prevent b temporarily becoming unsigned */
789 84b1cb73 2003-09-30 devnull if((b<0 || b<l->f.nchars) && a+old>=o){
790 84b1cb73 2003-09-30 devnull fldelete(l, b<0? o : o+b,
791 84b1cb73 2003-09-30 devnull a+old-rmissing(&t->rasp, o, a+old));
793 84b1cb73 2003-09-30 devnull if(a+old<o)
794 84b1cb73 2003-09-30 devnull l->origin-=old;
795 84b1cb73 2003-09-30 devnull else if(a<=o)
796 84b1cb73 2003-09-30 devnull l->origin = a;
797 84b1cb73 2003-09-30 devnull if(a+old<l->p0)
798 84b1cb73 2003-09-30 devnull l->p0-=old;
799 84b1cb73 2003-09-30 devnull else if(a<=l->p0)
800 84b1cb73 2003-09-30 devnull l->p0 = a;
801 84b1cb73 2003-09-30 devnull if(a+old<l->p1)
802 84b1cb73 2003-09-30 devnull l->p1-=old;
803 84b1cb73 2003-09-30 devnull else if(a<=l->p1)
804 84b1cb73 2003-09-30 devnull l->p1 = a;
806 84b1cb73 2003-09-30 devnull rresize(&t->rasp, a, old, 0L);
807 84b1cb73 2003-09-30 devnull rclean(&t->rasp);