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>
8 b5990708 2003-09-30 devnull _frcanfit(Frame *f, Point pt, Frbox *b)
10 b5990708 2003-09-30 devnull int left, w, nr;
11 b5990708 2003-09-30 devnull uchar *p;
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++){
21 b5990708 2003-09-30 devnull if(r < Runeself)
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;
29 b5990708 2003-09-30 devnull drawerror(f->display, "_frcanfit can't");
30 b5990708 2003-09-30 devnull return 0;
34 b5990708 2003-09-30 devnull _frcklinewrap(Frame *f, Point *p, Frbox *b)
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;
43 b5990708 2003-09-30 devnull _frcklinewrap0(Frame *f, Point *p, Frbox *b)
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;
52 b5990708 2003-09-30 devnull _fradvance(Frame *f, Point *p, Frbox *b)
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;
58 b5990708 2003-09-30 devnull p->x += b->wid;
62 b5990708 2003-09-30 devnull _frnewwid(Frame *f, Point pt, Frbox *b)
64 b5990708 2003-09-30 devnull b->wid = _frnewwid0(f, pt, b);
65 b5990708 2003-09-30 devnull return b->wid;
69 b5990708 2003-09-30 devnull _frnewwid0(Frame *f, Point pt, Frbox *b)
71 b5990708 2003-09-30 devnull int c, x;
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;
87 b5990708 2003-09-30 devnull _frclean(Frame *f, Point pt, int n0, int n1) /* look for mergeable boxes */
89 b5990708 2003-09-30 devnull Frbox *b;
90 b5990708 2003-09-30 devnull int nb, c;
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);
99 b5990708 2003-09-30 devnull b = &f->box[nb];
101 b5990708 2003-09-30 devnull _fradvance(f, &pt, &f->box[nb]);
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]);
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;