diff options
author | rsc <devnull@localhost> | 2003-09-30 17:47:43 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-09-30 17:47:43 +0000 |
commit | b5990708483a1fa452b3d4b6ed2bfa998deeeb39 (patch) | |
tree | 9d2413286307f7e29a1906ebe4d1b59477ff886d /src/libframe/frutil.c | |
parent | 76193d7cb0457807b2f0b95f909ab5de19480cd7 (diff) | |
download | plan9port-b5990708483a1fa452b3d4b6ed2bfa998deeeb39.tar.gz plan9port-b5990708483a1fa452b3d4b6ed2bfa998deeeb39.tar.bz2 plan9port-b5990708483a1fa452b3d4b6ed2bfa998deeeb39.zip |
Initial import.
Diffstat (limited to 'src/libframe/frutil.c')
-rw-r--r-- | src/libframe/frutil.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/libframe/frutil.c b/src/libframe/frutil.c new file mode 100644 index 00000000..c8e3c043 --- /dev/null +++ b/src/libframe/frutil.c @@ -0,0 +1,111 @@ +#include <u.h> +#include <libc.h> +#include <draw.h> +#include <mouse.h> +#include <frame.h> + +int +_frcanfit(Frame *f, Point pt, Frbox *b) +{ + int left, w, nr; + uchar *p; + Rune r; + + left = f->r.max.x-pt.x; + if(b->nrune < 0) + return b->minwid <= left; + if(left >= b->wid) + return b->nrune; + for(nr=0,p=b->ptr; *p; p+=w,nr++){ + r = *p; + if(r < Runeself) + w = 1; + else + w = chartorune(&r, (char*)p); + left -= stringnwidth(f->font, (char*)p, 1); + if(left < 0) + return nr; + } + drawerror(f->display, "_frcanfit can't"); + return 0; +} + +void +_frcklinewrap(Frame *f, Point *p, Frbox *b) +{ + if((b->nrune<0? b->minwid : b->wid) > f->r.max.x-p->x){ + p->x = f->r.min.x; + p->y += f->font->height; + } +} + +void +_frcklinewrap0(Frame *f, Point *p, Frbox *b) +{ + if(_frcanfit(f, *p, b) == 0){ + p->x = f->r.min.x; + p->y += f->font->height; + } +} + +void +_fradvance(Frame *f, Point *p, Frbox *b) +{ + if(b->nrune<0 && b->bc=='\n'){ + p->x = f->r.min.x; + p->y += f->font->height; + }else + p->x += b->wid; +} + +int +_frnewwid(Frame *f, Point pt, Frbox *b) +{ + b->wid = _frnewwid0(f, pt, b); + return b->wid; +} + +int +_frnewwid0(Frame *f, Point pt, Frbox *b) +{ + int c, x; + + c = f->r.max.x; + x = pt.x; + if(b->nrune>=0 || b->bc!='\t') + return b->wid; + if(x+b->minwid > c) + x = pt.x = f->r.min.x; + x += f->maxtab; + x -= (x-f->r.min.x)%f->maxtab; + if(x-pt.x<b->minwid || x>c) + x = pt.x+b->minwid; + return x-pt.x; +} + +void +_frclean(Frame *f, Point pt, int n0, int n1) /* look for mergeable boxes */ +{ + Frbox *b; + int nb, c; + + c = f->r.max.x; + for(nb=n0; nb<n1-1; nb++){ + b = &f->box[nb]; + _frcklinewrap(f, &pt, b); + while(b[0].nrune>=0 && nb<n1-1 && b[1].nrune>=0 && pt.x+b[0].wid+b[1].wid<c){ + _frmergebox(f, nb); + n1--; + b = &f->box[nb]; + } + _fradvance(f, &pt, &f->box[nb]); + } + for(; nb<f->nbox; nb++){ + b = &f->box[nb]; + _frcklinewrap(f, &pt, b); + _fradvance(f, &pt, &f->box[nb]); + } + f->lastlinefull = 0; + if(pt.y >= f->r.max.y) + f->lastlinefull = 1; +} |