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 "flayer.h"
10 84b1cb73 2003-09-30 devnull #include "samterm.h"
12 84b1cb73 2003-09-30 devnull Text cmd;
13 84b1cb73 2003-09-30 devnull Rune *scratch;
14 84b1cb73 2003-09-30 devnull long nscralloc;
15 84b1cb73 2003-09-30 devnull Cursor *cursor;
16 84b1cb73 2003-09-30 devnull Flayer *which = 0;
17 84b1cb73 2003-09-30 devnull Flayer *work = 0;
18 84b1cb73 2003-09-30 devnull long snarflen;
19 84b1cb73 2003-09-30 devnull long typestart = -1;
20 84b1cb73 2003-09-30 devnull long typeend = -1;
21 84b1cb73 2003-09-30 devnull long typeesc = -1;
22 84b1cb73 2003-09-30 devnull long modified = 0; /* strange lookahead for menus */
23 84b1cb73 2003-09-30 devnull char hostlock = 1;
24 84b1cb73 2003-09-30 devnull char hasunlocked = 0;
25 84b1cb73 2003-09-30 devnull int maxtab = 8;
28 84b1cb73 2003-09-30 devnull threadmain(int argc, char *argv[])
30 84b1cb73 2003-09-30 devnull int i, got, scr;
32 84b1cb73 2003-09-30 devnull Rectangle r;
33 84b1cb73 2003-09-30 devnull Flayer *nwhich;
36 941c9f36 2003-10-11 devnull * sam is talking to us on fd 0 and 1.
37 941c9f36 2003-10-11 devnull * move these elsewhere so that if we accidentally
38 941c9f36 2003-10-11 devnull * use 0 and 1 in other code, nothing bad happens.
40 941c9f36 2003-10-11 devnull dup(0, 3);
41 941c9f36 2003-10-11 devnull dup(1, 4);
42 941c9f36 2003-10-11 devnull hostfd[0] = 3;
43 941c9f36 2003-10-11 devnull hostfd[1] = 4;
44 941c9f36 2003-10-11 devnull close(0);
45 941c9f36 2003-10-11 devnull close(1);
46 941c9f36 2003-10-11 devnull open("/dev/null", OREAD);
47 941c9f36 2003-10-11 devnull dup(2, 1);
49 84b1cb73 2003-09-30 devnull getscreen(argc, argv);
50 84b1cb73 2003-09-30 devnull iconinit();
51 84b1cb73 2003-09-30 devnull initio();
52 84b1cb73 2003-09-30 devnull scratch = alloc(100*RUNESIZE);
53 84b1cb73 2003-09-30 devnull nscralloc = 100;
54 84b1cb73 2003-09-30 devnull r = screen->r;
55 84b1cb73 2003-09-30 devnull r.max.y = r.min.y+Dy(r)/5;
56 84b1cb73 2003-09-30 devnull flstart(screen->clipr);
57 84b1cb73 2003-09-30 devnull rinit(&cmd.rasp);
58 84b1cb73 2003-09-30 devnull flnew(&cmd.l[0], gettext, 1, &cmd);
59 84b1cb73 2003-09-30 devnull flinit(&cmd.l[0], r, font, cmdcols);
60 84b1cb73 2003-09-30 devnull cmd.nwin = 1;
61 84b1cb73 2003-09-30 devnull which = &cmd.l[0];
62 84b1cb73 2003-09-30 devnull cmd.tag = Untagged;
63 84b1cb73 2003-09-30 devnull outTs(Tversion, VERSION);
64 84b1cb73 2003-09-30 devnull startnewfile(Tstartcmdfile, &cmd);
67 84b1cb73 2003-09-30 devnull for(;;got = waitforio()){
68 84b1cb73 2003-09-30 devnull if(hasunlocked && RESIZED())
69 84b1cb73 2003-09-30 devnull resize();
70 84b1cb73 2003-09-30 devnull if(got&(1<<RHost))
72 84b1cb73 2003-09-30 devnull if(got&(1<<RPlumb)){
73 84b1cb73 2003-09-30 devnull for(i=0; cmd.l[i].textfn==0; i++)
75 84b1cb73 2003-09-30 devnull current(&cmd.l[i]);
76 84b1cb73 2003-09-30 devnull flsetselect(which, cmd.rasp.nrunes, cmd.rasp.nrunes);
77 84b1cb73 2003-09-30 devnull type(which, RPlumb);
79 84b1cb73 2003-09-30 devnull if(got&(1<<RKeyboard))
80 84b1cb73 2003-09-30 devnull if(which)
81 84b1cb73 2003-09-30 devnull type(which, RKeyboard);
83 84b1cb73 2003-09-30 devnull kbdblock();
84 84b1cb73 2003-09-30 devnull if(got&(1<<RMouse)){
85 84b1cb73 2003-09-30 devnull if(hostlock==2 || !ptinrect(mousep->xy, screen->r)){
86 84b1cb73 2003-09-30 devnull mouseunblock();
87 84b1cb73 2003-09-30 devnull continue;
89 84b1cb73 2003-09-30 devnull nwhich = flwhich(mousep->xy);
90 84b1cb73 2003-09-30 devnull scr = which && ptinrect(mousep->xy, which->scroll);
91 84b1cb73 2003-09-30 devnull if(mousep->buttons)
92 84b1cb73 2003-09-30 devnull flushtyping(1);
93 84b1cb73 2003-09-30 devnull if(mousep->buttons&1){
94 84b1cb73 2003-09-30 devnull if(nwhich){
95 84b1cb73 2003-09-30 devnull if(nwhich!=which)
96 84b1cb73 2003-09-30 devnull current(nwhich);
97 84b1cb73 2003-09-30 devnull else if(scr)
98 84b1cb73 2003-09-30 devnull scroll(which, 1);
100 84b1cb73 2003-09-30 devnull t=(Text *)which->user1;
101 84b1cb73 2003-09-30 devnull if(flselect(which)){
102 84b1cb73 2003-09-30 devnull outTsl(Tdclick, t->tag, which->p0);
103 84b1cb73 2003-09-30 devnull t->lock++;
104 84b1cb73 2003-09-30 devnull }else if(t!=&cmd)
105 84b1cb73 2003-09-30 devnull outcmd();
108 84b1cb73 2003-09-30 devnull }else if((mousep->buttons&2) && which){
110 84b1cb73 2003-09-30 devnull scroll(which, 2);
112 84b1cb73 2003-09-30 devnull menu2hit();
113 84b1cb73 2003-09-30 devnull }else if((mousep->buttons&4)){
115 84b1cb73 2003-09-30 devnull scroll(which, 3);
117 84b1cb73 2003-09-30 devnull menu3hit();
119 84b1cb73 2003-09-30 devnull mouseunblock();
126 84b1cb73 2003-09-30 devnull resize(void)
130 84b1cb73 2003-09-30 devnull flresize(screen->clipr);
131 84b1cb73 2003-09-30 devnull for(i = 0; i<nname; i++)
132 84b1cb73 2003-09-30 devnull if(text[i])
133 84b1cb73 2003-09-30 devnull hcheck(text[i]->tag);
137 84b1cb73 2003-09-30 devnull current(Flayer *nw)
139 84b1cb73 2003-09-30 devnull Text *t;
141 84b1cb73 2003-09-30 devnull if(which)
142 84b1cb73 2003-09-30 devnull flborder(which, 0);
144 84b1cb73 2003-09-30 devnull flushtyping(1);
145 84b1cb73 2003-09-30 devnull flupfront(nw);
146 84b1cb73 2003-09-30 devnull flborder(nw, 1);
147 84b1cb73 2003-09-30 devnull buttons(Up);
148 84b1cb73 2003-09-30 devnull t = (Text *)nw->user1;
149 84b1cb73 2003-09-30 devnull t->front = nw-&t->l[0];
150 84b1cb73 2003-09-30 devnull if(t != &cmd)
151 84b1cb73 2003-09-30 devnull work = nw;
153 84b1cb73 2003-09-30 devnull which = nw;
157 84b1cb73 2003-09-30 devnull closeup(Flayer *l)
159 84b1cb73 2003-09-30 devnull Text *t=(Text *)l->user1;
162 84b1cb73 2003-09-30 devnull m = whichmenu(t->tag);
163 84b1cb73 2003-09-30 devnull if(m < 0)
165 84b1cb73 2003-09-30 devnull flclose(l);
166 84b1cb73 2003-09-30 devnull if(l == which){
167 84b1cb73 2003-09-30 devnull which = 0;
168 84b1cb73 2003-09-30 devnull current(flwhich(Pt(0, 0)));
170 84b1cb73 2003-09-30 devnull if(l == work)
171 84b1cb73 2003-09-30 devnull work = 0;
172 84b1cb73 2003-09-30 devnull if(--t->nwin == 0){
173 84b1cb73 2003-09-30 devnull rclear(&t->rasp);
174 84b1cb73 2003-09-30 devnull free((uchar *)t);
175 84b1cb73 2003-09-30 devnull text[m] = 0;
176 84b1cb73 2003-09-30 devnull }else if(l == &t->l[t->front]){
177 84b1cb73 2003-09-30 devnull for(m=0; m<NL; m++) /* find one; any one will do */
178 84b1cb73 2003-09-30 devnull if(t->l[m].textfn){
179 84b1cb73 2003-09-30 devnull t->front = m;
182 84b1cb73 2003-09-30 devnull panic("close");
186 84b1cb73 2003-09-30 devnull Flayer *
187 84b1cb73 2003-09-30 devnull findl(Text *t)
190 84b1cb73 2003-09-30 devnull for(i = 0; i<NL; i++)
191 84b1cb73 2003-09-30 devnull if(t->l[i].textfn==0)
192 84b1cb73 2003-09-30 devnull return &t->l[i];
193 84b1cb73 2003-09-30 devnull return 0;
197 84b1cb73 2003-09-30 devnull duplicate(Flayer *l, Rectangle r, Font *f, int close)
199 84b1cb73 2003-09-30 devnull Text *t=(Text *)l->user1;
200 84b1cb73 2003-09-30 devnull Flayer *nl = findl(t);
201 84b1cb73 2003-09-30 devnull Rune *rp;
202 84b1cb73 2003-09-30 devnull ulong n;
205 84b1cb73 2003-09-30 devnull flnew(nl, gettext, l->user0, (char *)t);
206 84b1cb73 2003-09-30 devnull flinit(nl, r, f, l->f.cols);
207 84b1cb73 2003-09-30 devnull nl->origin = l->origin;
208 84b1cb73 2003-09-30 devnull rp = (*l->textfn)(l, l->f.nchars, &n);
209 84b1cb73 2003-09-30 devnull flinsert(nl, rp, rp+n, l->origin);
210 84b1cb73 2003-09-30 devnull flsetselect(nl, l->p0, l->p1);
211 84b1cb73 2003-09-30 devnull if(close){
212 84b1cb73 2003-09-30 devnull flclose(l);
213 84b1cb73 2003-09-30 devnull if(l==which)
214 84b1cb73 2003-09-30 devnull which = 0;
216 84b1cb73 2003-09-30 devnull t->nwin++;
217 84b1cb73 2003-09-30 devnull current(nl);
218 84b1cb73 2003-09-30 devnull hcheck(t->tag);
220 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
224 84b1cb73 2003-09-30 devnull buttons(int updown)
226 84b1cb73 2003-09-30 devnull while(((mousep->buttons&7)!=0) != updown)
227 84b1cb73 2003-09-30 devnull getmouse();
231 84b1cb73 2003-09-30 devnull getr(Rectangle *rp)
233 84b1cb73 2003-09-30 devnull Point p;
234 84b1cb73 2003-09-30 devnull Rectangle r;
236 84b1cb73 2003-09-30 devnull *rp = getrect(3, mousectl);
237 84b1cb73 2003-09-30 devnull if(rp->max.x && rp->max.x-rp->min.x<=5 && rp->max.y-rp->min.y<=5){
238 84b1cb73 2003-09-30 devnull p = rp->min;
239 84b1cb73 2003-09-30 devnull r = cmd.l[cmd.front].entire;
240 84b1cb73 2003-09-30 devnull *rp = screen->r;
241 84b1cb73 2003-09-30 devnull if(cmd.nwin==1){
242 84b1cb73 2003-09-30 devnull if (p.y <= r.min.y)
243 84b1cb73 2003-09-30 devnull rp->max.y = r.min.y;
244 84b1cb73 2003-09-30 devnull else if (p.y >= r.max.y)
245 84b1cb73 2003-09-30 devnull rp->min.y = r.max.y;
246 84b1cb73 2003-09-30 devnull if (p.x <= r.min.x)
247 84b1cb73 2003-09-30 devnull rp->max.x = r.min.x;
248 84b1cb73 2003-09-30 devnull else if (p.x >= r.max.x)
249 84b1cb73 2003-09-30 devnull rp->min.x = r.max.x;
252 84b1cb73 2003-09-30 devnull return rectclip(rp, screen->r) &&
253 84b1cb73 2003-09-30 devnull rp->max.x-rp->min.x>100 && rp->max.y-rp->min.y>40;
257 84b1cb73 2003-09-30 devnull snarf(Text *t, int w)
259 84b1cb73 2003-09-30 devnull Flayer *l = &t->l[w];
261 84b1cb73 2003-09-30 devnull if(l->p1>l->p0){
262 84b1cb73 2003-09-30 devnull snarflen = l->p1-l->p0;
263 84b1cb73 2003-09-30 devnull outTsll(Tsnarf, t->tag, l->p0, l->p1);
268 84b1cb73 2003-09-30 devnull cut(Text *t, int w, int save, int check)
270 84b1cb73 2003-09-30 devnull long p0, p1;
271 84b1cb73 2003-09-30 devnull Flayer *l;
273 84b1cb73 2003-09-30 devnull l = &t->l[w];
274 84b1cb73 2003-09-30 devnull p0 = l->p0;
275 84b1cb73 2003-09-30 devnull p1 = l->p1;
276 84b1cb73 2003-09-30 devnull if(p0 == p1)
278 84b1cb73 2003-09-30 devnull if(p0 < 0)
279 84b1cb73 2003-09-30 devnull panic("cut");
280 84b1cb73 2003-09-30 devnull if(save)
281 84b1cb73 2003-09-30 devnull snarf(t, w);
282 84b1cb73 2003-09-30 devnull outTsll(Tcut, t->tag, p0, p1);
283 84b1cb73 2003-09-30 devnull flsetselect(l, p0, p0);
284 84b1cb73 2003-09-30 devnull t->lock++;
285 84b1cb73 2003-09-30 devnull hcut(t->tag, p0, p1-p0);
286 84b1cb73 2003-09-30 devnull if(check)
287 84b1cb73 2003-09-30 devnull hcheck(t->tag);
291 84b1cb73 2003-09-30 devnull paste(Text *t, int w)
293 84b1cb73 2003-09-30 devnull if(snarflen){
294 84b1cb73 2003-09-30 devnull cut(t, w, 0, 0);
295 84b1cb73 2003-09-30 devnull t->lock++;
296 84b1cb73 2003-09-30 devnull outTsl(Tpaste, t->tag, t->l[w].p0);
301 84b1cb73 2003-09-30 devnull scrorigin(Flayer *l, int but, long p0)
303 84b1cb73 2003-09-30 devnull Text *t=(Text *)l->user1;
305 84b1cb73 2003-09-30 devnull switch(but){
307 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, l->origin, p0);
310 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, p0, 1L);
313 84b1cb73 2003-09-30 devnull horigin(t->tag,p0);
318 84b1cb73 2003-09-30 devnull alnum(int c)
321 84b1cb73 2003-09-30 devnull * Hard to get absolutely right. Use what we know about ASCII
322 84b1cb73 2003-09-30 devnull * and assume anything above the Latin control characters is
323 84b1cb73 2003-09-30 devnull * potentially an alphanumeric.
325 84b1cb73 2003-09-30 devnull if(c<=' ')
326 84b1cb73 2003-09-30 devnull return 0;
327 84b1cb73 2003-09-30 devnull if(0x7F<=c && c<=0xA0)
328 84b1cb73 2003-09-30 devnull return 0;
329 84b1cb73 2003-09-30 devnull if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c))
330 84b1cb73 2003-09-30 devnull return 0;
331 84b1cb73 2003-09-30 devnull return 1;
335 84b1cb73 2003-09-30 devnull raspc(Rasp *r, long p)
337 84b1cb73 2003-09-30 devnull ulong n;
338 84b1cb73 2003-09-30 devnull rload(r, p, p+1, &n);
340 84b1cb73 2003-09-30 devnull return scratch[0];
341 84b1cb73 2003-09-30 devnull return 0;
345 84b1cb73 2003-09-30 devnull ctlw(Rasp *r, long o, long p)
349 84b1cb73 2003-09-30 devnull if(--p < o)
350 84b1cb73 2003-09-30 devnull return o;
351 84b1cb73 2003-09-30 devnull if(raspc(r, p)=='\n')
352 84b1cb73 2003-09-30 devnull return p;
353 84b1cb73 2003-09-30 devnull for(; p>=o && !alnum(c=raspc(r, p)); --p)
354 84b1cb73 2003-09-30 devnull if(c=='\n')
355 84b1cb73 2003-09-30 devnull return p+1;
356 84b1cb73 2003-09-30 devnull for(; p>o && alnum(raspc(r, p-1)); --p)
358 84b1cb73 2003-09-30 devnull return p>=o? p : o;
362 84b1cb73 2003-09-30 devnull ctlu(Rasp *r, long o, long p)
364 17f13194 2003-11-23 devnull if(--p < o)
365 17f13194 2003-11-23 devnull return o;
366 17f13194 2003-11-23 devnull if(raspc(r, p)=='\n')
367 17f13194 2003-11-23 devnull return p;
368 84b1cb73 2003-09-30 devnull for(; p-1>=o && raspc(r, p-1)!='\n'; --p)
370 84b1cb73 2003-09-30 devnull return p>=o? p : o;
374 84b1cb73 2003-09-30 devnull center(Flayer *l, long a)
376 84b1cb73 2003-09-30 devnull Text *t;
378 84b1cb73 2003-09-30 devnull t = l->user1;
379 84b1cb73 2003-09-30 devnull if(!t->lock && (a<l->origin || l->origin+l->f.nchars<a)){
380 84b1cb73 2003-09-30 devnull if(a > t->rasp.nrunes)
381 84b1cb73 2003-09-30 devnull a = t->rasp.nrunes;
382 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, a, 2L);
383 84b1cb73 2003-09-30 devnull return 1;
385 84b1cb73 2003-09-30 devnull return 0;
389 84b1cb73 2003-09-30 devnull onethird(Flayer *l, long a)
391 84b1cb73 2003-09-30 devnull Text *t;
392 84b1cb73 2003-09-30 devnull Rectangle s;
393 84b1cb73 2003-09-30 devnull long lines;
395 84b1cb73 2003-09-30 devnull t = l->user1;
396 84b1cb73 2003-09-30 devnull if(!t->lock && (a<l->origin || l->origin+l->f.nchars<a)){
397 84b1cb73 2003-09-30 devnull if(a > t->rasp.nrunes)
398 84b1cb73 2003-09-30 devnull a = t->rasp.nrunes;
399 84b1cb73 2003-09-30 devnull s = insetrect(l->scroll, 1);
400 84b1cb73 2003-09-30 devnull lines = ((s.max.y-s.min.y)/l->f.font->height+1)/3;
401 84b1cb73 2003-09-30 devnull if (lines < 2)
402 84b1cb73 2003-09-30 devnull lines = 2;
403 84b1cb73 2003-09-30 devnull outTsll(Torigin, t->tag, a, lines);
404 84b1cb73 2003-09-30 devnull return 1;
406 84b1cb73 2003-09-30 devnull return 0;
410 84b1cb73 2003-09-30 devnull flushtyping(int clearesc)
412 84b1cb73 2003-09-30 devnull Text *t;
413 84b1cb73 2003-09-30 devnull ulong n;
415 84b1cb73 2003-09-30 devnull if(clearesc)
416 84b1cb73 2003-09-30 devnull typeesc = -1;
417 84b1cb73 2003-09-30 devnull if(typestart == typeend) {
418 84b1cb73 2003-09-30 devnull modified = 0;
421 84b1cb73 2003-09-30 devnull t = which->user1;
422 84b1cb73 2003-09-30 devnull if(t != &cmd)
423 84b1cb73 2003-09-30 devnull modified = 1;
424 84b1cb73 2003-09-30 devnull rload(&t->rasp, typestart, typeend, &n);
425 84b1cb73 2003-09-30 devnull scratch[n] = 0;
426 84b1cb73 2003-09-30 devnull if(t==&cmd && typeend==t->rasp.nrunes && scratch[typeend-typestart-1]=='\n'){
427 84b1cb73 2003-09-30 devnull setlock();
428 84b1cb73 2003-09-30 devnull outcmd();
430 84b1cb73 2003-09-30 devnull outTslS(Ttype, t->tag, typestart, scratch);
431 84b1cb73 2003-09-30 devnull typestart = -1;
432 84b1cb73 2003-09-30 devnull typeend = -1;
435 84b1cb73 2003-09-30 devnull #define SCROLLKEY Kdown
436 84b1cb73 2003-09-30 devnull #define BACKSCROLLKEY Kup
437 84b1cb73 2003-09-30 devnull #define ESC 0x1B
438 09a5f197 2004-06-09 devnull #define HOMEKEY Khome
439 09a5f197 2004-06-09 devnull #define ENDKEY Kend
440 09a5f197 2004-06-09 devnull #define PAGEUP Kpgup
441 09a5f197 2004-06-09 devnull #define PAGEDOWN Kpgdown
442 ac9d504d 2004-06-17 devnull #define LEFTARROW Kleft
443 ac9d504d 2004-06-17 devnull #define RIGHTARROW Kright
446 8414847a 2004-06-25 devnull nontypingkey(int c)
448 09a5f197 2004-06-09 devnull return c==SCROLLKEY || c==BACKSCROLLKEY
449 09a5f197 2004-06-09 devnull || c==LEFTARROW || c==RIGHTARROW
450 09a5f197 2004-06-09 devnull || c==HOMEKEY || c==ENDKEY
451 09a5f197 2004-06-09 devnull || c==PAGEUP || c==PAGEDOWN;
455 84b1cb73 2003-09-30 devnull type(Flayer *l, int res) /* what a bloody mess this is */
457 84b1cb73 2003-09-30 devnull Text *t = (Text *)l->user1;
458 84b1cb73 2003-09-30 devnull Rune buf[100];
459 84b1cb73 2003-09-30 devnull Rune *p = buf;
460 84b1cb73 2003-09-30 devnull int c, backspacing;
461 84b1cb73 2003-09-30 devnull long a, a0;
462 84b1cb73 2003-09-30 devnull int scrollkey;
464 84b1cb73 2003-09-30 devnull scrollkey = 0;
465 84b1cb73 2003-09-30 devnull if(res == RKeyboard)
466 09a5f197 2004-06-09 devnull scrollkey = nontypingkey(qpeekc()); /* ICK */
468 84b1cb73 2003-09-30 devnull if(hostlock || t->lock){
469 84b1cb73 2003-09-30 devnull kbdblock();
472 84b1cb73 2003-09-30 devnull a = l->p0;
473 84b1cb73 2003-09-30 devnull if(a!=l->p1 && !scrollkey){
474 84b1cb73 2003-09-30 devnull flushtyping(1);
475 84b1cb73 2003-09-30 devnull cut(t, t->front, 1, 1);
476 84b1cb73 2003-09-30 devnull return; /* it may now be locked */
478 84b1cb73 2003-09-30 devnull backspacing = 0;
479 84b1cb73 2003-09-30 devnull while((c = kbdchar())>0){
480 84b1cb73 2003-09-30 devnull if(res == RKeyboard){
481 09a5f197 2004-06-09 devnull if(nontypingkey(c) || c==ESC)
483 84b1cb73 2003-09-30 devnull /* backspace, ctrl-u, ctrl-w, del */
484 84b1cb73 2003-09-30 devnull if(c=='\b' || c==0x15 || c==0x17 || c==0x7F){
485 84b1cb73 2003-09-30 devnull backspacing = 1;
489 84b1cb73 2003-09-30 devnull *p++ = c;
490 84b1cb73 2003-09-30 devnull if(c == '\n' || p >= buf+sizeof(buf)/sizeof(buf[0]))
493 84b1cb73 2003-09-30 devnull if(p > buf){
494 84b1cb73 2003-09-30 devnull if(typestart < 0)
495 84b1cb73 2003-09-30 devnull typestart = a;
496 84b1cb73 2003-09-30 devnull if(typeesc < 0)
497 84b1cb73 2003-09-30 devnull typeesc = a;
498 84b1cb73 2003-09-30 devnull hgrow(t->tag, a, p-buf, 0);
499 84b1cb73 2003-09-30 devnull t->lock++; /* pretend we Trequest'ed for hdatarune*/
500 84b1cb73 2003-09-30 devnull hdatarune(t->tag, a, buf, p-buf);
501 84b1cb73 2003-09-30 devnull a += p-buf;
502 84b1cb73 2003-09-30 devnull l->p0 = a;
503 84b1cb73 2003-09-30 devnull l->p1 = a;
504 84b1cb73 2003-09-30 devnull typeend = a;
505 84b1cb73 2003-09-30 devnull if(c=='\n' || typeend-typestart>100)
506 84b1cb73 2003-09-30 devnull flushtyping(0);
507 84b1cb73 2003-09-30 devnull onethird(l, a);
509 09a5f197 2004-06-09 devnull if(c==SCROLLKEY || c==PAGEDOWN){
510 84b1cb73 2003-09-30 devnull flushtyping(0);
511 84b1cb73 2003-09-30 devnull center(l, l->origin+l->f.nchars+1);
512 09a5f197 2004-06-09 devnull }else if(c==BACKSCROLLKEY || c==PAGEUP){
513 84b1cb73 2003-09-30 devnull flushtyping(0);
514 84b1cb73 2003-09-30 devnull a0 = l->origin-l->f.nchars;
515 84b1cb73 2003-09-30 devnull if(a0 < 0)
517 84b1cb73 2003-09-30 devnull center(l, a0);
518 09a5f197 2004-06-09 devnull }else if(c == RIGHTARROW){
519 09a5f197 2004-06-09 devnull flushtyping(0);
520 09a5f197 2004-06-09 devnull a0 = l->p0;
521 09a5f197 2004-06-09 devnull if(a0 < t->rasp.nrunes)
523 09a5f197 2004-06-09 devnull flsetselect(l, a0, a0);
524 09a5f197 2004-06-09 devnull center(l, a0);
525 09a5f197 2004-06-09 devnull }else if(c == LEFTARROW){
526 09a5f197 2004-06-09 devnull flushtyping(0);
527 09a5f197 2004-06-09 devnull a0 = l->p0;
528 09a5f197 2004-06-09 devnull if(a0 > 0)
530 09a5f197 2004-06-09 devnull flsetselect(l, a0, a0);
531 09a5f197 2004-06-09 devnull center(l, a0);
532 09a5f197 2004-06-09 devnull }else if(c == HOMEKEY){
533 09a5f197 2004-06-09 devnull flushtyping(0);
534 09a5f197 2004-06-09 devnull center(l, 0);
535 09a5f197 2004-06-09 devnull }else if(c == ENDKEY){
536 09a5f197 2004-06-09 devnull flushtyping(0);
537 09a5f197 2004-06-09 devnull center(l, t->rasp.nrunes);
538 84b1cb73 2003-09-30 devnull }else if(backspacing && !hostlock){
539 ac9d504d 2004-06-17 devnull /* backspacing immediately after outcmd(): sorry */
540 84b1cb73 2003-09-30 devnull if(l->f.p0>0 && a>0){
541 84b1cb73 2003-09-30 devnull switch(c){
542 84b1cb73 2003-09-30 devnull case '\b':
543 84b1cb73 2003-09-30 devnull case 0x7F: /* del */
544 84b1cb73 2003-09-30 devnull l->p0 = a-1;
546 84b1cb73 2003-09-30 devnull case 0x15: /* ctrl-u */
547 84b1cb73 2003-09-30 devnull l->p0 = ctlu(&t->rasp, l->origin, a);
549 84b1cb73 2003-09-30 devnull case 0x17: /* ctrl-w */
550 84b1cb73 2003-09-30 devnull l->p0 = ctlw(&t->rasp, l->origin, a);
553 84b1cb73 2003-09-30 devnull l->p1 = a;
554 84b1cb73 2003-09-30 devnull if(l->p1 != l->p0){
555 84b1cb73 2003-09-30 devnull /* cut locally if possible */
556 84b1cb73 2003-09-30 devnull if(typestart<=l->p0 && l->p1<=typeend){
557 84b1cb73 2003-09-30 devnull t->lock++; /* to call hcut */
558 84b1cb73 2003-09-30 devnull hcut(t->tag, l->p0, l->p1-l->p0);
559 84b1cb73 2003-09-30 devnull /* hcheck is local because we know rasp is contiguous */
560 84b1cb73 2003-09-30 devnull hcheck(t->tag);
562 84b1cb73 2003-09-30 devnull flushtyping(0);
563 84b1cb73 2003-09-30 devnull cut(t, t->front, 0, 1);
566 84b1cb73 2003-09-30 devnull if(typeesc >= l->p0)
567 84b1cb73 2003-09-30 devnull typeesc = l->p0;
568 84b1cb73 2003-09-30 devnull if(typestart >= 0){
569 84b1cb73 2003-09-30 devnull if(typestart >= l->p0)
570 84b1cb73 2003-09-30 devnull typestart = l->p0;
571 84b1cb73 2003-09-30 devnull typeend = l->p0;
572 84b1cb73 2003-09-30 devnull if(typestart == typeend){
573 84b1cb73 2003-09-30 devnull typestart = -1;
574 84b1cb73 2003-09-30 devnull typeend = -1;
575 84b1cb73 2003-09-30 devnull modified = 0;
580 84b1cb73 2003-09-30 devnull if(c==ESC && typeesc>=0){
581 84b1cb73 2003-09-30 devnull l->p0 = typeesc;
582 84b1cb73 2003-09-30 devnull l->p1 = a;
583 84b1cb73 2003-09-30 devnull flushtyping(1);
585 84b1cb73 2003-09-30 devnull for(l=t->l; l<&t->l[NL]; l++)
586 84b1cb73 2003-09-30 devnull if(l->textfn)
587 84b1cb73 2003-09-30 devnull flsetselect(l, l->p0, l->p1);
593 84b1cb73 2003-09-30 devnull outcmd(void){
594 84b1cb73 2003-09-30 devnull if(work)
595 84b1cb73 2003-09-30 devnull outTsll(Tworkfile, ((Text *)work->user1)->tag, work->p0, work->p1);
599 84b1cb73 2003-09-30 devnull panic(char *s)
601 84b1cb73 2003-09-30 devnull panic1(display, s);
605 84b1cb73 2003-09-30 devnull panic1(Display *d, char *s)
607 84b1cb73 2003-09-30 devnull fprint(2, "samterm:panic: ");
608 84b1cb73 2003-09-30 devnull perror(s);
609 84b1cb73 2003-09-30 devnull abort();
613 84b1cb73 2003-09-30 devnull gettext(Flayer *l, long n, ulong *np)
615 84b1cb73 2003-09-30 devnull Text *t;
617 84b1cb73 2003-09-30 devnull t = l->user1;
618 84b1cb73 2003-09-30 devnull rload(&t->rasp, l->origin, l->origin+n, np);
619 84b1cb73 2003-09-30 devnull return scratch;
623 84b1cb73 2003-09-30 devnull scrtotal(Flayer *l)
625 84b1cb73 2003-09-30 devnull return ((Text *)l->user1)->rasp.nrunes;
629 84b1cb73 2003-09-30 devnull alloc(ulong n)
631 84b1cb73 2003-09-30 devnull void *p;
633 84b1cb73 2003-09-30 devnull p = malloc(n);
634 84b1cb73 2003-09-30 devnull if(p == 0)
635 84b1cb73 2003-09-30 devnull panic("alloc");
636 84b1cb73 2003-09-30 devnull memset(p, 0, n);
637 84b1cb73 2003-09-30 devnull return p;