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 uchar **name; /* first byte is ' ' or '\'': modified state */
13 84b1cb73 2003-09-30 devnull Text **text; /* pointer to Text associated with file */
14 84b1cb73 2003-09-30 devnull ushort *tag; /* text[i].tag, even if text[i] not defined */
15 84b1cb73 2003-09-30 devnull int nname;
16 84b1cb73 2003-09-30 devnull int mname;
19 84b1cb73 2003-09-30 devnull char *genmenu3(int);
20 84b1cb73 2003-09-30 devnull char *genmenu2(int);
21 84b1cb73 2003-09-30 devnull char *genmenu2c(int);
23 84b1cb73 2003-09-30 devnull enum Menu2
32 84b1cb73 2003-09-30 devnull NMENU2 = Search,
33 84b1cb73 2003-09-30 devnull Send = Search,
37 84b1cb73 2003-09-30 devnull enum Menu3
47 84b1cb73 2003-09-30 devnull char *menu2str[] = {
54 84b1cb73 2003-09-30 devnull 0, /* storage for last pattern */
57 84b1cb73 2003-09-30 devnull char *menu3str[] = {
60 84b1cb73 2003-09-30 devnull "resize",
65 84b1cb73 2003-09-30 devnull Menu menu2 = {0, genmenu2};
66 84b1cb73 2003-09-30 devnull Menu menu2c ={0, genmenu2c};
67 84b1cb73 2003-09-30 devnull Menu menu3 = {0, genmenu3};
70 84b1cb73 2003-09-30 devnull menu2hit(void)
72 84b1cb73 2003-09-30 devnull Text *t=(Text *)which->user1;
73 84b1cb73 2003-09-30 devnull int w = which-t->l;
76 84b1cb73 2003-09-30 devnull if(hversion==0 || plumbfd<0)
77 84b1cb73 2003-09-30 devnull menu2str[Plumb] = "(plumb)";
78 84b1cb73 2003-09-30 devnull m = menuhit(2, mousectl, t==&cmd? &menu2c : &menu2, nil);
79 84b1cb73 2003-09-30 devnull if(hostlock || t->lock)
82 84b1cb73 2003-09-30 devnull switch(m){
83 84b1cb73 2003-09-30 devnull case Cut:
84 84b1cb73 2003-09-30 devnull cut(t, w, 1, 1);
87 84b1cb73 2003-09-30 devnull case Paste:
88 84b1cb73 2003-09-30 devnull paste(t, w);
91 84b1cb73 2003-09-30 devnull case Snarf:
92 84b1cb73 2003-09-30 devnull snarf(t, w);
95 84b1cb73 2003-09-30 devnull case Plumb:
96 84b1cb73 2003-09-30 devnull if(hversion > 0)
97 84b1cb73 2003-09-30 devnull outTsll(Tplumb, t->tag, which->p0, which->p1);
100 84b1cb73 2003-09-30 devnull case Exch:
101 84b1cb73 2003-09-30 devnull snarf(t, w);
102 84b1cb73 2003-09-30 devnull outT0(Tstartsnarf);
103 84b1cb73 2003-09-30 devnull setlock();
106 84b1cb73 2003-09-30 devnull case Look:
107 84b1cb73 2003-09-30 devnull outTsll(Tlook, t->tag, which->p0, which->p1);
108 84b1cb73 2003-09-30 devnull setlock();
111 84b1cb73 2003-09-30 devnull case Search:
112 84b1cb73 2003-09-30 devnull outcmd();
113 84b1cb73 2003-09-30 devnull if(t==&cmd)
114 84b1cb73 2003-09-30 devnull outTsll(Tsend, 0 /*ignored*/, which->p0, which->p1);
116 84b1cb73 2003-09-30 devnull outT0(Tsearch);
117 84b1cb73 2003-09-30 devnull setlock();
123 84b1cb73 2003-09-30 devnull menu3hit(void)
125 84b1cb73 2003-09-30 devnull Rectangle r;
126 84b1cb73 2003-09-30 devnull Flayer *l;
127 84b1cb73 2003-09-30 devnull int m, i;
128 84b1cb73 2003-09-30 devnull Text *t;
130 84b1cb73 2003-09-30 devnull mw = -1;
131 84b1cb73 2003-09-30 devnull m = menuhit(3, mousectl, &menu3, nil);
132 84b1cb73 2003-09-30 devnull switch(m){
133 84b1cb73 2003-09-30 devnull case -1:
136 84b1cb73 2003-09-30 devnull case New:
137 84b1cb73 2003-09-30 devnull if(!hostlock)
138 84b1cb73 2003-09-30 devnull sweeptext(1, 0);
141 84b1cb73 2003-09-30 devnull case Zerox:
142 84b1cb73 2003-09-30 devnull case Resize:
143 84b1cb73 2003-09-30 devnull if(!hostlock){
144 84b1cb73 2003-09-30 devnull setcursor(mousectl, &bullseye);
145 84b1cb73 2003-09-30 devnull buttons(Down);
146 84b1cb73 2003-09-30 devnull if((mousep->buttons&4) && (l = flwhich(mousep->xy)) && getr(&r))
147 84b1cb73 2003-09-30 devnull duplicate(l, r, l->f.font, m==Resize);
149 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
150 84b1cb73 2003-09-30 devnull buttons(Up);
154 84b1cb73 2003-09-30 devnull case Close:
155 84b1cb73 2003-09-30 devnull if(!hostlock){
156 84b1cb73 2003-09-30 devnull setcursor(mousectl, &bullseye);
157 84b1cb73 2003-09-30 devnull buttons(Down);
158 84b1cb73 2003-09-30 devnull if((mousep->buttons&4) && (l = flwhich(mousep->xy)) && !hostlock){
159 84b1cb73 2003-09-30 devnull t=(Text *)l->user1;
160 84b1cb73 2003-09-30 devnull if (t->nwin>1)
161 84b1cb73 2003-09-30 devnull closeup(l);
162 84b1cb73 2003-09-30 devnull else if(t!=&cmd) {
163 84b1cb73 2003-09-30 devnull outTs(Tclose, t->tag);
164 84b1cb73 2003-09-30 devnull setlock();
167 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
168 84b1cb73 2003-09-30 devnull buttons(Up);
172 84b1cb73 2003-09-30 devnull case Write:
173 84b1cb73 2003-09-30 devnull if(!hostlock){
174 84b1cb73 2003-09-30 devnull setcursor(mousectl, &bullseye);
175 84b1cb73 2003-09-30 devnull buttons(Down);
176 84b1cb73 2003-09-30 devnull if((mousep->buttons&4) && (l = flwhich(mousep->xy))){
177 84b1cb73 2003-09-30 devnull outTs(Twrite, ((Text *)l->user1)->tag);
178 84b1cb73 2003-09-30 devnull setlock();
180 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
181 84b1cb73 2003-09-30 devnull buttons(Up);
185 84b1cb73 2003-09-30 devnull default:
186 84b1cb73 2003-09-30 devnull if(t = text[m-NMENU3]){
187 84b1cb73 2003-09-30 devnull i = t->front;
188 84b1cb73 2003-09-30 devnull if(t->nwin==0 || t->l[i].textfn==0)
189 84b1cb73 2003-09-30 devnull return; /* not ready yet; try again later */
190 84b1cb73 2003-09-30 devnull if(t->nwin>1 && which==&t->l[i])
192 84b1cb73 2003-09-30 devnull if(++i==NL)
194 84b1cb73 2003-09-30 devnull while(i!=t->front && t->l[i].textfn==0);
195 84b1cb73 2003-09-30 devnull current(&t->l[i]);
196 84b1cb73 2003-09-30 devnull }else if(!hostlock)
197 84b1cb73 2003-09-30 devnull sweeptext(0, tag[m-NMENU3]);
204 84b1cb73 2003-09-30 devnull sweeptext(int new, int tag)
206 84b1cb73 2003-09-30 devnull Rectangle r;
207 84b1cb73 2003-09-30 devnull Text *t;
209 84b1cb73 2003-09-30 devnull if(getr(&r) && (t = malloc(sizeof(Text)))){
210 84b1cb73 2003-09-30 devnull memset((void*)t, 0, sizeof(Text));
211 84b1cb73 2003-09-30 devnull current((Flayer *)0);
212 84b1cb73 2003-09-30 devnull flnew(&t->l[0], gettext, 0, (char *)t);
213 84b1cb73 2003-09-30 devnull flinit(&t->l[0], r, font, maincols); /*bnl*/
214 84b1cb73 2003-09-30 devnull t->nwin = 1;
215 84b1cb73 2003-09-30 devnull rinit(&t->rasp);
217 84b1cb73 2003-09-30 devnull startnewfile(Tstartnewfile, t);
219 84b1cb73 2003-09-30 devnull rinit(&t->rasp);
220 84b1cb73 2003-09-30 devnull t->tag = tag;
221 84b1cb73 2003-09-30 devnull startfile(t);
223 84b1cb73 2003-09-30 devnull return t;
225 84b1cb73 2003-09-30 devnull return 0;
229 84b1cb73 2003-09-30 devnull whichmenu(int tg)
233 84b1cb73 2003-09-30 devnull for(i=0; i<nname; i++)
234 84b1cb73 2003-09-30 devnull if(tag[i] == tg)
235 84b1cb73 2003-09-30 devnull return i;
236 84b1cb73 2003-09-30 devnull return -1;
240 84b1cb73 2003-09-30 devnull menuins(int n, uchar *s, Text *t, int m, int tg)
244 84b1cb73 2003-09-30 devnull if(nname == mname){
245 84b1cb73 2003-09-30 devnull if(mname == 0)
246 84b1cb73 2003-09-30 devnull mname = 32;
248 84b1cb73 2003-09-30 devnull mname *= 2;
249 84b1cb73 2003-09-30 devnull name = realloc(name, sizeof(name[0])*mname);
250 84b1cb73 2003-09-30 devnull text = realloc(text, sizeof(text[0])*mname);
251 84b1cb73 2003-09-30 devnull tag = realloc(tag, sizeof(tag[0])*mname);
252 84b1cb73 2003-09-30 devnull if(name==nil || text==nil || tag==nil)
253 84b1cb73 2003-09-30 devnull panic("realloc");
255 84b1cb73 2003-09-30 devnull for(i=nname; i>n; --i)
256 84b1cb73 2003-09-30 devnull name[i]=name[i-1], text[i]=text[i-1], tag[i]=tag[i-1];
257 84b1cb73 2003-09-30 devnull text[n] = t;
258 84b1cb73 2003-09-30 devnull tag[n] = tg;
259 84b1cb73 2003-09-30 devnull name[n] = alloc(strlen((char*)s)+2);
260 84b1cb73 2003-09-30 devnull name[n][0] = m;
261 84b1cb73 2003-09-30 devnull strcpy((char*)name[n]+1, (char*)s);
262 84b1cb73 2003-09-30 devnull nname++;
263 84b1cb73 2003-09-30 devnull menu3.lasthit = n+NMENU3;
267 84b1cb73 2003-09-30 devnull menudel(int n)
271 84b1cb73 2003-09-30 devnull if(nname==0 || n>=nname || text[n])
272 84b1cb73 2003-09-30 devnull panic("menudel");
273 84b1cb73 2003-09-30 devnull free(name[n]);
274 84b1cb73 2003-09-30 devnull --nname;
275 84b1cb73 2003-09-30 devnull for(i = n; i<nname; i++)
276 84b1cb73 2003-09-30 devnull name[i]=name[i+1], text[i]=text[i+1], tag[i]=tag[i+1];
280 84b1cb73 2003-09-30 devnull setpat(char *s)
282 84b1cb73 2003-09-30 devnull static char pat[17];
284 84b1cb73 2003-09-30 devnull pat[0] = '/';
285 84b1cb73 2003-09-30 devnull strncpy(pat+1, s, 15);
286 84b1cb73 2003-09-30 devnull menu2str[Search] = pat;
289 84b1cb73 2003-09-30 devnull #define NBUF 64
290 84b1cb73 2003-09-30 devnull static uchar buf[NBUF*UTFmax]={' ', ' ', ' ', ' '};
293 84b1cb73 2003-09-30 devnull paren(char *s)
295 84b1cb73 2003-09-30 devnull uchar *t = buf;
297 84b1cb73 2003-09-30 devnull *t++ = '(';
298 84b1cb73 2003-09-30 devnull do; while(*t++ = *s++);
299 84b1cb73 2003-09-30 devnull t[-1] = ')';
301 84b1cb73 2003-09-30 devnull return (char *)buf;
304 84b1cb73 2003-09-30 devnull genmenu2(int n)
306 84b1cb73 2003-09-30 devnull Text *t=(Text *)which->user1;
307 84b1cb73 2003-09-30 devnull char *p;
308 84b1cb73 2003-09-30 devnull if(n>=NMENU2+(menu2str[Search]!=0))
309 84b1cb73 2003-09-30 devnull return 0;
310 84b1cb73 2003-09-30 devnull p = menu2str[n];
311 84b1cb73 2003-09-30 devnull if(!hostlock && !t->lock || n==Search || n==Look)
312 84b1cb73 2003-09-30 devnull return p;
313 84b1cb73 2003-09-30 devnull return paren(p);
316 84b1cb73 2003-09-30 devnull genmenu2c(int n)
318 84b1cb73 2003-09-30 devnull Text *t=(Text *)which->user1;
319 84b1cb73 2003-09-30 devnull char *p;
320 84b1cb73 2003-09-30 devnull if(n >= NMENU2C)
321 84b1cb73 2003-09-30 devnull return 0;
322 84b1cb73 2003-09-30 devnull if(n == Send)
323 84b1cb73 2003-09-30 devnull p="send";
325 84b1cb73 2003-09-30 devnull p = menu2str[n];
326 84b1cb73 2003-09-30 devnull if(!hostlock && !t->lock)
327 84b1cb73 2003-09-30 devnull return p;
328 84b1cb73 2003-09-30 devnull return paren(p);
331 84b1cb73 2003-09-30 devnull genmenu3(int n)
333 84b1cb73 2003-09-30 devnull Text *t;
334 84b1cb73 2003-09-30 devnull int c, i, k, l, w;
336 84b1cb73 2003-09-30 devnull char *p;
338 84b1cb73 2003-09-30 devnull if(n >= NMENU3+nname)
339 84b1cb73 2003-09-30 devnull return 0;
340 84b1cb73 2003-09-30 devnull if(n < NMENU3){
341 84b1cb73 2003-09-30 devnull p = menu3str[n];
342 84b1cb73 2003-09-30 devnull if(hostlock)
343 84b1cb73 2003-09-30 devnull p = paren(p);
344 84b1cb73 2003-09-30 devnull return p;
346 84b1cb73 2003-09-30 devnull n -= NMENU3;
347 84b1cb73 2003-09-30 devnull if(n == 0) /* unless we've been fooled, this is cmd */
348 84b1cb73 2003-09-30 devnull return (char *)&name[n][1];
349 84b1cb73 2003-09-30 devnull if(mw == -1){
350 84b1cb73 2003-09-30 devnull mw = 7; /* strlen("~~sam~~"); */
351 84b1cb73 2003-09-30 devnull for(i=1; i<nname; i++){
352 84b1cb73 2003-09-30 devnull w = utflen((char*)name[i]+1)+4; /* include "'+. " */
353 84b1cb73 2003-09-30 devnull if(w > mw)
357 84b1cb73 2003-09-30 devnull if(mw > NBUF)
358 84b1cb73 2003-09-30 devnull mw = NBUF;
359 84b1cb73 2003-09-30 devnull t = text[n];
360 84b1cb73 2003-09-30 devnull buf[0] = name[n][0];
361 84b1cb73 2003-09-30 devnull buf[1] = '-';
362 84b1cb73 2003-09-30 devnull buf[2] = ' ';
363 84b1cb73 2003-09-30 devnull buf[3] = ' ';
365 84b1cb73 2003-09-30 devnull if(t->nwin == 1)
366 84b1cb73 2003-09-30 devnull buf[1] = '+';
367 84b1cb73 2003-09-30 devnull else if(t->nwin > 1)
368 84b1cb73 2003-09-30 devnull buf[1] = '*';
369 84b1cb73 2003-09-30 devnull if(work && t==(Text *)work->user1) {
370 84b1cb73 2003-09-30 devnull buf[2]= '.';
371 84b1cb73 2003-09-30 devnull if(modified)
372 84b1cb73 2003-09-30 devnull buf[0] = '\'';
375 84b1cb73 2003-09-30 devnull l = utflen((char*)name[n]+1);
376 84b1cb73 2003-09-30 devnull if(l > NBUF-4-2){
379 84b1cb73 2003-09-30 devnull while(i < NBUF/2){
380 84b1cb73 2003-09-30 devnull k += chartorune(&r, (char*)name[n]+k);
383 84b1cb73 2003-09-30 devnull c = name[n][k];
384 84b1cb73 2003-09-30 devnull name[n][k] = 0;
385 84b1cb73 2003-09-30 devnull strcpy((char*)buf+4, (char*)name[n]+1);
386 84b1cb73 2003-09-30 devnull name[n][k] = c;
387 84b1cb73 2003-09-30 devnull strcat((char*)buf, "...");
388 84b1cb73 2003-09-30 devnull while((l-i) >= NBUF/2-4){
389 84b1cb73 2003-09-30 devnull k += chartorune(&r, (char*)name[n]+k);
392 84b1cb73 2003-09-30 devnull strcat((char*)buf, (char*)name[n]+k);
394 84b1cb73 2003-09-30 devnull strcpy((char*)buf+4, (char*)name[n]+1);
395 84b1cb73 2003-09-30 devnull i = utflen((char*)buf);
396 84b1cb73 2003-09-30 devnull k = strlen((char*)buf);
397 84b1cb73 2003-09-30 devnull while(i<mw && k<sizeof buf-1){
398 84b1cb73 2003-09-30 devnull buf[k++] = ' ';
401 84b1cb73 2003-09-30 devnull buf[k] = 0;
402 84b1cb73 2003-09-30 devnull return (char *)buf;