jehanne/sys/src/lib/frame/frinit.c

94 lines
2.1 KiB
C

/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
#include <u.h>
#include <lib9.h>
#include <draw.h>
#include <thread.h>
#include <mouse.h>
#include <frame.h>
void
frinit(Frame *f, Rectangle r, Font *ft, Image *b, Image *cols[NCOL])
{
f->font = ft;
f->display = b->display;
f->maxtab = 8*stringwidth(ft, "0");
f->nbox = 0;
f->nalloc = 0;
f->nchars = 0;
f->nlines = 0;
f->p0 = 0;
f->p1 = 0;
f->box = 0;
f->lastlinefull = 0;
if(cols != 0)
memmove(f->cols, cols, sizeof f->cols);
frsetrects(f, r, b);
if(f->tick==nil && f->cols[BACK]!=0)
frinittick(f);
}
void
frinittick(Frame *f)
{
Image *b;
Font *ft;
b = f->display->screenimage;
ft = f->font;
if(f->tick)
freeimage(f->tick);
f->tick = allocimage(f->display, Rect(0, 0, FRTICKW, ft->height), b->chan, 0, DWhite);
if(f->tick == nil)
return;
if(f->tickback)
freeimage(f->tickback);
f->tickback = allocimage(f->display, f->tick->r, b->chan, 0, DWhite);
if(f->tickback == 0){
freeimage(f->tick);
f->tick = 0;
return;
}
/* background color */
draw(f->tick, f->tick->r, f->cols[BACK], nil, ZP);
/* vertical line */
draw(f->tick, Rect(FRTICKW/2, 0, FRTICKW/2+1, ft->height), f->cols[TEXT], nil, ZP);
/* box on each end */
draw(f->tick, Rect(0, 0, FRTICKW, FRTICKW), f->cols[TEXT], nil, ZP);
draw(f->tick, Rect(0, ft->height-FRTICKW, FRTICKW, ft->height), f->cols[TEXT], nil, ZP);
}
void
frsetrects(Frame *f, Rectangle r, Image *b)
{
f->b = b;
f->entire = r;
f->r = r;
f->r.max.y -= (r.max.y-r.min.y)%f->font->height;
f->maxlines = (r.max.y-r.min.y)/f->font->height;
}
void
frclear(Frame *f, int freeall)
{
if(f->nbox)
_frdelbox(f, 0, f->nbox-1);
if(f->box)
free(f->box);
if(freeall){
freeimage(f->tick);
freeimage(f->tickback);
f->tick = 0;
f->tickback = 0;
}
f->box = 0;
f->ticked = 0;
}