Blame


1 b5990708 2003-09-30 devnull #include <u.h>
2 b5990708 2003-09-30 devnull #include <libc.h>
3 b5990708 2003-09-30 devnull #include <draw.h>
4 b5990708 2003-09-30 devnull #include <mouse.h>
5 b5990708 2003-09-30 devnull #include <frame.h>
6 b5990708 2003-09-30 devnull
7 b5990708 2003-09-30 devnull int
8 b5990708 2003-09-30 devnull _frcanfit(Frame *f, Point pt, Frbox *b)
9 b5990708 2003-09-30 devnull {
10 b5990708 2003-09-30 devnull int left, w, nr;
11 b5990708 2003-09-30 devnull uchar *p;
12 b5990708 2003-09-30 devnull Rune r;
13 b5990708 2003-09-30 devnull
14 b5990708 2003-09-30 devnull left = f->r.max.x-pt.x;
15 b5990708 2003-09-30 devnull if(b->nrune < 0)
16 b5990708 2003-09-30 devnull return b->minwid <= left;
17 b5990708 2003-09-30 devnull if(left >= b->wid)
18 b5990708 2003-09-30 devnull return b->nrune;
19 b5990708 2003-09-30 devnull for(nr=0,p=b->ptr; *p; p+=w,nr++){
20 b5990708 2003-09-30 devnull r = *p;
21 b5990708 2003-09-30 devnull if(r < Runeself)
22 b5990708 2003-09-30 devnull w = 1;
23 b5990708 2003-09-30 devnull else
24 b5990708 2003-09-30 devnull w = chartorune(&r, (char*)p);
25 b5990708 2003-09-30 devnull left -= stringnwidth(f->font, (char*)p, 1);
26 b5990708 2003-09-30 devnull if(left < 0)
27 b5990708 2003-09-30 devnull return nr;
28 b5990708 2003-09-30 devnull }
29 b5990708 2003-09-30 devnull drawerror(f->display, "_frcanfit can't");
30 b5990708 2003-09-30 devnull return 0;
31 b5990708 2003-09-30 devnull }
32 b5990708 2003-09-30 devnull
33 b5990708 2003-09-30 devnull void
34 b5990708 2003-09-30 devnull _frcklinewrap(Frame *f, Point *p, Frbox *b)
35 b5990708 2003-09-30 devnull {
36 b5990708 2003-09-30 devnull if((b->nrune<0? b->minwid : b->wid) > f->r.max.x-p->x){
37 b5990708 2003-09-30 devnull p->x = f->r.min.x;
38 b5990708 2003-09-30 devnull p->y += f->font->height;
39 b5990708 2003-09-30 devnull }
40 b5990708 2003-09-30 devnull }
41 b5990708 2003-09-30 devnull
42 b5990708 2003-09-30 devnull void
43 b5990708 2003-09-30 devnull _frcklinewrap0(Frame *f, Point *p, Frbox *b)
44 b5990708 2003-09-30 devnull {
45 b5990708 2003-09-30 devnull if(_frcanfit(f, *p, b) == 0){
46 b5990708 2003-09-30 devnull p->x = f->r.min.x;
47 b5990708 2003-09-30 devnull p->y += f->font->height;
48 b5990708 2003-09-30 devnull }
49 b5990708 2003-09-30 devnull }
50 b5990708 2003-09-30 devnull
51 b5990708 2003-09-30 devnull void
52 b5990708 2003-09-30 devnull _fradvance(Frame *f, Point *p, Frbox *b)
53 b5990708 2003-09-30 devnull {
54 b5990708 2003-09-30 devnull if(b->nrune<0 && b->bc=='\n'){
55 b5990708 2003-09-30 devnull p->x = f->r.min.x;
56 b5990708 2003-09-30 devnull p->y += f->font->height;
57 b5990708 2003-09-30 devnull }else
58 b5990708 2003-09-30 devnull p->x += b->wid;
59 b5990708 2003-09-30 devnull }
60 b5990708 2003-09-30 devnull
61 b5990708 2003-09-30 devnull int
62 b5990708 2003-09-30 devnull _frnewwid(Frame *f, Point pt, Frbox *b)
63 b5990708 2003-09-30 devnull {
64 b5990708 2003-09-30 devnull b->wid = _frnewwid0(f, pt, b);
65 b5990708 2003-09-30 devnull return b->wid;
66 b5990708 2003-09-30 devnull }
67 b5990708 2003-09-30 devnull
68 b5990708 2003-09-30 devnull int
69 b5990708 2003-09-30 devnull _frnewwid0(Frame *f, Point pt, Frbox *b)
70 b5990708 2003-09-30 devnull {
71 b5990708 2003-09-30 devnull int c, x;
72 b5990708 2003-09-30 devnull
73 b5990708 2003-09-30 devnull c = f->r.max.x;
74 b5990708 2003-09-30 devnull x = pt.x;
75 b5990708 2003-09-30 devnull if(b->nrune>=0 || b->bc!='\t')
76 b5990708 2003-09-30 devnull return b->wid;
77 b5990708 2003-09-30 devnull if(x+b->minwid > c)
78 b5990708 2003-09-30 devnull x = pt.x = f->r.min.x;
79 b5990708 2003-09-30 devnull x += f->maxtab;
80 b5990708 2003-09-30 devnull x -= (x-f->r.min.x)%f->maxtab;
81 b5990708 2003-09-30 devnull if(x-pt.x<b->minwid || x>c)
82 b5990708 2003-09-30 devnull x = pt.x+b->minwid;
83 b5990708 2003-09-30 devnull return x-pt.x;
84 b5990708 2003-09-30 devnull }
85 b5990708 2003-09-30 devnull
86 b5990708 2003-09-30 devnull void
87 b5990708 2003-09-30 devnull _frclean(Frame *f, Point pt, int n0, int n1) /* look for mergeable boxes */
88 b5990708 2003-09-30 devnull {
89 b5990708 2003-09-30 devnull Frbox *b;
90 b5990708 2003-09-30 devnull int nb, c;
91 b5990708 2003-09-30 devnull
92 b5990708 2003-09-30 devnull c = f->r.max.x;
93 b5990708 2003-09-30 devnull for(nb=n0; nb<n1-1; nb++){
94 b5990708 2003-09-30 devnull b = &f->box[nb];
95 b5990708 2003-09-30 devnull _frcklinewrap(f, &pt, b);
96 b5990708 2003-09-30 devnull while(b[0].nrune>=0 && nb<n1-1 && b[1].nrune>=0 && pt.x+b[0].wid+b[1].wid<c){
97 b5990708 2003-09-30 devnull _frmergebox(f, nb);
98 b5990708 2003-09-30 devnull n1--;
99 b5990708 2003-09-30 devnull b = &f->box[nb];
100 b5990708 2003-09-30 devnull }
101 b5990708 2003-09-30 devnull _fradvance(f, &pt, &f->box[nb]);
102 b5990708 2003-09-30 devnull }
103 b5990708 2003-09-30 devnull for(; nb<f->nbox; nb++){
104 b5990708 2003-09-30 devnull b = &f->box[nb];
105 b5990708 2003-09-30 devnull _frcklinewrap(f, &pt, b);
106 b5990708 2003-09-30 devnull _fradvance(f, &pt, &f->box[nb]);
107 b5990708 2003-09-30 devnull }
108 b5990708 2003-09-30 devnull f->lastlinefull = 0;
109 b5990708 2003-09-30 devnull if(pt.y >= f->r.max.y)
110 b5990708 2003-09-30 devnull f->lastlinefull = 1;
111 b5990708 2003-09-30 devnull }