URI:
       tfrutil.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tfrutil.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 }