1*37da2899SCharles.Forsyth #include <lib9.h>
2*37da2899SCharles.Forsyth #include <kernel.h>
3*37da2899SCharles.Forsyth #include "interp.h"
4*37da2899SCharles.Forsyth #include "isa.h"
5*37da2899SCharles.Forsyth #include "runt.h"
6*37da2899SCharles.Forsyth #include "prefabmod.h"
7*37da2899SCharles.Forsyth #include "draw.h"
8*37da2899SCharles.Forsyth #include "drawif.h"
9*37da2899SCharles.Forsyth #include "prefab.h"
10*37da2899SCharles.Forsyth #include "raise.h"
11*37da2899SCharles.Forsyth
12*37da2899SCharles.Forsyth uchar elementmap[] = Prefab_Element_map;
13*37da2899SCharles.Forsyth uchar compoundmap[] = Prefab_Compound_map;
14*37da2899SCharles.Forsyth uchar layoutmap[] = Prefab_Layout_map;
15*37da2899SCharles.Forsyth
16*37da2899SCharles.Forsyth void freeprefabcompound(Heap*, int);
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsyth Type* TCompound;
19*37da2899SCharles.Forsyth Type* TElement;
20*37da2899SCharles.Forsyth Type* TLayout;
21*37da2899SCharles.Forsyth
22*37da2899SCharles.Forsyth /* Infrared remote buttons known to Compound_select */
23*37da2899SCharles.Forsyth enum
24*37da2899SCharles.Forsyth {
25*37da2899SCharles.Forsyth IRFF = 14,
26*37da2899SCharles.Forsyth IRRew = 15,
27*37da2899SCharles.Forsyth IRUp = 16,
28*37da2899SCharles.Forsyth IRDn = 17,
29*37da2899SCharles.Forsyth IRSelect = 18,
30*37da2899SCharles.Forsyth IREnter = 20,
31*37da2899SCharles.Forsyth };
32*37da2899SCharles.Forsyth
33*37da2899SCharles.Forsyth void
prefabmodinit(void)34*37da2899SCharles.Forsyth prefabmodinit(void)
35*37da2899SCharles.Forsyth {
36*37da2899SCharles.Forsyth TElement = dtype(freeheap, sizeof(PElement), elementmap, sizeof(elementmap));
37*37da2899SCharles.Forsyth TLayout = dtype(freeheap, Prefab_Layout_size, layoutmap, sizeof(layoutmap));
38*37da2899SCharles.Forsyth TCompound = dtype(freeprefabcompound, sizeof(PCompound), compoundmap, sizeof(compoundmap));
39*37da2899SCharles.Forsyth builtinmod("$Prefab", Prefabmodtab, Prefabmodlen);
40*37da2899SCharles.Forsyth }
41*37da2899SCharles.Forsyth
42*37da2899SCharles.Forsyth PElement*
checkelement(Prefab_Element * de)43*37da2899SCharles.Forsyth checkelement(Prefab_Element *de)
44*37da2899SCharles.Forsyth {
45*37da2899SCharles.Forsyth PElement *pe;
46*37da2899SCharles.Forsyth
47*37da2899SCharles.Forsyth pe = lookupelement(de);
48*37da2899SCharles.Forsyth if(pe == H)
49*37da2899SCharles.Forsyth error(exType);
50*37da2899SCharles.Forsyth return pe;
51*37da2899SCharles.Forsyth }
52*37da2899SCharles.Forsyth
53*37da2899SCharles.Forsyth PCompound*
checkcompound(Prefab_Compound * de)54*37da2899SCharles.Forsyth checkcompound(Prefab_Compound *de)
55*37da2899SCharles.Forsyth {
56*37da2899SCharles.Forsyth PCompound *pe;
57*37da2899SCharles.Forsyth
58*37da2899SCharles.Forsyth pe = lookupcompound(de);
59*37da2899SCharles.Forsyth if(pe == H)
60*37da2899SCharles.Forsyth error(exType);
61*37da2899SCharles.Forsyth return pe;
62*37da2899SCharles.Forsyth }
63*37da2899SCharles.Forsyth
64*37da2899SCharles.Forsyth PElement*
lookupelement(Prefab_Element * de)65*37da2899SCharles.Forsyth lookupelement(Prefab_Element *de)
66*37da2899SCharles.Forsyth {
67*37da2899SCharles.Forsyth PElement *pe;
68*37da2899SCharles.Forsyth if(de == H)
69*37da2899SCharles.Forsyth return H;
70*37da2899SCharles.Forsyth if(D2H(de)->t != TElement)
71*37da2899SCharles.Forsyth return H;
72*37da2899SCharles.Forsyth pe = (PElement*)de;
73*37da2899SCharles.Forsyth if(de->kind!=pe->pkind || de->kids!=pe->first)
74*37da2899SCharles.Forsyth return H;
75*37da2899SCharles.Forsyth return pe;
76*37da2899SCharles.Forsyth }
77*37da2899SCharles.Forsyth
78*37da2899SCharles.Forsyth PCompound*
lookupcompound(Prefab_Compound * dc)79*37da2899SCharles.Forsyth lookupcompound(Prefab_Compound *dc)
80*37da2899SCharles.Forsyth {
81*37da2899SCharles.Forsyth if(dc == H)
82*37da2899SCharles.Forsyth return H;
83*37da2899SCharles.Forsyth if(D2H(dc)->t != TCompound)
84*37da2899SCharles.Forsyth return H;
85*37da2899SCharles.Forsyth return (PCompound*)dc;
86*37da2899SCharles.Forsyth }
87*37da2899SCharles.Forsyth
88*37da2899SCharles.Forsyth void
freeprefabcompound(Heap * h,int swept)89*37da2899SCharles.Forsyth freeprefabcompound(Heap *h, int swept)
90*37da2899SCharles.Forsyth {
91*37da2899SCharles.Forsyth Image *i;
92*37da2899SCharles.Forsyth Prefab_Compound *d;
93*37da2899SCharles.Forsyth PCompound *pc;
94*37da2899SCharles.Forsyth
95*37da2899SCharles.Forsyth d = H2D(Prefab_Compound*, h);
96*37da2899SCharles.Forsyth pc = lookupcompound(d);
97*37da2899SCharles.Forsyth /* disconnect compound from image refresh daemon */
98*37da2899SCharles.Forsyth i = lookupimage(pc->c.image);
99*37da2899SCharles.Forsyth if(i != nil)
100*37da2899SCharles.Forsyth delrefresh(i);
101*37da2899SCharles.Forsyth if(!swept && TCompound->np)
102*37da2899SCharles.Forsyth freeptrs(d, TCompound);
103*37da2899SCharles.Forsyth /* header will be freed by caller */
104*37da2899SCharles.Forsyth }
105*37da2899SCharles.Forsyth
106*37da2899SCharles.Forsyth static
107*37da2899SCharles.Forsyth PElement*
findtag(PElement * pelem,char * tag)108*37da2899SCharles.Forsyth findtag(PElement *pelem, char *tag)
109*37da2899SCharles.Forsyth {
110*37da2899SCharles.Forsyth PElement *pe, *t;
111*37da2899SCharles.Forsyth List *l;
112*37da2899SCharles.Forsyth
113*37da2899SCharles.Forsyth if(pelem==H || tag[0]==0)
114*37da2899SCharles.Forsyth return pelem;
115*37da2899SCharles.Forsyth for(l=pelem->first; l!=H; l=l->tail){
116*37da2899SCharles.Forsyth pe = *(PElement**)l->data;
117*37da2899SCharles.Forsyth if(strcmp(tag, string2c(pe->e.tag)) == 0)
118*37da2899SCharles.Forsyth return pe;
119*37da2899SCharles.Forsyth else if(pe->pkind==EHorizontal || pe->pkind==EVertical){
120*37da2899SCharles.Forsyth t = findtag(pe, tag);
121*37da2899SCharles.Forsyth if(t != H)
122*37da2899SCharles.Forsyth return t;
123*37da2899SCharles.Forsyth }
124*37da2899SCharles.Forsyth }
125*37da2899SCharles.Forsyth return H;
126*37da2899SCharles.Forsyth }
127*37da2899SCharles.Forsyth
128*37da2899SCharles.Forsyth int
badenviron(Prefab_Environ * env,int err)129*37da2899SCharles.Forsyth badenviron(Prefab_Environ *env, int err)
130*37da2899SCharles.Forsyth {
131*37da2899SCharles.Forsyth Prefab_Style *s;
132*37da2899SCharles.Forsyth
133*37da2899SCharles.Forsyth if(env == H)
134*37da2899SCharles.Forsyth goto bad;
135*37da2899SCharles.Forsyth s = env->style;
136*37da2899SCharles.Forsyth if(s == H)
137*37da2899SCharles.Forsyth goto bad;
138*37da2899SCharles.Forsyth if(s->titlefont==H || s->textfont==H)
139*37da2899SCharles.Forsyth goto bad;
140*37da2899SCharles.Forsyth if(s->elemcolor==H || s->edgecolor==H)
141*37da2899SCharles.Forsyth goto bad;
142*37da2899SCharles.Forsyth if(s->titlecolor==H || s->textcolor==H || s->highlightcolor==H)
143*37da2899SCharles.Forsyth goto bad;
144*37da2899SCharles.Forsyth return 0;
145*37da2899SCharles.Forsyth bad:
146*37da2899SCharles.Forsyth if(err)
147*37da2899SCharles.Forsyth error(exType);
148*37da2899SCharles.Forsyth return 1;
149*37da2899SCharles.Forsyth }
150*37da2899SCharles.Forsyth
151*37da2899SCharles.Forsyth void
Element_iconseparator(void * fp,int kind)152*37da2899SCharles.Forsyth Element_iconseparator(void *fp, int kind)
153*37da2899SCharles.Forsyth {
154*37da2899SCharles.Forsyth F_Element_icon *f;
155*37da2899SCharles.Forsyth PElement *e;
156*37da2899SCharles.Forsyth Image *icon;
157*37da2899SCharles.Forsyth int locked;
158*37da2899SCharles.Forsyth
159*37da2899SCharles.Forsyth f = fp;
160*37da2899SCharles.Forsyth badenviron(f->env, 1);
161*37da2899SCharles.Forsyth checkimage(f->mask);
162*37da2899SCharles.Forsyth icon = checkimage(f->icon);
163*37da2899SCharles.Forsyth locked = lockdisplay(icon->display);
164*37da2899SCharles.Forsyth destroy(*f->ret);
165*37da2899SCharles.Forsyth *f->ret = H;
166*37da2899SCharles.Forsyth if(kind == ESeparator)
167*37da2899SCharles.Forsyth e = separatorelement(f->env, f->r, f->icon, f->mask);
168*37da2899SCharles.Forsyth else
169*37da2899SCharles.Forsyth e = iconelement(f->env, f->r, f->icon, f->mask);
170*37da2899SCharles.Forsyth *f->ret = (Prefab_Element*)e;
171*37da2899SCharles.Forsyth if(locked)
172*37da2899SCharles.Forsyth unlockdisplay(icon->display);
173*37da2899SCharles.Forsyth }
174*37da2899SCharles.Forsyth
175*37da2899SCharles.Forsyth void
Element_icon(void * fp)176*37da2899SCharles.Forsyth Element_icon(void *fp)
177*37da2899SCharles.Forsyth {
178*37da2899SCharles.Forsyth Element_iconseparator(fp, EIcon);
179*37da2899SCharles.Forsyth }
180*37da2899SCharles.Forsyth
181*37da2899SCharles.Forsyth void
Element_separator(void * fp)182*37da2899SCharles.Forsyth Element_separator(void *fp)
183*37da2899SCharles.Forsyth {
184*37da2899SCharles.Forsyth Element_iconseparator(fp, ESeparator);
185*37da2899SCharles.Forsyth }
186*37da2899SCharles.Forsyth
187*37da2899SCharles.Forsyth void
Element_text(void * fp)188*37da2899SCharles.Forsyth Element_text(void *fp)
189*37da2899SCharles.Forsyth {
190*37da2899SCharles.Forsyth F_Element_text *f;
191*37da2899SCharles.Forsyth PElement *pelem;
192*37da2899SCharles.Forsyth Display *disp;
193*37da2899SCharles.Forsyth int locked;
194*37da2899SCharles.Forsyth
195*37da2899SCharles.Forsyth f = fp;
196*37da2899SCharles.Forsyth badenviron(f->env, 1);
197*37da2899SCharles.Forsyth if(f->kind!=EText && f->kind!=ETitle)
198*37da2899SCharles.Forsyth return;
199*37da2899SCharles.Forsyth
200*37da2899SCharles.Forsyth disp = checkscreen(f->env->screen)->display;
201*37da2899SCharles.Forsyth locked = lockdisplay(disp);
202*37da2899SCharles.Forsyth destroy(*f->ret);
203*37da2899SCharles.Forsyth *f->ret = H;
204*37da2899SCharles.Forsyth pelem = textelement(f->env, f->text, f->r, f->kind);
205*37da2899SCharles.Forsyth *f->ret = (Prefab_Element*)pelem;
206*37da2899SCharles.Forsyth if(locked)
207*37da2899SCharles.Forsyth unlockdisplay(disp);
208*37da2899SCharles.Forsyth }
209*37da2899SCharles.Forsyth
210*37da2899SCharles.Forsyth void
Element_layout(void * fp)211*37da2899SCharles.Forsyth Element_layout(void *fp)
212*37da2899SCharles.Forsyth {
213*37da2899SCharles.Forsyth F_Element_layout *f;
214*37da2899SCharles.Forsyth PElement *pelem;
215*37da2899SCharles.Forsyth Display *disp;
216*37da2899SCharles.Forsyth int locked;
217*37da2899SCharles.Forsyth
218*37da2899SCharles.Forsyth f = fp;
219*37da2899SCharles.Forsyth badenviron(f->env, 1);
220*37da2899SCharles.Forsyth if(f->kind!=EText && f->kind!=ETitle)
221*37da2899SCharles.Forsyth return;
222*37da2899SCharles.Forsyth
223*37da2899SCharles.Forsyth disp = checkscreen(f->env->screen)->display;
224*37da2899SCharles.Forsyth locked = lockdisplay(disp);
225*37da2899SCharles.Forsyth destroy(*f->ret);
226*37da2899SCharles.Forsyth *f->ret = H;
227*37da2899SCharles.Forsyth pelem = layoutelement(f->env, f->lay, f->r, f->kind);
228*37da2899SCharles.Forsyth *f->ret = (Prefab_Element*)pelem;
229*37da2899SCharles.Forsyth if(locked)
230*37da2899SCharles.Forsyth unlockdisplay(disp);
231*37da2899SCharles.Forsyth }
232*37da2899SCharles.Forsyth
233*37da2899SCharles.Forsyth void
Element_elist(void * fp)234*37da2899SCharles.Forsyth Element_elist(void *fp)
235*37da2899SCharles.Forsyth {
236*37da2899SCharles.Forsyth F_Element_elist *f;
237*37da2899SCharles.Forsyth PElement *pelist;
238*37da2899SCharles.Forsyth Display *disp;
239*37da2899SCharles.Forsyth int locked;
240*37da2899SCharles.Forsyth
241*37da2899SCharles.Forsyth f = fp;
242*37da2899SCharles.Forsyth if(f->elem != H)
243*37da2899SCharles.Forsyth checkelement(f->elem);
244*37da2899SCharles.Forsyth badenviron(f->env, 1);
245*37da2899SCharles.Forsyth if(f->kind!=EHorizontal && f->kind!=EVertical)
246*37da2899SCharles.Forsyth return;
247*37da2899SCharles.Forsyth
248*37da2899SCharles.Forsyth disp = checkscreen(f->env->screen)->display;
249*37da2899SCharles.Forsyth locked = lockdisplay(disp);
250*37da2899SCharles.Forsyth destroy(*f->ret);
251*37da2899SCharles.Forsyth *f->ret = H;
252*37da2899SCharles.Forsyth pelist = elistelement(f->env, f->elem, f->kind);
253*37da2899SCharles.Forsyth *f->ret = (Prefab_Element*)pelist;
254*37da2899SCharles.Forsyth if(locked)
255*37da2899SCharles.Forsyth unlockdisplay(disp);
256*37da2899SCharles.Forsyth }
257*37da2899SCharles.Forsyth
258*37da2899SCharles.Forsyth void
Element_append(void * fp)259*37da2899SCharles.Forsyth Element_append(void *fp)
260*37da2899SCharles.Forsyth {
261*37da2899SCharles.Forsyth F_Element_append *f;
262*37da2899SCharles.Forsyth
263*37da2899SCharles.Forsyth f = fp;
264*37da2899SCharles.Forsyth *f->ret = 0;
265*37da2899SCharles.Forsyth if(f->elist==H || f->elem==H)
266*37da2899SCharles.Forsyth return;
267*37da2899SCharles.Forsyth
268*37da2899SCharles.Forsyth badenviron(f->elist->environ, 1);
269*37da2899SCharles.Forsyth checkelement(f->elist);
270*37da2899SCharles.Forsyth checkelement(f->elem);
271*37da2899SCharles.Forsyth
272*37da2899SCharles.Forsyth if(f->elist->kind!=EHorizontal && f->elist->kind!=EVertical)
273*37da2899SCharles.Forsyth return;
274*37da2899SCharles.Forsyth
275*37da2899SCharles.Forsyth if(appendelist(f->elist, f->elem) != H)
276*37da2899SCharles.Forsyth *f->ret = 1;
277*37da2899SCharles.Forsyth }
278*37da2899SCharles.Forsyth
279*37da2899SCharles.Forsyth void
Element_adjust(void * fp)280*37da2899SCharles.Forsyth Element_adjust(void *fp)
281*37da2899SCharles.Forsyth {
282*37da2899SCharles.Forsyth F_Element_adjust *f;
283*37da2899SCharles.Forsyth Display *disp;
284*37da2899SCharles.Forsyth int locked;
285*37da2899SCharles.Forsyth
286*37da2899SCharles.Forsyth f = fp;
287*37da2899SCharles.Forsyth checkelement(f->elem);
288*37da2899SCharles.Forsyth badenviron(f->elem->environ, 1);
289*37da2899SCharles.Forsyth disp = checkscreen(f->elem->environ->screen)->display;
290*37da2899SCharles.Forsyth locked = lockdisplay(disp);
291*37da2899SCharles.Forsyth adjustelement(f->elem, f->equal, f->dir);
292*37da2899SCharles.Forsyth if(locked)
293*37da2899SCharles.Forsyth unlockdisplay(disp);
294*37da2899SCharles.Forsyth }
295*37da2899SCharles.Forsyth
296*37da2899SCharles.Forsyth void
Element_show(void * fp)297*37da2899SCharles.Forsyth Element_show(void *fp)
298*37da2899SCharles.Forsyth {
299*37da2899SCharles.Forsyth F_Element_show *f;
300*37da2899SCharles.Forsyth Display *disp;
301*37da2899SCharles.Forsyth int locked;
302*37da2899SCharles.Forsyth
303*37da2899SCharles.Forsyth f = fp;
304*37da2899SCharles.Forsyth checkelement(f->elem);
305*37da2899SCharles.Forsyth checkelement(f->elist);
306*37da2899SCharles.Forsyth badenviron(f->elem->environ, 1);
307*37da2899SCharles.Forsyth disp = checkscreen(f->elem->environ->screen)->display;
308*37da2899SCharles.Forsyth locked = lockdisplay(disp);
309*37da2899SCharles.Forsyth *f->ret = showelement(f->elist, f->elem);
310*37da2899SCharles.Forsyth if(locked)
311*37da2899SCharles.Forsyth unlockdisplay(disp);
312*37da2899SCharles.Forsyth }
313*37da2899SCharles.Forsyth
314*37da2899SCharles.Forsyth void
Element_clip(void * fp)315*37da2899SCharles.Forsyth Element_clip(void *fp)
316*37da2899SCharles.Forsyth {
317*37da2899SCharles.Forsyth F_Element_clip *f;
318*37da2899SCharles.Forsyth Rectangle r;
319*37da2899SCharles.Forsyth Display *disp;
320*37da2899SCharles.Forsyth int locked;
321*37da2899SCharles.Forsyth
322*37da2899SCharles.Forsyth f = fp;
323*37da2899SCharles.Forsyth checkelement(f->elem);
324*37da2899SCharles.Forsyth badenviron(f->elem->environ, 1);
325*37da2899SCharles.Forsyth R2R(r, f->r);
326*37da2899SCharles.Forsyth disp = checkscreen(f->elem->environ->screen)->display;
327*37da2899SCharles.Forsyth locked = lockdisplay(disp);
328*37da2899SCharles.Forsyth clipelement(f->elem, r);
329*37da2899SCharles.Forsyth if(locked)
330*37da2899SCharles.Forsyth unlockdisplay(disp);
331*37da2899SCharles.Forsyth }
332*37da2899SCharles.Forsyth
333*37da2899SCharles.Forsyth void
Element_translatescroll(void * fp,int trans)334*37da2899SCharles.Forsyth Element_translatescroll(void *fp, int trans)
335*37da2899SCharles.Forsyth {
336*37da2899SCharles.Forsyth F_Element_scroll *f;
337*37da2899SCharles.Forsyth Point d;
338*37da2899SCharles.Forsyth Display *disp;
339*37da2899SCharles.Forsyth int locked, moved;
340*37da2899SCharles.Forsyth
341*37da2899SCharles.Forsyth f = fp;
342*37da2899SCharles.Forsyth checkelement(f->elem);
343*37da2899SCharles.Forsyth badenviron(f->elem->environ, 1);
344*37da2899SCharles.Forsyth P2P(d, f->d);
345*37da2899SCharles.Forsyth disp = checkscreen(f->elem->environ->screen)->display;
346*37da2899SCharles.Forsyth locked = lockdisplay(disp);
347*37da2899SCharles.Forsyth if(trans)
348*37da2899SCharles.Forsyth translateelement(f->elem, d);
349*37da2899SCharles.Forsyth else{
350*37da2899SCharles.Forsyth moved = 0;
351*37da2899SCharles.Forsyth scrollelement(f->elem, d, &moved);
352*37da2899SCharles.Forsyth }
353*37da2899SCharles.Forsyth if(locked)
354*37da2899SCharles.Forsyth unlockdisplay(disp);
355*37da2899SCharles.Forsyth }
356*37da2899SCharles.Forsyth
357*37da2899SCharles.Forsyth void
Element_scroll(void * fp)358*37da2899SCharles.Forsyth Element_scroll(void *fp)
359*37da2899SCharles.Forsyth {
360*37da2899SCharles.Forsyth Element_translatescroll(fp, 0);
361*37da2899SCharles.Forsyth }
362*37da2899SCharles.Forsyth
363*37da2899SCharles.Forsyth void
Element_translate(void * fp)364*37da2899SCharles.Forsyth Element_translate(void *fp)
365*37da2899SCharles.Forsyth {
366*37da2899SCharles.Forsyth Element_translatescroll(fp, 1);
367*37da2899SCharles.Forsyth }
368*37da2899SCharles.Forsyth
369*37da2899SCharles.Forsyth void
Compound_iconbox(void * fp)370*37da2899SCharles.Forsyth Compound_iconbox(void *fp)
371*37da2899SCharles.Forsyth {
372*37da2899SCharles.Forsyth F_Compound_iconbox *f;
373*37da2899SCharles.Forsyth Image *icon;
374*37da2899SCharles.Forsyth int locked;
375*37da2899SCharles.Forsyth PCompound *pc;
376*37da2899SCharles.Forsyth
377*37da2899SCharles.Forsyth f = fp;
378*37da2899SCharles.Forsyth badenviron(f->env, 1);
379*37da2899SCharles.Forsyth checkimage(f->mask);
380*37da2899SCharles.Forsyth icon = checkimage(f->icon);
381*37da2899SCharles.Forsyth locked = lockdisplay(icon->display);
382*37da2899SCharles.Forsyth destroy(*f->ret);
383*37da2899SCharles.Forsyth *f->ret = H;
384*37da2899SCharles.Forsyth pc = iconbox(f->env, f->p, f->title, f->icon, f->mask);
385*37da2899SCharles.Forsyth *f->ret = &pc->c;
386*37da2899SCharles.Forsyth if(locked)
387*37da2899SCharles.Forsyth unlockdisplay(icon->display);
388*37da2899SCharles.Forsyth }
389*37da2899SCharles.Forsyth
390*37da2899SCharles.Forsyth void
Compound_textbox(void * fp)391*37da2899SCharles.Forsyth Compound_textbox(void *fp)
392*37da2899SCharles.Forsyth {
393*37da2899SCharles.Forsyth F_Compound_textbox *f;
394*37da2899SCharles.Forsyth Display *disp;
395*37da2899SCharles.Forsyth int locked;
396*37da2899SCharles.Forsyth PCompound *pc;
397*37da2899SCharles.Forsyth
398*37da2899SCharles.Forsyth f = fp;
399*37da2899SCharles.Forsyth badenviron(f->env, 1);
400*37da2899SCharles.Forsyth disp = checkscreen(f->env->screen)->display;
401*37da2899SCharles.Forsyth locked = lockdisplay(disp);
402*37da2899SCharles.Forsyth destroy(*f->ret);
403*37da2899SCharles.Forsyth *f->ret = H;
404*37da2899SCharles.Forsyth pc = textbox(f->env, f->r, f->title, f->text);
405*37da2899SCharles.Forsyth *f->ret = &pc->c;
406*37da2899SCharles.Forsyth if(locked)
407*37da2899SCharles.Forsyth unlockdisplay(disp);
408*37da2899SCharles.Forsyth }
409*37da2899SCharles.Forsyth
410*37da2899SCharles.Forsyth void
Compound_layoutbox(void * fp)411*37da2899SCharles.Forsyth Compound_layoutbox(void *fp)
412*37da2899SCharles.Forsyth {
413*37da2899SCharles.Forsyth F_Compound_layoutbox *f;
414*37da2899SCharles.Forsyth Display *disp;
415*37da2899SCharles.Forsyth int locked;
416*37da2899SCharles.Forsyth PCompound *pc;
417*37da2899SCharles.Forsyth
418*37da2899SCharles.Forsyth f = fp;
419*37da2899SCharles.Forsyth badenviron(f->env, 1);
420*37da2899SCharles.Forsyth disp = checkscreen(f->env->screen)->display;
421*37da2899SCharles.Forsyth locked = lockdisplay(disp);
422*37da2899SCharles.Forsyth destroy(*f->ret);
423*37da2899SCharles.Forsyth *f->ret = H;
424*37da2899SCharles.Forsyth pc = layoutbox(f->env, f->r, f->title, f->lay);
425*37da2899SCharles.Forsyth *f->ret = &pc->c;
426*37da2899SCharles.Forsyth if(locked)
427*37da2899SCharles.Forsyth unlockdisplay(disp);
428*37da2899SCharles.Forsyth }
429*37da2899SCharles.Forsyth
430*37da2899SCharles.Forsyth void
Compound_box(void * fp)431*37da2899SCharles.Forsyth Compound_box(void *fp)
432*37da2899SCharles.Forsyth {
433*37da2899SCharles.Forsyth F_Compound_box *f;
434*37da2899SCharles.Forsyth Display *disp;
435*37da2899SCharles.Forsyth int locked;
436*37da2899SCharles.Forsyth PCompound *pc;
437*37da2899SCharles.Forsyth
438*37da2899SCharles.Forsyth f = fp;
439*37da2899SCharles.Forsyth badenviron(f->env, 1);
440*37da2899SCharles.Forsyth if(f->title != H)
441*37da2899SCharles.Forsyth checkelement(f->title);
442*37da2899SCharles.Forsyth checkelement(f->elist);
443*37da2899SCharles.Forsyth disp = checkscreen(f->env->screen)->display;
444*37da2899SCharles.Forsyth locked = lockdisplay(disp);
445*37da2899SCharles.Forsyth destroy(*f->ret);
446*37da2899SCharles.Forsyth *f->ret = H;
447*37da2899SCharles.Forsyth pc = box(f->env, f->p, f->title, f->elist);
448*37da2899SCharles.Forsyth *f->ret = &pc->c;
449*37da2899SCharles.Forsyth if(locked)
450*37da2899SCharles.Forsyth unlockdisplay(disp);
451*37da2899SCharles.Forsyth }
452*37da2899SCharles.Forsyth
453*37da2899SCharles.Forsyth void
Compound_draw(void * fp)454*37da2899SCharles.Forsyth Compound_draw(void *fp)
455*37da2899SCharles.Forsyth {
456*37da2899SCharles.Forsyth F_Compound_draw *f;
457*37da2899SCharles.Forsyth PCompound *pc;
458*37da2899SCharles.Forsyth int locked;
459*37da2899SCharles.Forsyth
460*37da2899SCharles.Forsyth f = fp;
461*37da2899SCharles.Forsyth if(f->comp == H)
462*37da2899SCharles.Forsyth return;
463*37da2899SCharles.Forsyth pc = checkcompound(f->comp);
464*37da2899SCharles.Forsyth badenviron(pc->c.environ, 1);
465*37da2899SCharles.Forsyth locked = lockdisplay(pc->display);
466*37da2899SCharles.Forsyth drawcompound(&pc->c);
467*37da2899SCharles.Forsyth flushimage(pc->display, 1);
468*37da2899SCharles.Forsyth if(locked)
469*37da2899SCharles.Forsyth unlockdisplay(pc->display);
470*37da2899SCharles.Forsyth }
471*37da2899SCharles.Forsyth
472*37da2899SCharles.Forsyth void
Compound_redraw(void * fp)473*37da2899SCharles.Forsyth Compound_redraw(void *fp)
474*37da2899SCharles.Forsyth {
475*37da2899SCharles.Forsyth F_Compound_redraw *f;
476*37da2899SCharles.Forsyth PCompound *pc;
477*37da2899SCharles.Forsyth Image *i;
478*37da2899SCharles.Forsyth int locked;
479*37da2899SCharles.Forsyth
480*37da2899SCharles.Forsyth f = fp;
481*37da2899SCharles.Forsyth if(f->comp == H)
482*37da2899SCharles.Forsyth return;
483*37da2899SCharles.Forsyth pc = checkcompound(f->comp);
484*37da2899SCharles.Forsyth badenviron(pc->c.environ, 1);
485*37da2899SCharles.Forsyth i = checkimage(pc->c.image);
486*37da2899SCharles.Forsyth locked = lockdisplay(pc->display);
487*37da2899SCharles.Forsyth redrawcompound(i, IRECT(f->r), &pc->c);
488*37da2899SCharles.Forsyth flushimage(pc->display, 1);
489*37da2899SCharles.Forsyth if(locked)
490*37da2899SCharles.Forsyth unlockdisplay(pc->display);
491*37da2899SCharles.Forsyth }
492*37da2899SCharles.Forsyth
493*37da2899SCharles.Forsyth static
494*37da2899SCharles.Forsyth PElement*
pelement(Prefab_Compound * comp,Prefab_Element * elem)495*37da2899SCharles.Forsyth pelement(Prefab_Compound *comp, Prefab_Element *elem)
496*37da2899SCharles.Forsyth {
497*37da2899SCharles.Forsyth PElement *pe;
498*37da2899SCharles.Forsyth
499*37da2899SCharles.Forsyth if(comp == H)
500*37da2899SCharles.Forsyth return H;
501*37da2899SCharles.Forsyth checkcompound(comp);
502*37da2899SCharles.Forsyth badenviron(comp->environ, 1);
503*37da2899SCharles.Forsyth pe = lookupelement(elem);
504*37da2899SCharles.Forsyth return pe;
505*37da2899SCharles.Forsyth }
506*37da2899SCharles.Forsyth
507*37da2899SCharles.Forsyth void
Compound_highlight(void * fp)508*37da2899SCharles.Forsyth Compound_highlight(void *fp)
509*37da2899SCharles.Forsyth {
510*37da2899SCharles.Forsyth F_Compound_highlight *f;
511*37da2899SCharles.Forsyth PCompound *pc;
512*37da2899SCharles.Forsyth PElement *pe;
513*37da2899SCharles.Forsyth Image *i;
514*37da2899SCharles.Forsyth int locked;
515*37da2899SCharles.Forsyth
516*37da2899SCharles.Forsyth f = fp;
517*37da2899SCharles.Forsyth pe = pelement(f->comp, f->elem);
518*37da2899SCharles.Forsyth if(pe == H)
519*37da2899SCharles.Forsyth return;
520*37da2899SCharles.Forsyth pc = (PCompound*)f->comp;
521*37da2899SCharles.Forsyth i = checkimage(pc->c.image);
522*37da2899SCharles.Forsyth locked = lockdisplay(pc->display);
523*37da2899SCharles.Forsyth highlightelement(&pe->e, i, &pc->c, f->on);
524*37da2899SCharles.Forsyth flushimage(pc->display, 1);
525*37da2899SCharles.Forsyth if(locked)
526*37da2899SCharles.Forsyth unlockdisplay(pc->display);
527*37da2899SCharles.Forsyth }
528*37da2899SCharles.Forsyth
529*37da2899SCharles.Forsyth void
Compound_scroll(void * fp)530*37da2899SCharles.Forsyth Compound_scroll(void *fp)
531*37da2899SCharles.Forsyth {
532*37da2899SCharles.Forsyth F_Compound_scroll *f;
533*37da2899SCharles.Forsyth PCompound *pc;
534*37da2899SCharles.Forsyth PElement *pe;
535*37da2899SCharles.Forsyth int locked;
536*37da2899SCharles.Forsyth Image *i;
537*37da2899SCharles.Forsyth int moved;
538*37da2899SCharles.Forsyth
539*37da2899SCharles.Forsyth f = fp;
540*37da2899SCharles.Forsyth pe = pelement(f->comp, f->elem);
541*37da2899SCharles.Forsyth if(pe == H)
542*37da2899SCharles.Forsyth return;
543*37da2899SCharles.Forsyth pc = (PCompound*)f->comp;
544*37da2899SCharles.Forsyth i = checkimage(pc->c.image);
545*37da2899SCharles.Forsyth locked = lockdisplay(pc->display);
546*37da2899SCharles.Forsyth moved = 0;
547*37da2899SCharles.Forsyth scrollelement(&pe->e, IPOINT(f->d), &moved);
548*37da2899SCharles.Forsyth if(moved){
549*37da2899SCharles.Forsyth drawelement(&pe->e, i, IRECT(pe->e.r), 0, 0);
550*37da2899SCharles.Forsyth flushimage(pc->display, 1);
551*37da2899SCharles.Forsyth }
552*37da2899SCharles.Forsyth if(locked)
553*37da2899SCharles.Forsyth unlockdisplay(pc->display);
554*37da2899SCharles.Forsyth }
555*37da2899SCharles.Forsyth
556*37da2899SCharles.Forsyth void
Compound_show(void * fp)557*37da2899SCharles.Forsyth Compound_show(void *fp)
558*37da2899SCharles.Forsyth {
559*37da2899SCharles.Forsyth F_Compound_show *f;
560*37da2899SCharles.Forsyth PCompound *pc;
561*37da2899SCharles.Forsyth PElement *pe;
562*37da2899SCharles.Forsyth int locked;
563*37da2899SCharles.Forsyth
564*37da2899SCharles.Forsyth f = fp;
565*37da2899SCharles.Forsyth pe = pelement(f->comp, f->elem);
566*37da2899SCharles.Forsyth if(pe == H)
567*37da2899SCharles.Forsyth return;
568*37da2899SCharles.Forsyth pc = (PCompound*)f->comp;
569*37da2899SCharles.Forsyth locked = lockdisplay(pc->display);
570*37da2899SCharles.Forsyth *f->ret = showelement(pc->c.contents, &pe->e);
571*37da2899SCharles.Forsyth flushimage(pc->display, 1);
572*37da2899SCharles.Forsyth if(locked)
573*37da2899SCharles.Forsyth unlockdisplay(pc->display);
574*37da2899SCharles.Forsyth }
575*37da2899SCharles.Forsyth
576*37da2899SCharles.Forsyth static
577*37da2899SCharles.Forsyth PElement*
element(PElement * plist,int index,int * ip)578*37da2899SCharles.Forsyth element(PElement *plist, int index, int *ip)
579*37da2899SCharles.Forsyth {
580*37da2899SCharles.Forsyth int i;
581*37da2899SCharles.Forsyth PElement *pe;
582*37da2899SCharles.Forsyth List *l;
583*37da2899SCharles.Forsyth
584*37da2899SCharles.Forsyth i = 0;
585*37da2899SCharles.Forsyth pe = H;
586*37da2899SCharles.Forsyth for(l=plist->first; l!=H; l=l->tail){
587*37da2899SCharles.Forsyth pe = *(PElement**)l->data;
588*37da2899SCharles.Forsyth if(pe->pkind == ESeparator)
589*37da2899SCharles.Forsyth continue;
590*37da2899SCharles.Forsyth if(i == index)
591*37da2899SCharles.Forsyth break;
592*37da2899SCharles.Forsyth i++;
593*37da2899SCharles.Forsyth }
594*37da2899SCharles.Forsyth if(ip)
595*37da2899SCharles.Forsyth *ip = i;
596*37da2899SCharles.Forsyth if(l == H)
597*37da2899SCharles.Forsyth return H;
598*37da2899SCharles.Forsyth return pe;
599*37da2899SCharles.Forsyth }
600*37da2899SCharles.Forsyth
601*37da2899SCharles.Forsyth static
602*37da2899SCharles.Forsyth int
wrapelement(PElement * plist,int index,int ntag)603*37da2899SCharles.Forsyth wrapelement(PElement *plist, int index, int ntag)
604*37da2899SCharles.Forsyth {
605*37da2899SCharles.Forsyth int i, wrap;
606*37da2899SCharles.Forsyth
607*37da2899SCharles.Forsyth if(ntag > 0){
608*37da2899SCharles.Forsyth if(index < 0)
609*37da2899SCharles.Forsyth return ntag-1;
610*37da2899SCharles.Forsyth if(index >= ntag)
611*37da2899SCharles.Forsyth return 0;
612*37da2899SCharles.Forsyth return index;
613*37da2899SCharles.Forsyth }
614*37da2899SCharles.Forsyth wrap = 1;
615*37da2899SCharles.Forsyth if(index < 0){
616*37da2899SCharles.Forsyth index = 1000000; /* will seek to end */
617*37da2899SCharles.Forsyth wrap = 0;
618*37da2899SCharles.Forsyth }
619*37da2899SCharles.Forsyth if(element(plist, index, &i)==H && index!=0){
620*37da2899SCharles.Forsyth if(wrap) /* went off end; wrap to beginning */
621*37da2899SCharles.Forsyth return wrapelement(plist, 0, 0);
622*37da2899SCharles.Forsyth if(i > 0)
623*37da2899SCharles.Forsyth --i;
624*37da2899SCharles.Forsyth }
625*37da2899SCharles.Forsyth return i;
626*37da2899SCharles.Forsyth }
627*37da2899SCharles.Forsyth
628*37da2899SCharles.Forsyth void
dohighlight(PCompound * pc,PElement * list,PElement * pe,int on)629*37da2899SCharles.Forsyth dohighlight(PCompound *pc, PElement *list, PElement *pe, int on)
630*37da2899SCharles.Forsyth {
631*37da2899SCharles.Forsyth Image *i;
632*37da2899SCharles.Forsyth
633*37da2899SCharles.Forsyth /* see if we need to scroll */
634*37da2899SCharles.Forsyth i = lookupimage(pc->c.image);
635*37da2899SCharles.Forsyth if(i == nil)
636*37da2899SCharles.Forsyth return;
637*37da2899SCharles.Forsyth if(on && showelement(&list->e, &pe->e))
638*37da2899SCharles.Forsyth redrawcompound(i, IRECT(pc->c.contents->r), &pc->c);
639*37da2899SCharles.Forsyth highlightelement(&pe->e, i, &pc->c, on);
640*37da2899SCharles.Forsyth }
641*37da2899SCharles.Forsyth
642*37da2899SCharles.Forsyth void
highlight(PCompound * pc,PElement * list,int index,int on)643*37da2899SCharles.Forsyth highlight(PCompound *pc, PElement *list, int index, int on)
644*37da2899SCharles.Forsyth {
645*37da2899SCharles.Forsyth dohighlight(pc, list, element(list, index, nil), on);
646*37da2899SCharles.Forsyth }
647*37da2899SCharles.Forsyth
648*37da2899SCharles.Forsyth static
649*37da2899SCharles.Forsyth PElement**
tags(PElement * pelem,int * ntag)650*37da2899SCharles.Forsyth tags(PElement *pelem, int *ntag)
651*37da2899SCharles.Forsyth {
652*37da2899SCharles.Forsyth int n, nalloc, nn;
653*37da2899SCharles.Forsyth List *l;
654*37da2899SCharles.Forsyth PElement *pe, **tagged, **ntagged;
655*37da2899SCharles.Forsyth
656*37da2899SCharles.Forsyth n = 0;
657*37da2899SCharles.Forsyth nalloc = 0;
658*37da2899SCharles.Forsyth tagged = nil;
659*37da2899SCharles.Forsyth *ntag = 0;
660*37da2899SCharles.Forsyth for(l=pelem->first; l!=H; l=l->tail){
661*37da2899SCharles.Forsyth pe = *(PElement**)l->data;
662*37da2899SCharles.Forsyth if(pe->e.tag != H){
663*37da2899SCharles.Forsyth if(nalloc == n){
664*37da2899SCharles.Forsyth nalloc += 10;
665*37da2899SCharles.Forsyth tagged = realloc(tagged, nalloc*sizeof(PElement*));
666*37da2899SCharles.Forsyth if(tagged == nil)
667*37da2899SCharles.Forsyth return nil;
668*37da2899SCharles.Forsyth }
669*37da2899SCharles.Forsyth tagged[n++] = pe;
670*37da2899SCharles.Forsyth }else if(pe->pkind==EHorizontal || pe->pkind==EVertical){
671*37da2899SCharles.Forsyth ntagged = tags(pe, &nn);
672*37da2899SCharles.Forsyth if(nn > 0){
673*37da2899SCharles.Forsyth if(nalloc < n+nn){
674*37da2899SCharles.Forsyth nalloc = n+nn+10;
675*37da2899SCharles.Forsyth tagged = realloc(tagged, nalloc*sizeof(PElement*));
676*37da2899SCharles.Forsyth if(tagged == nil){
677*37da2899SCharles.Forsyth free(ntagged);
678*37da2899SCharles.Forsyth return nil;
679*37da2899SCharles.Forsyth }
680*37da2899SCharles.Forsyth }
681*37da2899SCharles.Forsyth memmove(tagged+n, ntagged, nn*sizeof(PElement*));
682*37da2899SCharles.Forsyth free(ntagged);
683*37da2899SCharles.Forsyth n += nn;
684*37da2899SCharles.Forsyth }
685*37da2899SCharles.Forsyth }
686*37da2899SCharles.Forsyth }
687*37da2899SCharles.Forsyth *ntag = n;
688*37da2899SCharles.Forsyth return tagged;
689*37da2899SCharles.Forsyth }
690*37da2899SCharles.Forsyth
691*37da2899SCharles.Forsyth void
doselect(void * fp,int dotags)692*37da2899SCharles.Forsyth doselect(void *fp, int dotags)
693*37da2899SCharles.Forsyth {
694*37da2899SCharles.Forsyth F_Compound_select *f;
695*37da2899SCharles.Forsyth PCompound *pc;
696*37da2899SCharles.Forsyth PElement *pe;
697*37da2899SCharles.Forsyth WORD *val;
698*37da2899SCharles.Forsyth List *l;
699*37da2899SCharles.Forsyth Prefab_Element *t;
700*37da2899SCharles.Forsyth int i, lasti, ntag;
701*37da2899SCharles.Forsyth PElement **tagged;
702*37da2899SCharles.Forsyth int locked;
703*37da2899SCharles.Forsyth
704*37da2899SCharles.Forsyth f = fp;
705*37da2899SCharles.Forsyth pc = checkcompound(f->comp);
706*37da2899SCharles.Forsyth pe = lookupelement(f->elem);
707*37da2899SCharles.Forsyth if(pe->pkind!=EHorizontal && pe->pkind!=EVertical || pe->nkids == 0){
708*37da2899SCharles.Forsyth Bad:
709*37da2899SCharles.Forsyth destroy(f->ret->t2);
710*37da2899SCharles.Forsyth f->ret->t0 = 9999;
711*37da2899SCharles.Forsyth f->ret->t1 = 0;
712*37da2899SCharles.Forsyth f->ret->t2 = H;
713*37da2899SCharles.Forsyth return;
714*37da2899SCharles.Forsyth }
715*37da2899SCharles.Forsyth ntag = 0;
716*37da2899SCharles.Forsyth tagged = 0;
717*37da2899SCharles.Forsyth /* check at least one selectable item */
718*37da2899SCharles.Forsyth if(dotags){
719*37da2899SCharles.Forsyth tagged = tags(pe, &ntag);
720*37da2899SCharles.Forsyth if(ntag > 0)
721*37da2899SCharles.Forsyth goto OK;
722*37da2899SCharles.Forsyth }else
723*37da2899SCharles.Forsyth for(l=pe->first; l!=H; l=l->tail){
724*37da2899SCharles.Forsyth t = *(Prefab_Element**)l->data;
725*37da2899SCharles.Forsyth if(t->kind != ESeparator)
726*37da2899SCharles.Forsyth goto OK;
727*37da2899SCharles.Forsyth }
728*37da2899SCharles.Forsyth goto Bad;
729*37da2899SCharles.Forsyth
730*37da2899SCharles.Forsyth OK:
731*37da2899SCharles.Forsyth i = f->i;
732*37da2899SCharles.Forsyth i = wrapelement(pe, i, ntag);
733*37da2899SCharles.Forsyth lasti = i;
734*37da2899SCharles.Forsyth locked = lockdisplay(pc->display);
735*37da2899SCharles.Forsyth if(dotags)
736*37da2899SCharles.Forsyth dohighlight(pc, pe, tagged[i], 1);
737*37da2899SCharles.Forsyth else
738*37da2899SCharles.Forsyth highlight(pc, pe, i, 1);
739*37da2899SCharles.Forsyth /* val must be in shared memory, but stacks not shared */
740*37da2899SCharles.Forsyth val = malloc(sizeof(WORD));
741*37da2899SCharles.Forsyth if(val == nil)
742*37da2899SCharles.Forsyth goto Bad;
743*37da2899SCharles.Forsyth for(;;){
744*37da2899SCharles.Forsyth if(lasti != i){
745*37da2899SCharles.Forsyth if(dotags){
746*37da2899SCharles.Forsyth dohighlight(pc, pe, tagged[lasti], 0);
747*37da2899SCharles.Forsyth dohighlight(pc, pe, tagged[i], 1);
748*37da2899SCharles.Forsyth }else{
749*37da2899SCharles.Forsyth highlight(pc, pe, lasti, 0);
750*37da2899SCharles.Forsyth highlight(pc, pe, i, 1);
751*37da2899SCharles.Forsyth }
752*37da2899SCharles.Forsyth lasti = i;
753*37da2899SCharles.Forsyth }
754*37da2899SCharles.Forsyth flushimage(pc->display, 1);
755*37da2899SCharles.Forsyth if(locked)
756*37da2899SCharles.Forsyth unlockdisplay(pc->display);
757*37da2899SCharles.Forsyth crecv(f->c, val);
758*37da2899SCharles.Forsyth locked = lockdisplay(pc->display);
759*37da2899SCharles.Forsyth switch(*val){
760*37da2899SCharles.Forsyth case IRUp:
761*37da2899SCharles.Forsyth if(pe->pkind != EVertical)
762*37da2899SCharles.Forsyth goto Default;
763*37da2899SCharles.Forsyth goto Up;
764*37da2899SCharles.Forsyth case IRRew:
765*37da2899SCharles.Forsyth if(pe->pkind != EHorizontal)
766*37da2899SCharles.Forsyth goto Default;
767*37da2899SCharles.Forsyth Up:
768*37da2899SCharles.Forsyth i = wrapelement(pe, i-1, ntag);
769*37da2899SCharles.Forsyth break;
770*37da2899SCharles.Forsyth case IRSelect:
771*37da2899SCharles.Forsyth if(dotags)
772*37da2899SCharles.Forsyth dohighlight(pc, pe, tagged[i], 0);
773*37da2899SCharles.Forsyth else
774*37da2899SCharles.Forsyth highlight(pc, pe, i, 0);
775*37da2899SCharles.Forsyth f->ret->t0 = *val;
776*37da2899SCharles.Forsyth f->ret->t1 = i;
777*37da2899SCharles.Forsyth Return:
778*37da2899SCharles.Forsyth flushimage(pc->display, 1);
779*37da2899SCharles.Forsyth if(dotags)
780*37da2899SCharles.Forsyth pe = tagged[i];
781*37da2899SCharles.Forsyth else
782*37da2899SCharles.Forsyth pe = element(pe, i, nil);
783*37da2899SCharles.Forsyth destroy(f->ret->t2);
784*37da2899SCharles.Forsyth D2H(pe)->ref++;
785*37da2899SCharles.Forsyth f->ret->t2 = &pe->e;
786*37da2899SCharles.Forsyth if(locked)
787*37da2899SCharles.Forsyth unlockdisplay(pc->display);
788*37da2899SCharles.Forsyth free(val);
789*37da2899SCharles.Forsyth free(tagged);
790*37da2899SCharles.Forsyth return;
791*37da2899SCharles.Forsyth case IRDn:
792*37da2899SCharles.Forsyth if(pe->pkind != EVertical)
793*37da2899SCharles.Forsyth goto Default;
794*37da2899SCharles.Forsyth goto Down;
795*37da2899SCharles.Forsyth case IRFF:
796*37da2899SCharles.Forsyth if(pe->pkind != EHorizontal)
797*37da2899SCharles.Forsyth goto Default;
798*37da2899SCharles.Forsyth Down:
799*37da2899SCharles.Forsyth i = wrapelement(pe, i+1, ntag);
800*37da2899SCharles.Forsyth break;
801*37da2899SCharles.Forsyth default:
802*37da2899SCharles.Forsyth Default:
803*37da2899SCharles.Forsyth if(dotags)
804*37da2899SCharles.Forsyth dohighlight(pc, pe, tagged[lasti], 0);
805*37da2899SCharles.Forsyth else
806*37da2899SCharles.Forsyth highlight(pc, pe, lasti, 0);
807*37da2899SCharles.Forsyth f->ret->t0 = *val;
808*37da2899SCharles.Forsyth f->ret->t1 = i;
809*37da2899SCharles.Forsyth goto Return;
810*37da2899SCharles.Forsyth }
811*37da2899SCharles.Forsyth }
812*37da2899SCharles.Forsyth }
813*37da2899SCharles.Forsyth
814*37da2899SCharles.Forsyth void
Compound_tagselect(void * fp)815*37da2899SCharles.Forsyth Compound_tagselect(void *fp)
816*37da2899SCharles.Forsyth {
817*37da2899SCharles.Forsyth doselect(fp, 1);
818*37da2899SCharles.Forsyth }
819*37da2899SCharles.Forsyth
820*37da2899SCharles.Forsyth void
Compound_select(void * fp)821*37da2899SCharles.Forsyth Compound_select(void *fp)
822*37da2899SCharles.Forsyth {
823*37da2899SCharles.Forsyth doselect(fp, 0);
824*37da2899SCharles.Forsyth }
825