xref: /plan9/sys/src/libframe/frinit.c (revision 6397270f2f1353bc245f3005811da89a06033226)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <thread.h>
57dd7cddfSDavid du Colombier #include <mouse.h>
63e12c5d1SDavid du Colombier #include <frame.h>
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier void
frinit(Frame * f,Rectangle r,Font * ft,Image * b,Image * cols[NCOL])97dd7cddfSDavid du Colombier frinit(Frame *f, Rectangle r, Font *ft, Image *b, Image *cols[NCOL])
103e12c5d1SDavid du Colombier {
113e12c5d1SDavid du Colombier 	f->font = ft;
127dd7cddfSDavid du Colombier 	f->display = b->display;
137dd7cddfSDavid du Colombier 	f->maxtab = 8*stringwidth(ft, "0");
143e12c5d1SDavid du Colombier 	f->nbox = 0;
153e12c5d1SDavid du Colombier 	f->nalloc = 0;
163e12c5d1SDavid du Colombier 	f->nchars = 0;
173e12c5d1SDavid du Colombier 	f->nlines = 0;
183e12c5d1SDavid du Colombier 	f->p0 = 0;
193e12c5d1SDavid du Colombier 	f->p1 = 0;
203e12c5d1SDavid du Colombier 	f->box = 0;
213e12c5d1SDavid du Colombier 	f->lastlinefull = 0;
227dd7cddfSDavid du Colombier 	if(cols != 0)
237dd7cddfSDavid du Colombier 		memmove(f->cols, cols, sizeof f->cols);
243e12c5d1SDavid du Colombier 	frsetrects(f, r, b);
257dd7cddfSDavid du Colombier 	if(f->tick==nil && f->cols[BACK]!=0)
267dd7cddfSDavid du Colombier 		frinittick(f);
273e12c5d1SDavid du Colombier }
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier void
frinittick(Frame * f)307dd7cddfSDavid du Colombier frinittick(Frame *f)
317dd7cddfSDavid du Colombier {
327dd7cddfSDavid du Colombier 	Image *b;
337dd7cddfSDavid du Colombier 	Font *ft;
347dd7cddfSDavid du Colombier 
359a747e4fSDavid du Colombier 	b = f->display->screenimage;
367dd7cddfSDavid du Colombier 	ft = f->font;
377dd7cddfSDavid du Colombier 	if(f->tick)
389a747e4fSDavid du Colombier 		freeimage(f->tick);
397dd7cddfSDavid du Colombier 	f->tick = allocimage(f->display, Rect(0, 0, FRTICKW, ft->height), b->chan, 0, DWhite);
407dd7cddfSDavid du Colombier 	if(f->tick == nil)
417dd7cddfSDavid du Colombier 		return;
429a747e4fSDavid du Colombier 	if(f->tickback)
439a747e4fSDavid du Colombier 		freeimage(f->tickback);
447dd7cddfSDavid du Colombier 	f->tickback = allocimage(f->display, f->tick->r, b->chan, 0, DWhite);
457dd7cddfSDavid du Colombier 	if(f->tickback == 0){
467dd7cddfSDavid du Colombier 		freeimage(f->tick);
477dd7cddfSDavid du Colombier 		f->tick = 0;
487dd7cddfSDavid du Colombier 		return;
497dd7cddfSDavid du Colombier 	}
507dd7cddfSDavid du Colombier 	/* background color */
517dd7cddfSDavid du Colombier 	draw(f->tick, f->tick->r, f->cols[BACK], nil, ZP);
527dd7cddfSDavid du Colombier 	/* vertical line */
53*6397270fSDavid du Colombier 	draw(f->tick, Rect(FRTICKW/2, 0, FRTICKW/2+1, ft->height), f->cols[TEXT], nil, ZP);
547dd7cddfSDavid du Colombier 	/* box on each end */
557dd7cddfSDavid du Colombier 	draw(f->tick, Rect(0, 0, FRTICKW, FRTICKW), f->cols[TEXT], nil, ZP);
567dd7cddfSDavid du Colombier 	draw(f->tick, Rect(0, ft->height-FRTICKW, FRTICKW, ft->height), f->cols[TEXT], nil, ZP);
577dd7cddfSDavid du Colombier }
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier void
frsetrects(Frame * f,Rectangle r,Image * b)607dd7cddfSDavid du Colombier frsetrects(Frame *f, Rectangle r, Image *b)
613e12c5d1SDavid du Colombier {
623e12c5d1SDavid du Colombier 	f->b = b;
633e12c5d1SDavid du Colombier 	f->entire = r;
643e12c5d1SDavid du Colombier 	f->r = r;
653e12c5d1SDavid du Colombier 	f->r.max.y -= (r.max.y-r.min.y)%f->font->height;
663e12c5d1SDavid du Colombier 	f->maxlines = (r.max.y-r.min.y)/f->font->height;
673e12c5d1SDavid du Colombier }
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier void
frclear(Frame * f,int freeall)707dd7cddfSDavid du Colombier frclear(Frame *f, int freeall)
713e12c5d1SDavid du Colombier {
723e12c5d1SDavid du Colombier 	if(f->nbox)
733e12c5d1SDavid du Colombier 		_frdelbox(f, 0, f->nbox-1);
743e12c5d1SDavid du Colombier 	if(f->box)
753e12c5d1SDavid du Colombier 		free(f->box);
767dd7cddfSDavid du Colombier 	if(freeall){
777dd7cddfSDavid du Colombier 		freeimage(f->tick);
787dd7cddfSDavid du Colombier 		freeimage(f->tickback);
797dd7cddfSDavid du Colombier 		f->tick = 0;
807dd7cddfSDavid du Colombier 		f->tickback = 0;
817dd7cddfSDavid du Colombier 	}
823e12c5d1SDavid du Colombier 	f->box = 0;
837dd7cddfSDavid du Colombier 	f->ticked = 0;
843e12c5d1SDavid du Colombier }
85