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