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>
8 b5990708 2003-09-30 devnull _frptofcharptb(Frame *f, ulong p, Point pt, int bn)
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;
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)
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");
31 b5990708 2003-09-30 devnull _fradvance(f, &pt, b);
33 b5990708 2003-09-30 devnull return pt;
37 b5990708 2003-09-30 devnull frptofchar(Frame *f, ulong p)
39 b5990708 2003-09-30 devnull return _frptofcharptb(f, p, f->r.min, 0);
43 b5990708 2003-09-30 devnull _frptofcharnb(Frame *f, ulong p, int nb) /* doesn't do final _fradvance to next line */
45 b5990708 2003-09-30 devnull Point pt;
46 b5990708 2003-09-30 devnull int nbox;
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;
57 b5990708 2003-09-30 devnull _frgrid(Frame *f, Point p)
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;
68 b5990708 2003-09-30 devnull frcharofpt(Frame *f, Point pt)
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;
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)
83 b5990708 2003-09-30 devnull _fradvance(f, &qt, b);
84 b5990708 2003-09-30 devnull p += NRUNE(b);
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)
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);
94 b5990708 2003-09-30 devnull s = b->ptr;
96 b5990708 2003-09-30 devnull if((r = *s) < Runeself)
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);
104 b5990708 2003-09-30 devnull if(qt.x > pt.x)
110 b5990708 2003-09-30 devnull p += NRUNE(b);
111 b5990708 2003-09-30 devnull _fradvance(f, &qt, b);
114 b5990708 2003-09-30 devnull return p;