forsyth20121205-174063a80cc13 years agoHistory
824 lines · 14.2 KB · C
RawDownload
#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.