xref: /plan9/sys/src/libframe/frinit.c (revision 6397270f2f1353bc245f3005811da89a06033226)
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <thread.h>
5 #include <mouse.h>
6 #include <frame.h>
7 
8 void
frinit(Frame * f,Rectangle r,Font * ft,Image * b,Image * cols[NCOL])9 frinit(Frame *f, Rectangle r, Font *ft, Image *b, Image *cols[NCOL])
10 {
11 	f->font = ft;
12 	f->display = b->display;
13 	f->maxtab = 8*stringwidth(ft, "0");
14 	f->nbox = 0;
15 	f->nalloc = 0;
16 	f->nchars = 0;
17 	f->nlines = 0;
18 	f->p0 = 0;
19 	f->p1 = 0;
20 	f->box = 0;
21 	f->lastlinefull = 0;
22 	if(cols != 0)
23 		memmove(f->cols, cols, sizeof f->cols);
24 	frsetrects(f, r, b);
25 	if(f->tick==nil && f->cols[BACK]!=0)
26 		frinittick(f);
27 }
28 
29 void
frinittick(Frame * f)30 frinittick(Frame *f)
31 {
32 	Image *b;
33 	Font *ft;
34 
35 	b = f->display->screenimage;
36 	ft = f->font;
37 	if(f->tick)
38 		freeimage(f->tick);
39 	f->tick = allocimage(f->display, Rect(0, 0, FRTICKW, ft->height), b->chan, 0, DWhite);
40 	if(f->tick == nil)
41 		return;
42 	if(f->tickback)
43 		freeimage(f->tickback);
44 	f->tickback = allocimage(f->display, f->tick->r, b->chan, 0, DWhite);
45 	if(f->tickback == 0){
46 		freeimage(f->tick);
47 		f->tick = 0;
48 		return;
49 	}
50 	/* background color */
51 	draw(f->tick, f->tick->r, f->cols[BACK], nil, ZP);
52 	/* vertical line */
53 	draw(f->tick, Rect(FRTICKW/2, 0, FRTICKW/2+1, ft->height), f->cols[TEXT], nil, ZP);
54 	/* box on each end */
55 	draw(f->tick, Rect(0, 0, FRTICKW, FRTICKW), f->cols[TEXT], nil, ZP);
56 	draw(f->tick, Rect(0, ft->height-FRTICKW, FRTICKW, ft->height), f->cols[TEXT], nil, ZP);
57 }
58 
59 void
frsetrects(Frame * f,Rectangle r,Image * b)60 frsetrects(Frame *f, Rectangle r, Image *b)
61 {
62 	f->b = b;
63 	f->entire = r;
64 	f->r = r;
65 	f->r.max.y -= (r.max.y-r.min.y)%f->font->height;
66 	f->maxlines = (r.max.y-r.min.y)/f->font->height;
67 }
68 
69 void
frclear(Frame * f,int freeall)70 frclear(Frame *f, int freeall)
71 {
72 	if(f->nbox)
73 		_frdelbox(f, 0, f->nbox-1);
74 	if(f->box)
75 		free(f->box);
76 	if(freeall){
77 		freeimage(f->tick);
78 		freeimage(f->tickback);
79 		f->tick = 0;
80 		f->tickback = 0;
81 	}
82 	f->box = 0;
83 	f->ticked = 0;
84 }
85