1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "draw.h"
3*37da2899SCharles.Forsyth #include "tk.h"
4*37da2899SCharles.Forsyth #include "textw.h"
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsyth #define istring u.string
7*37da2899SCharles.Forsyth #define iwin u.win
8*37da2899SCharles.Forsyth #define imark u.mark
9*37da2899SCharles.Forsyth #define iline u.line
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsyth static char* tktmarkgravity(Tk*, char*, char**);
12*37da2899SCharles.Forsyth static char* tktmarknames(Tk*, char*, char**);
13*37da2899SCharles.Forsyth static char* tktmarknext(Tk*, char*, char**);
14*37da2899SCharles.Forsyth static char* tktmarkprevious(Tk*, char*, char**);
15*37da2899SCharles.Forsyth static char* tktmarkset(Tk*, char*, char**);
16*37da2899SCharles.Forsyth static char* tktmarkunset(Tk*, char*, char**);
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsyth TkCmdtab
19*37da2899SCharles.Forsyth tktmarkcmd[] =
20*37da2899SCharles.Forsyth {
21*37da2899SCharles.Forsyth "gravity", tktmarkgravity,
22*37da2899SCharles.Forsyth "names", tktmarknames,
23*37da2899SCharles.Forsyth "next", tktmarknext,
24*37da2899SCharles.Forsyth "previous", tktmarkprevious,
25*37da2899SCharles.Forsyth "set", tktmarkset,
26*37da2899SCharles.Forsyth "unset", tktmarkunset,
27*37da2899SCharles.Forsyth nil
28*37da2899SCharles.Forsyth };
29*37da2899SCharles.Forsyth
30*37da2899SCharles.Forsyth char*
tktaddmarkinfo(TkText * tkt,char * name,TkTmarkinfo ** ret)31*37da2899SCharles.Forsyth tktaddmarkinfo(TkText *tkt, char *name, TkTmarkinfo **ret)
32*37da2899SCharles.Forsyth {
33*37da2899SCharles.Forsyth TkTmarkinfo *mi;
34*37da2899SCharles.Forsyth
35*37da2899SCharles.Forsyth mi = malloc(sizeof(TkTmarkinfo));
36*37da2899SCharles.Forsyth if(mi == nil)
37*37da2899SCharles.Forsyth return TkNomem;
38*37da2899SCharles.Forsyth
39*37da2899SCharles.Forsyth mi->name = strdup(name);
40*37da2899SCharles.Forsyth if(mi->name == nil) {
41*37da2899SCharles.Forsyth free(mi);
42*37da2899SCharles.Forsyth return TkNomem;
43*37da2899SCharles.Forsyth }
44*37da2899SCharles.Forsyth mi->gravity = Tkright;
45*37da2899SCharles.Forsyth mi->cur = nil;
46*37da2899SCharles.Forsyth mi->next = tkt->marks;
47*37da2899SCharles.Forsyth tkt->marks = mi;
48*37da2899SCharles.Forsyth *ret = mi;
49*37da2899SCharles.Forsyth return nil;
50*37da2899SCharles.Forsyth }
51*37da2899SCharles.Forsyth
52*37da2899SCharles.Forsyth void
tktfreemarks(TkTmarkinfo * m)53*37da2899SCharles.Forsyth tktfreemarks(TkTmarkinfo *m)
54*37da2899SCharles.Forsyth {
55*37da2899SCharles.Forsyth TkTmarkinfo *n;
56*37da2899SCharles.Forsyth
57*37da2899SCharles.Forsyth while(m != nil) {
58*37da2899SCharles.Forsyth n = m->next;
59*37da2899SCharles.Forsyth free(m->name);
60*37da2899SCharles.Forsyth free(m);
61*37da2899SCharles.Forsyth m = n;
62*37da2899SCharles.Forsyth }
63*37da2899SCharles.Forsyth }
64*37da2899SCharles.Forsyth
65*37da2899SCharles.Forsyth TkTmarkinfo *
tktfindmark(TkTmarkinfo * m,char * name)66*37da2899SCharles.Forsyth tktfindmark(TkTmarkinfo *m, char *name)
67*37da2899SCharles.Forsyth {
68*37da2899SCharles.Forsyth while(m != nil) {
69*37da2899SCharles.Forsyth if(strcmp(m->name, name) == 0)
70*37da2899SCharles.Forsyth return m;
71*37da2899SCharles.Forsyth m = m->next;
72*37da2899SCharles.Forsyth }
73*37da2899SCharles.Forsyth return nil;
74*37da2899SCharles.Forsyth }
75*37da2899SCharles.Forsyth
76*37da2899SCharles.Forsyth int
tktmarkind(Tk * tk,char * name,TkTindex * ans)77*37da2899SCharles.Forsyth tktmarkind(Tk *tk, char *name, TkTindex *ans)
78*37da2899SCharles.Forsyth {
79*37da2899SCharles.Forsyth TkTmarkinfo *mk;
80*37da2899SCharles.Forsyth TkText *tkt = TKobj(TkText, tk);
81*37da2899SCharles.Forsyth
82*37da2899SCharles.Forsyth if(strcmp(name, "current") == 0) {
83*37da2899SCharles.Forsyth tktxyind(tk, tkt->current.x, tkt->current.y, ans);
84*37da2899SCharles.Forsyth return 1;
85*37da2899SCharles.Forsyth }
86*37da2899SCharles.Forsyth
87*37da2899SCharles.Forsyth mk = tktfindmark(tkt->marks, name);
88*37da2899SCharles.Forsyth if(mk == nil || mk->cur == nil)
89*37da2899SCharles.Forsyth return 0;
90*37da2899SCharles.Forsyth
91*37da2899SCharles.Forsyth ans->item = mk->cur;
92*37da2899SCharles.Forsyth ans->line = tktitemline(ans->item);
93*37da2899SCharles.Forsyth ans->pos = 0;
94*37da2899SCharles.Forsyth return 1;
95*37da2899SCharles.Forsyth }
96*37da2899SCharles.Forsyth
97*37da2899SCharles.Forsyth char*
tktmarkparse(Tk * tk,char ** parg,TkTmarkinfo ** ret)98*37da2899SCharles.Forsyth tktmarkparse(Tk *tk, char **parg, TkTmarkinfo **ret)
99*37da2899SCharles.Forsyth {
100*37da2899SCharles.Forsyth char *e, *buf;
101*37da2899SCharles.Forsyth TkText *tkt = TKobj(TkText, tk);
102*37da2899SCharles.Forsyth
103*37da2899SCharles.Forsyth buf = mallocz(Tkmaxitem, 0);
104*37da2899SCharles.Forsyth if(buf == nil)
105*37da2899SCharles.Forsyth return TkNomem;
106*37da2899SCharles.Forsyth
107*37da2899SCharles.Forsyth *parg = tkword(tk->env->top, *parg, buf, buf+Tkmaxitem, nil);
108*37da2899SCharles.Forsyth if(*buf == '\0') {
109*37da2899SCharles.Forsyth free(buf);
110*37da2899SCharles.Forsyth return TkOparg;
111*37da2899SCharles.Forsyth }
112*37da2899SCharles.Forsyth
113*37da2899SCharles.Forsyth *ret = tktfindmark(tkt->marks, buf);
114*37da2899SCharles.Forsyth if(*ret == nil) {
115*37da2899SCharles.Forsyth e = tktaddmarkinfo(tkt, buf, ret);
116*37da2899SCharles.Forsyth if(e != nil) {
117*37da2899SCharles.Forsyth free(buf);
118*37da2899SCharles.Forsyth return e;
119*37da2899SCharles.Forsyth }
120*37da2899SCharles.Forsyth }
121*37da2899SCharles.Forsyth free(buf);
122*37da2899SCharles.Forsyth
123*37da2899SCharles.Forsyth return nil;
124*37da2899SCharles.Forsyth }
125*37da2899SCharles.Forsyth
126*37da2899SCharles.Forsyth /*
127*37da2899SCharles.Forsyth * Insert mark before ixnew, first removing it from old place, if any.
128*37da2899SCharles.Forsyth * Make sure ixnew continues to point after mark.
129*37da2899SCharles.Forsyth */
130*37da2899SCharles.Forsyth char*
tktmarkmove(Tk * tk,TkTmarkinfo * m,TkTindex * ixnew)131*37da2899SCharles.Forsyth tktmarkmove(Tk *tk, TkTmarkinfo *m, TkTindex *ixnew)
132*37da2899SCharles.Forsyth {
133*37da2899SCharles.Forsyth char *e;
134*37da2899SCharles.Forsyth int deleted, split;
135*37da2899SCharles.Forsyth TkTitem *i;
136*37da2899SCharles.Forsyth TkTindex ix, pix;
137*37da2899SCharles.Forsyth TkText *tkt = TKobj(TkText, tk);
138*37da2899SCharles.Forsyth
139*37da2899SCharles.Forsyth deleted = 0;
140*37da2899SCharles.Forsyth if(m->cur != nil) {
141*37da2899SCharles.Forsyth if(m->cur == ixnew->item)
142*37da2899SCharles.Forsyth return nil;
143*37da2899SCharles.Forsyth ix.item = m->cur;
144*37da2899SCharles.Forsyth ix.line = tktitemline(m->cur);
145*37da2899SCharles.Forsyth ix.pos = 0;
146*37da2899SCharles.Forsyth tktremitem(tkt, &ix);
147*37da2899SCharles.Forsyth deleted = 1;
148*37da2899SCharles.Forsyth }
149*37da2899SCharles.Forsyth
150*37da2899SCharles.Forsyth /* XXX - Tad: memory leak on 'i' if something fails later? */
151*37da2899SCharles.Forsyth e = tktnewitem(TkTmark, 0, &i);
152*37da2899SCharles.Forsyth if(e != nil)
153*37da2899SCharles.Forsyth return e;
154*37da2899SCharles.Forsyth
155*37da2899SCharles.Forsyth i->imark = m;
156*37da2899SCharles.Forsyth m->cur = i;
157*37da2899SCharles.Forsyth
158*37da2899SCharles.Forsyth /* keep adjacent marks sorted: all rights, then all lefts */
159*37da2899SCharles.Forsyth if(m->gravity == Tkright) {
160*37da2899SCharles.Forsyth while(ixnew->item->kind == TkTmark && ixnew->item->imark->gravity == Tkleft)
161*37da2899SCharles.Forsyth if(!tktadjustind(tkt, TkTbyitem, ixnew))
162*37da2899SCharles.Forsyth break;
163*37da2899SCharles.Forsyth }
164*37da2899SCharles.Forsyth else {
165*37da2899SCharles.Forsyth for(;;) {
166*37da2899SCharles.Forsyth pix = *ixnew;
167*37da2899SCharles.Forsyth if(!tktadjustind(tkt, TkTbyitemback, &pix))
168*37da2899SCharles.Forsyth break;
169*37da2899SCharles.Forsyth if(pix.item->kind == TkTmark && pix.item->imark->gravity == Tkright)
170*37da2899SCharles.Forsyth *ixnew = pix;
171*37da2899SCharles.Forsyth else
172*37da2899SCharles.Forsyth break;
173*37da2899SCharles.Forsyth }
174*37da2899SCharles.Forsyth }
175*37da2899SCharles.Forsyth
176*37da2899SCharles.Forsyth split = (ixnew->pos > 0);
177*37da2899SCharles.Forsyth e = tktsplititem(ixnew);
178*37da2899SCharles.Forsyth if(e != nil)
179*37da2899SCharles.Forsyth return e;
180*37da2899SCharles.Forsyth
181*37da2899SCharles.Forsyth e = tktiteminsert(tkt, ixnew, i);
182*37da2899SCharles.Forsyth if(e != nil)
183*37da2899SCharles.Forsyth return nil;
184*37da2899SCharles.Forsyth
185*37da2899SCharles.Forsyth if(strcmp(m->name, "insert") == 0 || split) {
186*37da2899SCharles.Forsyth if(deleted && ix.line != ixnew->line) {
187*37da2899SCharles.Forsyth tktfixgeom(tk, tktprevwrapline(tk, ix.line), ix.line, 0);
188*37da2899SCharles.Forsyth /*
189*37da2899SCharles.Forsyth * this is ok only because tktfixgeom cannot
190*37da2899SCharles.Forsyth * free mark items, and we know that i is a mark item.
191*37da2899SCharles.Forsyth */
192*37da2899SCharles.Forsyth ixnew->item = i;
193*37da2899SCharles.Forsyth ixnew->line = tktitemline(i);
194*37da2899SCharles.Forsyth ixnew->pos = 0;
195*37da2899SCharles.Forsyth }
196*37da2899SCharles.Forsyth tktfixgeom(tk, tktprevwrapline(tk, ixnew->line), ixnew->line, 0);
197*37da2899SCharles.Forsyth tktextsize(tk, 1);
198*37da2899SCharles.Forsyth }
199*37da2899SCharles.Forsyth
200*37da2899SCharles.Forsyth ixnew->item = i;
201*37da2899SCharles.Forsyth ixnew->line = tktitemline(i);
202*37da2899SCharles.Forsyth ixnew->pos = 0;
203*37da2899SCharles.Forsyth return nil;
204*37da2899SCharles.Forsyth }
205*37da2899SCharles.Forsyth
206*37da2899SCharles.Forsyth /* Text Mark Commands (+ means implemented)
207*37da2899SCharles.Forsyth +gravity
208*37da2899SCharles.Forsyth +names
209*37da2899SCharles.Forsyth +next
210*37da2899SCharles.Forsyth +previous
211*37da2899SCharles.Forsyth +set
212*37da2899SCharles.Forsyth +unset
213*37da2899SCharles.Forsyth */
214*37da2899SCharles.Forsyth
215*37da2899SCharles.Forsyth static char*
tktmarkgravity(Tk * tk,char * arg,char ** val)216*37da2899SCharles.Forsyth tktmarkgravity(Tk *tk, char *arg, char **val)
217*37da2899SCharles.Forsyth {
218*37da2899SCharles.Forsyth char *e;
219*37da2899SCharles.Forsyth TkTmarkinfo *m;
220*37da2899SCharles.Forsyth char *buf;
221*37da2899SCharles.Forsyth
222*37da2899SCharles.Forsyth e = tktmarkparse(tk, &arg, &m);
223*37da2899SCharles.Forsyth if(e != nil)
224*37da2899SCharles.Forsyth return e;
225*37da2899SCharles.Forsyth
226*37da2899SCharles.Forsyth if(*arg == '\0')
227*37da2899SCharles.Forsyth return tkvalue(val, (m->gravity & Tkleft)? "left" : "right");
228*37da2899SCharles.Forsyth else {
229*37da2899SCharles.Forsyth buf = mallocz(Tkmaxitem, 0);
230*37da2899SCharles.Forsyth if(buf == nil)
231*37da2899SCharles.Forsyth return TkNomem;
232*37da2899SCharles.Forsyth tkword(tk->env->top, arg, buf, buf+Tkmaxitem, nil);
233*37da2899SCharles.Forsyth if(strcmp(buf, "left") == 0)
234*37da2899SCharles.Forsyth m->gravity = Tkleft;
235*37da2899SCharles.Forsyth else
236*37da2899SCharles.Forsyth if(strcmp(buf, "right") == 0)
237*37da2899SCharles.Forsyth m->gravity = Tkright;
238*37da2899SCharles.Forsyth else {
239*37da2899SCharles.Forsyth free(buf);
240*37da2899SCharles.Forsyth return TkBadcm;
241*37da2899SCharles.Forsyth }
242*37da2899SCharles.Forsyth free(buf);
243*37da2899SCharles.Forsyth }
244*37da2899SCharles.Forsyth return nil;
245*37da2899SCharles.Forsyth }
246*37da2899SCharles.Forsyth
247*37da2899SCharles.Forsyth static char*
tktmarknames(Tk * tk,char * arg,char ** val)248*37da2899SCharles.Forsyth tktmarknames(Tk *tk, char *arg, char **val)
249*37da2899SCharles.Forsyth {
250*37da2899SCharles.Forsyth char *r, *fmt;
251*37da2899SCharles.Forsyth TkTmarkinfo *m;
252*37da2899SCharles.Forsyth TkText *tkt = TKobj(TkText, tk);
253*37da2899SCharles.Forsyth
254*37da2899SCharles.Forsyth USED(arg);
255*37da2899SCharles.Forsyth
256*37da2899SCharles.Forsyth fmt = "%s";
257*37da2899SCharles.Forsyth for(m = tkt->marks; m != nil; m = m->next) {
258*37da2899SCharles.Forsyth r = tkvalue(val, fmt, m->name);
259*37da2899SCharles.Forsyth if(r != nil)
260*37da2899SCharles.Forsyth return r;
261*37da2899SCharles.Forsyth fmt = " %s";
262*37da2899SCharles.Forsyth }
263*37da2899SCharles.Forsyth return nil;
264*37da2899SCharles.Forsyth }
265*37da2899SCharles.Forsyth
266*37da2899SCharles.Forsyth static char*
tktmarknext(Tk * tk,char * arg,char ** val)267*37da2899SCharles.Forsyth tktmarknext(Tk *tk, char *arg, char **val)
268*37da2899SCharles.Forsyth {
269*37da2899SCharles.Forsyth char *e;
270*37da2899SCharles.Forsyth TkTmarkinfo *mix;
271*37da2899SCharles.Forsyth TkTindex ix, ixend;
272*37da2899SCharles.Forsyth TkText *tkt = TKobj(TkText, tk);
273*37da2899SCharles.Forsyth
274*37da2899SCharles.Forsyth /* special behavior if specified index is a mark name */
275*37da2899SCharles.Forsyth mix = tktfindmark(tkt->marks, arg);
276*37da2899SCharles.Forsyth
277*37da2899SCharles.Forsyth e = tktindparse(tk, &arg, &ix);
278*37da2899SCharles.Forsyth if(e != nil)
279*37da2899SCharles.Forsyth return e;
280*37da2899SCharles.Forsyth
281*37da2899SCharles.Forsyth if(mix != nil)
282*37da2899SCharles.Forsyth tktadjustind(tkt, TkTbyitem, &ix);
283*37da2899SCharles.Forsyth
284*37da2899SCharles.Forsyth /* special behavior if index is 'end' */
285*37da2899SCharles.Forsyth tktendind(tkt, &ixend);
286*37da2899SCharles.Forsyth if(tktindcompare(tkt, &ix, TkEq, &ixend)) {
287*37da2899SCharles.Forsyth do {
288*37da2899SCharles.Forsyth tktadjustind(tkt, TkTbyitemback, &ix);
289*37da2899SCharles.Forsyth } while(ix.item->kind == TkTmark);
290*37da2899SCharles.Forsyth }
291*37da2899SCharles.Forsyth
292*37da2899SCharles.Forsyth do {
293*37da2899SCharles.Forsyth if(ix.item->kind == TkTmark)
294*37da2899SCharles.Forsyth return tkvalue(val, "%s", ix.item->imark->name);
295*37da2899SCharles.Forsyth
296*37da2899SCharles.Forsyth } while(tktadjustind(tkt, TkTbyitem, &ix));
297*37da2899SCharles.Forsyth
298*37da2899SCharles.Forsyth return nil;
299*37da2899SCharles.Forsyth }
300*37da2899SCharles.Forsyth
301*37da2899SCharles.Forsyth static char*
tktmarkprevious(Tk * tk,char * arg,char ** val)302*37da2899SCharles.Forsyth tktmarkprevious(Tk *tk, char *arg, char **val)
303*37da2899SCharles.Forsyth {
304*37da2899SCharles.Forsyth char *e;
305*37da2899SCharles.Forsyth TkTindex ix;
306*37da2899SCharles.Forsyth TkText *tkt = TKobj(TkText, tk);
307*37da2899SCharles.Forsyth
308*37da2899SCharles.Forsyth e = tktindparse(tk, &arg, &ix);
309*37da2899SCharles.Forsyth if(e != nil)
310*37da2899SCharles.Forsyth return e;
311*37da2899SCharles.Forsyth
312*37da2899SCharles.Forsyth while(tktadjustind(tkt, TkTbyitemback, &ix)) {
313*37da2899SCharles.Forsyth if(ix.item->kind == TkTmark)
314*37da2899SCharles.Forsyth return tkvalue(val, "%s", ix.item->imark->name);
315*37da2899SCharles.Forsyth }
316*37da2899SCharles.Forsyth
317*37da2899SCharles.Forsyth return nil;
318*37da2899SCharles.Forsyth }
319*37da2899SCharles.Forsyth
320*37da2899SCharles.Forsyth /* XXX - Tad: possible memory leak here */
321*37da2899SCharles.Forsyth static char*
tktmarkset(Tk * tk,char * arg,char ** val)322*37da2899SCharles.Forsyth tktmarkset(Tk *tk, char *arg, char **val)
323*37da2899SCharles.Forsyth {
324*37da2899SCharles.Forsyth char *e;
325*37da2899SCharles.Forsyth TkTmarkinfo *m;
326*37da2899SCharles.Forsyth TkTindex ixnew;
327*37da2899SCharles.Forsyth
328*37da2899SCharles.Forsyth USED(val);
329*37da2899SCharles.Forsyth
330*37da2899SCharles.Forsyth e = tktmarkparse(tk, &arg, &m);
331*37da2899SCharles.Forsyth if(e != nil)
332*37da2899SCharles.Forsyth return e;
333*37da2899SCharles.Forsyth e = tktindparse(tk, &arg, &ixnew);
334*37da2899SCharles.Forsyth if(e != nil)
335*37da2899SCharles.Forsyth return e;
336*37da2899SCharles.Forsyth
337*37da2899SCharles.Forsyth return tktmarkmove(tk, m, &ixnew);
338*37da2899SCharles.Forsyth }
339*37da2899SCharles.Forsyth
340*37da2899SCharles.Forsyth static char*
tktmarkunset(Tk * tk,char * arg,char ** val)341*37da2899SCharles.Forsyth tktmarkunset(Tk *tk, char *arg, char **val)
342*37da2899SCharles.Forsyth {
343*37da2899SCharles.Forsyth TkText *tkt;
344*37da2899SCharles.Forsyth TkTmarkinfo *m, **p;
345*37da2899SCharles.Forsyth TkTindex ix;
346*37da2899SCharles.Forsyth char *e;
347*37da2899SCharles.Forsyth int resize;
348*37da2899SCharles.Forsyth
349*37da2899SCharles.Forsyth USED(val);
350*37da2899SCharles.Forsyth
351*37da2899SCharles.Forsyth tkt = TKobj(TkText, tk);
352*37da2899SCharles.Forsyth
353*37da2899SCharles.Forsyth e = tktmarkparse(tk, &arg, &m);
354*37da2899SCharles.Forsyth if(e != nil)
355*37da2899SCharles.Forsyth return e;
356*37da2899SCharles.Forsyth
357*37da2899SCharles.Forsyth resize = 0;
358*37da2899SCharles.Forsyth while(m != nil) {
359*37da2899SCharles.Forsyth if(strcmp(m->name, "insert") == 0 || strcmp(m->name, "current") == 0)
360*37da2899SCharles.Forsyth return TkBadvl;
361*37da2899SCharles.Forsyth
362*37da2899SCharles.Forsyth if(m->cur != nil) {
363*37da2899SCharles.Forsyth ix.item = m->cur;
364*37da2899SCharles.Forsyth ix.line = tktitemline(m->cur);
365*37da2899SCharles.Forsyth ix.pos = 0;
366*37da2899SCharles.Forsyth tktremitem(tkt, &ix);
367*37da2899SCharles.Forsyth tktfixgeom(tk, tktprevwrapline(tk, ix.line), ix.line, 0);
368*37da2899SCharles.Forsyth resize = 1;
369*37da2899SCharles.Forsyth }
370*37da2899SCharles.Forsyth
371*37da2899SCharles.Forsyth for(p = &tkt->marks; *p != nil; p = &(*p)->next) {
372*37da2899SCharles.Forsyth if(*p == m) {
373*37da2899SCharles.Forsyth *p = m->next;
374*37da2899SCharles.Forsyth break;
375*37da2899SCharles.Forsyth }
376*37da2899SCharles.Forsyth }
377*37da2899SCharles.Forsyth m->next = nil;
378*37da2899SCharles.Forsyth tktfreemarks(m);
379*37da2899SCharles.Forsyth
380*37da2899SCharles.Forsyth if(*arg != '\0') {
381*37da2899SCharles.Forsyth e = tktmarkparse(tk, &arg, &m);
382*37da2899SCharles.Forsyth if(e != nil)
383*37da2899SCharles.Forsyth return e;
384*37da2899SCharles.Forsyth }
385*37da2899SCharles.Forsyth else
386*37da2899SCharles.Forsyth m = nil;
387*37da2899SCharles.Forsyth }
388*37da2899SCharles.Forsyth if (resize)
389*37da2899SCharles.Forsyth tktextsize(tk, 1);
390*37da2899SCharles.Forsyth return nil;
391*37da2899SCharles.Forsyth }
392*37da2899SCharles.Forsyth
393