#include <lib9.h>#include <kernel.h>#include "interp.h"#include "isa.h"#include "runt.h"#include "prefabmod.h"#include "draw.h"#include "drawif.h"#include "prefab.h"#include "raise.h" uchar elementmap[] = Prefab_Element_map;uchar compoundmap[] = Prefab_Compound_map;uchar layoutmap[] = Prefab_Layout_map; void freeprefabcompound(Heap*, int); Type* TCompound;Type* TElement;Type* TLayout; /* Infrared remote buttons known to Compound_select */enum{ IRFF = 14, IRRew = 15, IRUp = 16, IRDn = 17, IRSelect = 18, IREnter = 20,}; voidprefabmodinit(void){ TElement = dtype(freeheap, sizeof(PElement), elementmap, sizeof(elementmap)); TLayout = dtype(freeheap, Prefab_Layout_size, layoutmap, sizeof(layoutmap)); TCompound = dtype(freeprefabcompound, sizeof(PCompound), compoundmap, sizeof(compoundmap)); builtinmod("$Prefab", Prefabmodtab, Prefabmodlen);} PElement*checkelement(Prefab_Element *de){ PElement *pe; pe = lookupelement(de); if(pe == H) error(exType); return pe;} PCompound*checkcompound(Prefab_Compound *de){ PCompound *pe; pe = lookupcompound(de); if(pe == H) error(exType); return pe;} PElement*lookupelement(Prefab_Element *de){ PElement *pe; if(de == H) return H; if(D2H(de)->t != TElement) return H; pe = (PElement*)de; if(de->kind!=pe->pkind || de->kids!=pe->first) return H; return pe;} PCompound*lookupcompound(Prefab_Compound *dc){ if(dc == H) return H; if(D2H(dc)->t != TCompound) return H; return (PCompound*)dc;} voidfreeprefabcompound(Heap *h, int swept){ Image *i; Prefab_Compound *d; PCompound *pc; d = H2D(Prefab_Compound*, h); pc = lookupcompound(d); /* disconnect compound from image refresh daemon */ i = lookupimage(pc->c.image); if(i != nil) delrefresh(i); if(!swept && TCompound->np) freeptrs(d, TCompound); /* header will be freed by caller */} staticPElement*findtag(PElement *pelem, char *tag){ PElement *pe, *t; List *l; if(pelem==H || tag[0]==0) return pelem; for(l=pelem->first; l!=H; l=l->tail){ pe = *(PElement**)l->data; if(strcmp(tag, string2c(pe->e.tag)) == 0) return pe; else if(pe->pkind==EHorizontal || pe->pkind==EVertical){ t = findtag(pe, tag); if(t != H) return t; } } return H;} intbadenviron(Prefab_Environ *env, int err){ Prefab_Style *s; if(env == H) goto bad; s = env->style; if(s == H) goto bad; if(s->titlefont==H || s->textfont==H) goto bad; if(s->elemcolor==H || s->edgecolor==H) goto bad; if(s->titlecolor==H || s->textcolor==H || s->highlightcolor==H) goto bad; return 0;bad: if(err) error(exType); return 1;} voidElement_iconseparator(void *fp, int kind){ F_Element_icon *f; PElement *e; Image *icon; int locked; f = fp; badenviron(f->env, 1); checkimage(f->mask); icon = checkimage(f->icon); locked = lockdisplay(icon->display); destroy(*f->ret); *f->ret = H; if(kind == ESeparator) e = separatorelement(f->env, f->r, f->icon, f->mask); else e = iconelement(f->env, f->r, f->icon, f->mask); *f->ret = (Prefab_Element*)e; if(locked) unlockdisplay(icon->display);} voidElement_icon(void *fp){ Element_iconseparator(fp, EIcon);} voidElement_separator(void *fp){ Element_iconseparator(fp, ESeparator);} voidElement_text(void *fp){ F_Element_text *f; PElement *pelem; Display *disp; int locked; f = fp; badenviron(f->env, 1); if(f->kind!=EText && f->kind!=ETitle) return; disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pelem = textelement(f->env, f->text, f->r, f->kind); *f->ret = (Prefab_Element*)pelem; if(locked) unlockdisplay(disp);} voidElement_layout(void *fp){ F_Element_layout *f; PElement *pelem; Display *disp; int locked; f = fp; badenviron(f->env, 1); if(f->kind!=EText && f->kind!=ETitle) return; disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pelem = layoutelement(f->env, f->lay, f->r, f->kind); *f->ret = (Prefab_Element*)pelem; if(locked) unlockdisplay(disp);} voidElement_elist(void *fp){ F_Element_elist *f; PElement *pelist; Display *disp; int locked; f = fp; if(f->elem != H) checkelement(f->elem); badenviron(f->env, 1); if(f->kind!=EHorizontal && f->kind!=EVertical) return; disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pelist = elistelement(f->env, f->elem, f->kind); *f->ret = (Prefab_Element*)pelist; if(locked) unlockdisplay(disp);} voidElement_append(void *fp){ F_Element_append *f; f = fp; *f->ret = 0; if(f->elist==H || f->elem==H) return; badenviron(f->elist->environ, 1); checkelement(f->elist); checkelement(f->elem); if(f->elist->kind!=EHorizontal && f->elist->kind!=EVertical) return; if(appendelist(f->elist, f->elem) != H) *f->ret = 1;} voidElement_adjust(void *fp){ F_Element_adjust *f; Display *disp; int locked; f = fp; checkelement(f->elem); badenviron(f->elem->environ, 1); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); adjustelement(f->elem, f->equal, f->dir); if(locked) unlockdisplay(disp);} voidElement_show(void *fp){ F_Element_show *f; Display *disp; int locked; f = fp; checkelement(f->elem); checkelement(f->elist); badenviron(f->elem->environ, 1); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); *f->ret = showelement(f->elist, f->elem); if(locked) unlockdisplay(disp);} voidElement_clip(void *fp){ F_Element_clip *f; Rectangle r; Display *disp; int locked; f = fp; checkelement(f->elem); badenviron(f->elem->environ, 1); R2R(r, f->r); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); clipelement(f->elem, r); if(locked) unlockdisplay(disp);} voidElement_translatescroll(void *fp, int trans){ F_Element_scroll *f; Point d; Display *disp; int locked, moved; f = fp; checkelement(f->elem); badenviron(f->elem->environ, 1); P2P(d, f->d); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); if(trans) translateelement(f->elem, d); else{ moved = 0; scrollelement(f->elem, d, &moved); } if(locked) unlockdisplay(disp);} voidElement_scroll(void *fp){ Element_translatescroll(fp, 0);} voidElement_translate(void *fp){ Element_translatescroll(fp, 1);} voidCompound_iconbox(void *fp){ F_Compound_iconbox *f; Image *icon; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); checkimage(f->mask); icon = checkimage(f->icon); locked = lockdisplay(icon->display); destroy(*f->ret); *f->ret = H; pc = iconbox(f->env, f->p, f->title, f->icon, f->mask); *f->ret = &pc->c; if(locked) unlockdisplay(icon->display);} voidCompound_textbox(void *fp){ F_Compound_textbox *f; Display *disp; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pc = textbox(f->env, f->r, f->title, f->text); *f->ret = &pc->c; if(locked) unlockdisplay(disp);} voidCompound_layoutbox(void *fp){ F_Compound_layoutbox *f; Display *disp; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pc = layoutbox(f->env, f->r, f->title, f->lay); *f->ret = &pc->c; if(locked) unlockdisplay(disp);} voidCompound_box(void *fp){ F_Compound_box *f; Display *disp; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); if(f->title != H) checkelement(f->title); checkelement(f->elist); disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pc = box(f->env, f->p, f->title, f->elist); *f->ret = &pc->c; if(locked) unlockdisplay(disp);} voidCompound_draw(void *fp){ F_Compound_draw *f; PCompound *pc; int locked; f = fp; if(f->comp == H) return; pc = checkcompound(f->comp); badenviron(pc->c.environ, 1); locked = lockdisplay(pc->display); drawcompound(&pc->c); flushimage(pc->display, 1); if(locked) unlockdisplay(pc->display);} voidCompound_redraw(void *fp){ F_Compound_redraw *f; PCompound *pc; Image *i; int locked; f = fp; if(f->comp == H) return; pc = checkcompound(f->comp); badenviron(pc->c.environ, 1); i = checkimage(pc->c.image); locked = lockdisplay(pc->display); redrawcompound(i, IRECT(f->r), &pc->c); flushimage(pc->display, 1); if(locked) unlockdisplay(pc->display);} staticPElement*pelement(Prefab_Compound *comp, Prefab_Element *elem){ PElement *pe; if(comp == H) return H;Lines 1–500 of 824. Load more
#include <lib9.h> #include <kernel.h> #include "interp.h" #include "isa.h" #include "runt.h" #include "prefabmod.h" #include "draw.h" #include "drawif.h" #include "prefab.h" #include "raise.h" uchar elementmap[] = Prefab_Element_map; uchar compoundmap[] = Prefab_Compound_map; uchar layoutmap[] = Prefab_Layout_map; void freeprefabcompound(Heap*, int); Type* TCompound; Type* TElement; Type* TLayout; /* Infrared remote buttons known to Compound_select */ enum { IRFF = 14, IRRew = 15, IRUp = 16, IRDn = 17, IRSelect = 18, IREnter = 20, }; void prefabmodinit(void) { TElement = dtype(freeheap, sizeof(PElement), elementmap, sizeof(elementmap)); TLayout = dtype(freeheap, Prefab_Layout_size, layoutmap, sizeof(layoutmap)); TCompound = dtype(freeprefabcompound, sizeof(PCompound), compoundmap, sizeof(compoundmap)); builtinmod("$Prefab", Prefabmodtab, Prefabmodlen); } PElement* checkelement(Prefab_Element *de) { PElement *pe; pe = lookupelement(de); if(pe == H) error(exType); return pe; } PCompound* checkcompound(Prefab_Compound *de) { PCompound *pe; pe = lookupcompound(de); if(pe == H) error(exType); return pe; } PElement* lookupelement(Prefab_Element *de) { PElement *pe; if(de == H) return H; if(D2H(de)->t != TElement) return H; pe = (PElement*)de; if(de->kind!=pe->pkind || de->kids!=pe->first) return H; return pe; } PCompound* lookupcompound(Prefab_Compound *dc) { if(dc == H) return H; if(D2H(dc)->t != TCompound) return H; return (PCompound*)dc; } void freeprefabcompound(Heap *h, int swept) { Image *i; Prefab_Compound *d; PCompound *pc; d = H2D(Prefab_Compound*, h); pc = lookupcompound(d); /* disconnect compound from image refresh daemon */ i = lookupimage(pc->c.image); if(i != nil) delrefresh(i); if(!swept && TCompound->np) freeptrs(d, TCompound); /* header will be freed by caller */ } static PElement* findtag(PElement *pelem, char *tag) { PElement *pe, *t; List *l; if(pelem==H || tag[0]==0) return pelem; for(l=pelem->first; l!=H; l=l->tail){ pe = *(PElement**)l->data; if(strcmp(tag, string2c(pe->e.tag)) == 0) return pe; else if(pe->pkind==EHorizontal || pe->pkind==EVertical){ t = findtag(pe, tag); if(t != H) return t; } } return H; } int badenviron(Prefab_Environ *env, int err) { Prefab_Style *s; if(env == H) goto bad; s = env->style; if(s == H) goto bad; if(s->titlefont==H || s->textfont==H) goto bad; if(s->elemcolor==H || s->edgecolor==H) goto bad; if(s->titlecolor==H || s->textcolor==H || s->highlightcolor==H) goto bad; return 0; bad: if(err) error(exType); return 1; } void Element_iconseparator(void *fp, int kind) { F_Element_icon *f; PElement *e; Image *icon; int locked; f = fp; badenviron(f->env, 1); checkimage(f->mask); icon = checkimage(f->icon); locked = lockdisplay(icon->display); destroy(*f->ret); *f->ret = H; if(kind == ESeparator) e = separatorelement(f->env, f->r, f->icon, f->mask); else e = iconelement(f->env, f->r, f->icon, f->mask); *f->ret = (Prefab_Element*)e; if(locked) unlockdisplay(icon->display); } void Element_icon(void *fp) { Element_iconseparator(fp, EIcon); } void Element_separator(void *fp) { Element_iconseparator(fp, ESeparator); } void Element_text(void *fp) { F_Element_text *f; PElement *pelem; Display *disp; int locked; f = fp; badenviron(f->env, 1); if(f->kind!=EText && f->kind!=ETitle) return; disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pelem = textelement(f->env, f->text, f->r, f->kind); *f->ret = (Prefab_Element*)pelem; if(locked) unlockdisplay(disp); } void Element_layout(void *fp) { F_Element_layout *f; PElement *pelem; Display *disp; int locked; f = fp; badenviron(f->env, 1); if(f->kind!=EText && f->kind!=ETitle) return; disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pelem = layoutelement(f->env, f->lay, f->r, f->kind); *f->ret = (Prefab_Element*)pelem; if(locked) unlockdisplay(disp); } void Element_elist(void *fp) { F_Element_elist *f; PElement *pelist; Display *disp; int locked; f = fp; if(f->elem != H) checkelement(f->elem); badenviron(f->env, 1); if(f->kind!=EHorizontal && f->kind!=EVertical) return; disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pelist = elistelement(f->env, f->elem, f->kind); *f->ret = (Prefab_Element*)pelist; if(locked) unlockdisplay(disp); } void Element_append(void *fp) { F_Element_append *f; f = fp; *f->ret = 0; if(f->elist==H || f->elem==H) return; badenviron(f->elist->environ, 1); checkelement(f->elist); checkelement(f->elem); if(f->elist->kind!=EHorizontal && f->elist->kind!=EVertical) return; if(appendelist(f->elist, f->elem) != H) *f->ret = 1; } void Element_adjust(void *fp) { F_Element_adjust *f; Display *disp; int locked; f = fp; checkelement(f->elem); badenviron(f->elem->environ, 1); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); adjustelement(f->elem, f->equal, f->dir); if(locked) unlockdisplay(disp); } void Element_show(void *fp) { F_Element_show *f; Display *disp; int locked; f = fp; checkelement(f->elem); checkelement(f->elist); badenviron(f->elem->environ, 1); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); *f->ret = showelement(f->elist, f->elem); if(locked) unlockdisplay(disp); } void Element_clip(void *fp) { F_Element_clip *f; Rectangle r; Display *disp; int locked; f = fp; checkelement(f->elem); badenviron(f->elem->environ, 1); R2R(r, f->r); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); clipelement(f->elem, r); if(locked) unlockdisplay(disp); } void Element_translatescroll(void *fp, int trans) { F_Element_scroll *f; Point d; Display *disp; int locked, moved; f = fp; checkelement(f->elem); badenviron(f->elem->environ, 1); P2P(d, f->d); disp = checkscreen(f->elem->environ->screen)->display; locked = lockdisplay(disp); if(trans) translateelement(f->elem, d); else{ moved = 0; scrollelement(f->elem, d, &moved); } if(locked) unlockdisplay(disp); } void Element_scroll(void *fp) { Element_translatescroll(fp, 0); } void Element_translate(void *fp) { Element_translatescroll(fp, 1); } void Compound_iconbox(void *fp) { F_Compound_iconbox *f; Image *icon; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); checkimage(f->mask); icon = checkimage(f->icon); locked = lockdisplay(icon->display); destroy(*f->ret); *f->ret = H; pc = iconbox(f->env, f->p, f->title, f->icon, f->mask); *f->ret = &pc->c; if(locked) unlockdisplay(icon->display); } void Compound_textbox(void *fp) { F_Compound_textbox *f; Display *disp; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pc = textbox(f->env, f->r, f->title, f->text); *f->ret = &pc->c; if(locked) unlockdisplay(disp); } void Compound_layoutbox(void *fp) { F_Compound_layoutbox *f; Display *disp; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pc = layoutbox(f->env, f->r, f->title, f->lay); *f->ret = &pc->c; if(locked) unlockdisplay(disp); } void Compound_box(void *fp) { F_Compound_box *f; Display *disp; int locked; PCompound *pc; f = fp; badenviron(f->env, 1); if(f->title != H) checkelement(f->title); checkelement(f->elist); disp = checkscreen(f->env->screen)->display; locked = lockdisplay(disp); destroy(*f->ret); *f->ret = H; pc = box(f->env, f->p, f->title, f->elist); *f->ret = &pc->c; if(locked) unlockdisplay(disp); } void Compound_draw(void *fp) { F_Compound_draw *f; PCompound *pc; int locked; f = fp; if(f->comp == H) return; pc = checkcompound(f->comp); badenviron(pc->c.environ, 1); locked = lockdisplay(pc->display); drawcompound(&pc->c); flushimage(pc->display, 1); if(locked) unlockdisplay(pc->display); } void Compound_redraw(void *fp) { F_Compound_redraw *f; PCompound *pc; Image *i; int locked; f = fp; if(f->comp == H) return; pc = checkcompound(f->comp); badenviron(pc->c.environ, 1); i = checkimage(pc->c.image); locked = lockdisplay(pc->display); redrawcompound(i, IRECT(f->r), &pc->c); flushimage(pc->display, 1); if(locked) unlockdisplay(pc->display); } static PElement* pelement(Prefab_Compound *comp, Prefab_Element *elem) { PElement *pe; if(comp == H) return H;