Blame


1 b822e0d8 2003-09-30 devnull #include <u.h>
2 b822e0d8 2003-09-30 devnull #include <libc.h>
3 b822e0d8 2003-09-30 devnull #include <draw.h>
4 b822e0d8 2003-09-30 devnull #include <mouse.h>
5 b822e0d8 2003-09-30 devnull #include <frame.h>
6 b822e0d8 2003-09-30 devnull
7 b822e0d8 2003-09-30 devnull #define SLOP 25
8 b822e0d8 2003-09-30 devnull
9 b822e0d8 2003-09-30 devnull void
10 b822e0d8 2003-09-30 devnull _fraddbox(Frame *f, int bn, int n) /* add n boxes after bn, shift the rest up,
11 b822e0d8 2003-09-30 devnull * box[bn+n]==box[bn] */
12 b822e0d8 2003-09-30 devnull {
13 b822e0d8 2003-09-30 devnull int i;
14 b822e0d8 2003-09-30 devnull
15 b822e0d8 2003-09-30 devnull if(bn > f->nbox)
16 b822e0d8 2003-09-30 devnull drawerror(f->display, "_fraddbox");
17 b822e0d8 2003-09-30 devnull if(f->nbox+n > f->nalloc)
18 b822e0d8 2003-09-30 devnull _frgrowbox(f, n+SLOP);
19 b822e0d8 2003-09-30 devnull for(i=f->nbox; --i>=bn; )
20 b822e0d8 2003-09-30 devnull f->box[i+n] = f->box[i];
21 b822e0d8 2003-09-30 devnull f->nbox+=n;
22 b822e0d8 2003-09-30 devnull }
23 b822e0d8 2003-09-30 devnull
24 b822e0d8 2003-09-30 devnull void
25 b822e0d8 2003-09-30 devnull _frclosebox(Frame *f, int n0, int n1) /* inclusive */
26 b822e0d8 2003-09-30 devnull {
27 b822e0d8 2003-09-30 devnull int i;
28 b822e0d8 2003-09-30 devnull
29 b822e0d8 2003-09-30 devnull if(n0>=f->nbox || n1>=f->nbox || n1<n0)
30 b822e0d8 2003-09-30 devnull drawerror(f->display, "_frclosebox");
31 b822e0d8 2003-09-30 devnull n1++;
32 b822e0d8 2003-09-30 devnull for(i=n1; i<f->nbox; i++)
33 b822e0d8 2003-09-30 devnull f->box[i-(n1-n0)] = f->box[i];
34 b822e0d8 2003-09-30 devnull f->nbox -= n1-n0;
35 b822e0d8 2003-09-30 devnull }
36 b822e0d8 2003-09-30 devnull
37 b822e0d8 2003-09-30 devnull void
38 b822e0d8 2003-09-30 devnull _frdelbox(Frame *f, int n0, int n1) /* inclusive */
39 b822e0d8 2003-09-30 devnull {
40 b822e0d8 2003-09-30 devnull if(n0>=f->nbox || n1>=f->nbox || n1<n0)
41 b822e0d8 2003-09-30 devnull drawerror(f->display, "_frdelbox");
42 b822e0d8 2003-09-30 devnull _frfreebox(f, n0, n1);
43 b822e0d8 2003-09-30 devnull _frclosebox(f, n0, n1);
44 b822e0d8 2003-09-30 devnull }
45 b822e0d8 2003-09-30 devnull
46 b822e0d8 2003-09-30 devnull void
47 b822e0d8 2003-09-30 devnull _frfreebox(Frame *f, int n0, int n1) /* inclusive */
48 b822e0d8 2003-09-30 devnull {
49 b822e0d8 2003-09-30 devnull int i;
50 b822e0d8 2003-09-30 devnull
51 b822e0d8 2003-09-30 devnull if(n1<n0)
52 b822e0d8 2003-09-30 devnull return;
53 b822e0d8 2003-09-30 devnull if(n0>=f->nbox || n1>=f->nbox)
54 b822e0d8 2003-09-30 devnull drawerror(f->display, "_frfreebox");
55 b822e0d8 2003-09-30 devnull n1++;
56 b822e0d8 2003-09-30 devnull for(i=n0; i<n1; i++)
57 b822e0d8 2003-09-30 devnull if(f->box[i].nrune >= 0)
58 b822e0d8 2003-09-30 devnull free(f->box[i].ptr);
59 b822e0d8 2003-09-30 devnull }
60 b822e0d8 2003-09-30 devnull
61 b822e0d8 2003-09-30 devnull void
62 b822e0d8 2003-09-30 devnull _frgrowbox(Frame *f, int delta)
63 b822e0d8 2003-09-30 devnull {
64 b822e0d8 2003-09-30 devnull f->nalloc += delta;
65 b822e0d8 2003-09-30 devnull f->box = realloc(f->box, f->nalloc*sizeof(Frbox));
66 b822e0d8 2003-09-30 devnull if(f->box == 0)
67 b822e0d8 2003-09-30 devnull drawerror(f->display, "_frgrowbox");
68 b822e0d8 2003-09-30 devnull }
69 b822e0d8 2003-09-30 devnull
70 b822e0d8 2003-09-30 devnull static
71 b822e0d8 2003-09-30 devnull void
72 b822e0d8 2003-09-30 devnull dupbox(Frame *f, int bn)
73 b822e0d8 2003-09-30 devnull {
74 b822e0d8 2003-09-30 devnull uchar *p;
75 b822e0d8 2003-09-30 devnull
76 b822e0d8 2003-09-30 devnull if(f->box[bn].nrune < 0)
77 b822e0d8 2003-09-30 devnull drawerror(f->display, "dupbox");
78 b822e0d8 2003-09-30 devnull _fraddbox(f, bn, 1);
79 b822e0d8 2003-09-30 devnull if(f->box[bn].nrune >= 0){
80 b822e0d8 2003-09-30 devnull p = _frallocstr(f, NBYTE(&f->box[bn])+1);
81 b822e0d8 2003-09-30 devnull strcpy((char*)p, (char*)f->box[bn].ptr);
82 b822e0d8 2003-09-30 devnull f->box[bn+1].ptr = p;
83 b822e0d8 2003-09-30 devnull }
84 b822e0d8 2003-09-30 devnull }
85 b822e0d8 2003-09-30 devnull
86 b822e0d8 2003-09-30 devnull static
87 b822e0d8 2003-09-30 devnull uchar*
88 b822e0d8 2003-09-30 devnull runeindex(uchar *p, int n)
89 b822e0d8 2003-09-30 devnull {
90 b822e0d8 2003-09-30 devnull int i, w;
91 b822e0d8 2003-09-30 devnull Rune rune;
92 b822e0d8 2003-09-30 devnull
93 b822e0d8 2003-09-30 devnull for(i=0; i<n; i++,p+=w)
94 b822e0d8 2003-09-30 devnull if(*p < Runeself)
95 b822e0d8 2003-09-30 devnull w = 1;
96 b822e0d8 2003-09-30 devnull else{
97 b822e0d8 2003-09-30 devnull w = chartorune(&rune, (char*)p);
98 b822e0d8 2003-09-30 devnull USED(rune);
99 b822e0d8 2003-09-30 devnull }
100 b822e0d8 2003-09-30 devnull return p;
101 b822e0d8 2003-09-30 devnull }
102 b822e0d8 2003-09-30 devnull
103 b822e0d8 2003-09-30 devnull static
104 b822e0d8 2003-09-30 devnull void
105 b822e0d8 2003-09-30 devnull truncatebox(Frame *f, Frbox *b, int n) /* drop last n chars; no allocation done */
106 b822e0d8 2003-09-30 devnull {
107 b822e0d8 2003-09-30 devnull if(b->nrune<0 || b->nrune<n)
108 b822e0d8 2003-09-30 devnull drawerror(f->display, "truncatebox");
109 b822e0d8 2003-09-30 devnull b->nrune -= n;
110 b822e0d8 2003-09-30 devnull runeindex(b->ptr, b->nrune)[0] = 0;
111 b822e0d8 2003-09-30 devnull b->wid = stringwidth(f->font, (char *)b->ptr);
112 b822e0d8 2003-09-30 devnull }
113 b822e0d8 2003-09-30 devnull
114 b822e0d8 2003-09-30 devnull static
115 b822e0d8 2003-09-30 devnull void
116 b822e0d8 2003-09-30 devnull chopbox(Frame *f, Frbox *b, int n) /* drop first n chars; no allocation done */
117 b822e0d8 2003-09-30 devnull {
118 15680d56 2004-03-05 devnull char *p;
119 8c6f0e8a 2004-03-05 devnull
120 b822e0d8 2003-09-30 devnull if(b->nrune<0 || b->nrune<n)
121 b822e0d8 2003-09-30 devnull drawerror(f->display, "chopbox");
122 15680d56 2004-03-05 devnull p = (char*)runeindex(b->ptr, n);
123 15680d56 2004-03-05 devnull memmove((char*)b->ptr, p, strlen(p)+1);
124 b822e0d8 2003-09-30 devnull b->nrune -= n;
125 b822e0d8 2003-09-30 devnull b->wid = stringwidth(f->font, (char *)b->ptr);
126 b822e0d8 2003-09-30 devnull }
127 b822e0d8 2003-09-30 devnull
128 b822e0d8 2003-09-30 devnull void
129 b822e0d8 2003-09-30 devnull _frsplitbox(Frame *f, int bn, int n)
130 b822e0d8 2003-09-30 devnull {
131 b822e0d8 2003-09-30 devnull dupbox(f, bn);
132 b822e0d8 2003-09-30 devnull truncatebox(f, &f->box[bn], f->box[bn].nrune-n);
133 b822e0d8 2003-09-30 devnull chopbox(f, &f->box[bn+1], n);
134 b822e0d8 2003-09-30 devnull }
135 b822e0d8 2003-09-30 devnull
136 b822e0d8 2003-09-30 devnull void
137 b822e0d8 2003-09-30 devnull _frmergebox(Frame *f, int bn) /* merge bn and bn+1 */
138 b822e0d8 2003-09-30 devnull {
139 b822e0d8 2003-09-30 devnull Frbox *b;
140 b822e0d8 2003-09-30 devnull
141 b822e0d8 2003-09-30 devnull b = &f->box[bn];
142 b822e0d8 2003-09-30 devnull _frinsure(f, bn, NBYTE(&b[0])+NBYTE(&b[1])+1);
143 b822e0d8 2003-09-30 devnull strcpy((char*)runeindex(b[0].ptr, b[0].nrune), (char*)b[1].ptr);
144 b822e0d8 2003-09-30 devnull b[0].wid += b[1].wid;
145 b822e0d8 2003-09-30 devnull b[0].nrune += b[1].nrune;
146 b822e0d8 2003-09-30 devnull _frdelbox(f, bn+1, bn+1);
147 b822e0d8 2003-09-30 devnull }
148 b822e0d8 2003-09-30 devnull
149 b822e0d8 2003-09-30 devnull int
150 b822e0d8 2003-09-30 devnull _frfindbox(Frame *f, int bn, ulong p, ulong q) /* find box containing q and put q on a box boundary */
151 b822e0d8 2003-09-30 devnull {
152 b822e0d8 2003-09-30 devnull Frbox *b;
153 b822e0d8 2003-09-30 devnull
154 b822e0d8 2003-09-30 devnull for(b = &f->box[bn]; bn<f->nbox && p+NRUNE(b)<=q; bn++, b++)
155 b822e0d8 2003-09-30 devnull p += NRUNE(b);
156 b822e0d8 2003-09-30 devnull if(p != q)
157 b822e0d8 2003-09-30 devnull _frsplitbox(f, bn++, (int)(q-p));
158 b822e0d8 2003-09-30 devnull return bn;
159 b822e0d8 2003-09-30 devnull }