]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libframe/frutil.c
kernel: implement portable userinit() and simplify process creation
[plan9front.git] / sys / src / libframe / frutil.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <thread.h>
5 #include <mouse.h>
6 #include <frame.h>
7
8 int
9 _frcanfit(Frame *f, Point pt, Frbox *b)
10 {
11         int left, w, nr;
12         uchar *p;
13         Rune r;
14
15         left = f->r.max.x-pt.x;
16         if(b->nrune < 0)
17                 return b->minwid <= left;
18         if(left >= b->wid)
19                 return b->nrune;
20         for(nr=0,p=b->ptr; *p; p+=w,nr++){
21                 r = *p;
22                 if(r < Runeself)
23                         w = 1;
24                 else
25                         w = chartorune(&r, (char*)p);
26                 left -= stringnwidth(f->font, (char*)p, 1);
27                 if(left < 0)
28                         break;
29         }
30         return nr;
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 }