Blame


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>
6 b5990708 2003-09-30 devnull
7 b5990708 2003-09-30 devnull Point
8 b5990708 2003-09-30 devnull _frptofcharptb(Frame *f, ulong p, Point pt, int bn)
9 b5990708 2003-09-30 devnull {
10 b5990708 2003-09-30 devnull uchar *s;
11 b5990708 2003-09-30 devnull Frbox *b;
12 b5990708 2003-09-30 devnull int w, l;
13 b5990708 2003-09-30 devnull Rune r;
14 b5990708 2003-09-30 devnull
15 b5990708 2003-09-30 devnull for(b = &f->box[bn]; bn<f->nbox; bn++,b++){
16 b5990708 2003-09-30 devnull _frcklinewrap(f, &pt, b);
17 b5990708 2003-09-30 devnull if(p < (l=NRUNE(b))){
18 b5990708 2003-09-30 devnull if(b->nrune > 0)
19 b5990708 2003-09-30 devnull for(s=b->ptr; p>0; s+=w, p--){
20 b5990708 2003-09-30 devnull if((r = *s) < Runeself)
21 b5990708 2003-09-30 devnull w = 1;
22 b5990708 2003-09-30 devnull else
23 b5990708 2003-09-30 devnull w = chartorune(&r, (char*)s);
24 b5990708 2003-09-30 devnull pt.x += stringnwidth(f->font, (char*)s, 1);
25 b5990708 2003-09-30 devnull if(r==0 || pt.x>f->r.max.x)
26 b5990708 2003-09-30 devnull drawerror(f->display, "frptofchar");
27 b5990708 2003-09-30 devnull }
28 b5990708 2003-09-30 devnull break;
29 b5990708 2003-09-30 devnull }
30 b5990708 2003-09-30 devnull p -= l;
31 b5990708 2003-09-30 devnull _fradvance(f, &pt, b);
32 b5990708 2003-09-30 devnull }
33 b5990708 2003-09-30 devnull return pt;
34 b5990708 2003-09-30 devnull }
35 b5990708 2003-09-30 devnull
36 b5990708 2003-09-30 devnull Point
37 b5990708 2003-09-30 devnull frptofchar(Frame *f, ulong p)
38 b5990708 2003-09-30 devnull {
39 b5990708 2003-09-30 devnull return _frptofcharptb(f, p, f->r.min, 0);
40 b5990708 2003-09-30 devnull }
41 b5990708 2003-09-30 devnull
42 b5990708 2003-09-30 devnull Point
43 b5990708 2003-09-30 devnull _frptofcharnb(Frame *f, ulong p, int nb) /* doesn't do final _fradvance to next line */
44 b5990708 2003-09-30 devnull {
45 b5990708 2003-09-30 devnull Point pt;
46 b5990708 2003-09-30 devnull int nbox;
47 b5990708 2003-09-30 devnull
48 b5990708 2003-09-30 devnull nbox = f->nbox;
49 b5990708 2003-09-30 devnull f->nbox = nb;
50 b5990708 2003-09-30 devnull pt = _frptofcharptb(f, p, f->r.min, 0);
51 b5990708 2003-09-30 devnull f->nbox = nbox;
52 b5990708 2003-09-30 devnull return pt;
53 b5990708 2003-09-30 devnull }
54 b5990708 2003-09-30 devnull
55 b5990708 2003-09-30 devnull static
56 b5990708 2003-09-30 devnull Point
57 b5990708 2003-09-30 devnull _frgrid(Frame *f, Point p)
58 b5990708 2003-09-30 devnull {
59 b5990708 2003-09-30 devnull p.y -= f->r.min.y;
60 b5990708 2003-09-30 devnull p.y -= p.y%f->font->height;
61 b5990708 2003-09-30 devnull p.y += f->r.min.y;
62 b5990708 2003-09-30 devnull if(p.x > f->r.max.x)
63 b5990708 2003-09-30 devnull p.x = f->r.max.x;
64 b5990708 2003-09-30 devnull return p;
65 b5990708 2003-09-30 devnull }
66 b5990708 2003-09-30 devnull
67 b5990708 2003-09-30 devnull ulong
68 b5990708 2003-09-30 devnull frcharofpt(Frame *f, Point pt)
69 b5990708 2003-09-30 devnull {
70 b5990708 2003-09-30 devnull Point qt;
71 b5990708 2003-09-30 devnull int w, bn;
72 b5990708 2003-09-30 devnull uchar *s;
73 b5990708 2003-09-30 devnull Frbox *b;
74 b5990708 2003-09-30 devnull ulong p;
75 b5990708 2003-09-30 devnull Rune r;
76 b5990708 2003-09-30 devnull
77 b5990708 2003-09-30 devnull pt = _frgrid(f, pt);
78 b5990708 2003-09-30 devnull qt = f->r.min;
79 b5990708 2003-09-30 devnull for(b=f->box,bn=0,p=0; bn<f->nbox && qt.y<pt.y; bn++,b++){
80 b5990708 2003-09-30 devnull _frcklinewrap(f, &qt, b);
81 b5990708 2003-09-30 devnull if(qt.y >= pt.y)
82 b5990708 2003-09-30 devnull break;
83 b5990708 2003-09-30 devnull _fradvance(f, &qt, b);
84 b5990708 2003-09-30 devnull p += NRUNE(b);
85 b5990708 2003-09-30 devnull }
86 b5990708 2003-09-30 devnull for(; bn<f->nbox && qt.x<=pt.x; bn++,b++){
87 b5990708 2003-09-30 devnull _frcklinewrap(f, &qt, b);
88 b5990708 2003-09-30 devnull if(qt.y > pt.y)
89 b5990708 2003-09-30 devnull break;
90 b5990708 2003-09-30 devnull if(qt.x+b->wid > pt.x){
91 b5990708 2003-09-30 devnull if(b->nrune < 0)
92 b5990708 2003-09-30 devnull _fradvance(f, &qt, b);
93 b5990708 2003-09-30 devnull else{
94 b5990708 2003-09-30 devnull s = b->ptr;
95 b5990708 2003-09-30 devnull for(;;){
96 b5990708 2003-09-30 devnull if((r = *s) < Runeself)
97 b5990708 2003-09-30 devnull w = 1;
98 b5990708 2003-09-30 devnull else
99 b5990708 2003-09-30 devnull w = chartorune(&r, (char*)s);
100 b5990708 2003-09-30 devnull if(r == 0)
101 b5990708 2003-09-30 devnull drawerror(f->display, "end of string in frcharofpt");
102 b5990708 2003-09-30 devnull qt.x += stringnwidth(f->font, (char*)s, 1);
103 b5990708 2003-09-30 devnull s += w;
104 b5990708 2003-09-30 devnull if(qt.x > pt.x)
105 b5990708 2003-09-30 devnull break;
106 b5990708 2003-09-30 devnull p++;
107 b5990708 2003-09-30 devnull }
108 b5990708 2003-09-30 devnull }
109 b5990708 2003-09-30 devnull }else{
110 b5990708 2003-09-30 devnull p += NRUNE(b);
111 b5990708 2003-09-30 devnull _fradvance(f, &qt, b);
112 b5990708 2003-09-30 devnull }
113 b5990708 2003-09-30 devnull }
114 b5990708 2003-09-30 devnull return p;
115 b5990708 2003-09-30 devnull }