Blob


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