xref: /inferno-os/include/tk.h (revision 2b69dba5038ffd0b59cf30a4c44bce549e5097f8)
1 /*
2  * Here are some conventions about  our Tk widgets.
3  *
4  * When a widget is packed, its act geom record is
5  * set so that act.{x,y} is the vector from the containing
6  * widget's origin to the position of this widget.  The position
7  * is the place just outside the top-left border.  The origin
8  * is the place just inside the top-left border.
9  * act.{width,height} gives the allocated dimensions inside
10  * the border --- it will be the requested width or height
11  * plus ipad{x,y} plus any filling done by the packer.
12  *
13  * The tkposn function returns the origin of its argument
14  * widget, expressed in absolute screen coordinates.
15  *
16  * The actual drawing contents of the widget should be
17  * drawn at an internal origin that is the widget's origin
18  * plus the ipad vector.
19  */
20 
21 /*
22  * event printing
23  */
24 #pragma	varargck	type	"v"	int
25 #pragma	varargck	argpos	tkwreq	2
26 
27 enum
28 {
29 	TKframe,		/* Widget type */
30 	TKlabel,
31 	TKcheckbutton,
32 	TKbutton,
33 	TKmenubutton,
34 	TKmenu,
35 	TKseparator,
36 	TKcascade,
37 	TKlistbox,
38 	TKscrollbar,
39 	TKtext,
40 	TKcanvas,
41 	TKentry,
42 	TKradiobutton,
43 	TKscale,
44 	TKpanel,
45 	TKchoicebutton,
46 	TKwidgets,
47 
48 	TKsingle	= 0,	/* Select mode */
49 	TKbrowse,
50 	TKmultiple,
51 	TKextended,
52 
53 	TKraised,		/* Relief */
54 	TKsunken,
55 	TKflat,
56 	TKgroove,
57 	TKridge,
58 
59 	TkArepl		= 0,	/* Bind options */
60 	TkAadd,
61 	TkAsub,
62 
63 	Tkvertical	= 0,	/* Scroll bar orientation */
64 	Tkhorizontal,
65 
66 	Tkwrapnone	= 0,	/* Wrap mode */
67 	Tkwrapword,
68 	Tkwrapchar,
69 
70 	TkDdelivered	= 0,	/* Event Delivery results */
71 	TkDbreak,
72 	TkDnone,
73 
74 	TkLt = 0,		/* Comparison operators */
75 	TkLte,
76 	TkEq,
77 	TkGte,
78 	TkGt,
79 	TkNeq,
80 
81 
82 	OPTdist		= 0,	/* Distance; aux is offset of TkEnv* */
83 	OPTstab,		/* String->Constant table; aux is TkStab array */
84 	OPTtext,		/* Text string */
85 	OPTwinp,		/* Window Path to Tk ptr */
86 	OPTflag,		/* Option sets bitmask; aux is TkStab array*/
87 	OPTbmap,		/* Option specifies bitmap file */
88 	OPTbool,		/* Set to one if option present */
89 	OPTfont,		/* Env font */
90 	OPTfrac,		/* list of fixed point distances (count in aux) */
91 	OPTnnfrac,	/* non-negative fixed point distance */
92 	OPTctag,		/* Tag list for canvas item */
93 	OPTtabs,		/* Tab stops; aux is offset of TkEnv* */
94 	OPTcolr,		/* Colors; aux is index into colour table */
95 	OPTimag,		/* Image */
96 	OPTsize,		/* width/height; aux is offset of TkEnv* */
97 	OPTnndist,		/* Non-negative distance */
98 	OPTact,		/* actx or acty */
99 	OPTignore,	/* ignore this option */
100 	OPTsticky,	/* sticky (any comb. of chars n, s, e, w) */
101 	OPTlist,		/* list of text values */
102 	OPTflags,		/* more than one OPTflag */
103 
104 	BoolX		= 0,
105 	BoolT,
106 	BoolF,
107 
108 	Tkmaxitem	= 128,
109 	Tkminitem	= 32,
110 	Tkcvstextins	= 1024,
111 	Tkmaxdump	= 1024,
112 	Tkentryins	= 128,
113 	TkMaxmsgs	= 100,
114 	Tkshdelta	= 0x40,	/* color intensity delta for shading */
115 
116 	Tkfpscalar	= 10000,	/* Fixed point scale factor */
117 
118 	Tkdpi		= 100,	/* pixels per inch on an average display */
119 
120 	Tksweep		= 64,	/* binds before a sweep */
121 
122 	TkColcachesize = 128,	/* colours cached per context (display) */
123 
124 	TkStatic	= 0,
125 	TkDynamic	= 1,
126 
127 	TkRptclick		= 100,	/* granularity */
128 	TkRptpause	= 300,	/* autorepeat inital delay */
129 	TkRptinterval	= 100,	/* autorepeat interval */
130 
131 	TkBlinkinterval	= 500
132 };
133 
134 #define TKSTRUCTALIGN	4
135 #define TKI2F(i)	((i)*Tkfpscalar)
136 extern	int TKF2I(int);
137 /*#define TKF2I(f)	(((f) + Tkfpscalar/2)/Tkfpscalar)*/
138 #define IAUX(i)		((void*)i)
139 #define AUXI(i)		((int)i)
140 #define TKKEY(i)	((i)&0xFFFF)
141 
142 typedef struct Tk Tk;
143 typedef struct TkCol TkCol;
144 typedef struct TkCtxt TkCtxt;
145 typedef struct TkEnv TkEnv;
146 typedef struct TkName TkName;
147 typedef struct TkTtabstop TkTtabstop;
148 typedef struct TkOptab TkOptab;
149 typedef struct TkOption TkOption;
150 typedef struct TkStab TkStab;
151 typedef struct TkTop TkTop;
152 typedef struct TkGeom TkGeom;
153 typedef struct TkMethod TkMethod;
154 typedef struct TkAction TkAction;
155 typedef struct TkWin TkWin;
156 typedef struct TkCmdtab TkCmdtab;
157 typedef struct TkMemimage TkMemimage;
158 typedef struct TkMouse TkMouse;
159 typedef struct TkVar TkVar;
160 typedef struct TkMsg TkMsg;
161 typedef struct TkEbind TkEbind;
162 typedef struct TkImg TkImg;
163 typedef struct TkPanelimage TkPanelimage;
164 typedef struct TkWinfo TkWinfo;
165 typedef struct TkCursor TkCursor;
166 typedef struct TkGrid TkGrid;
167 typedef struct TkGridbeam TkGridbeam;
168 typedef struct TkGridcell TkGridcell;
169 
170 #pragma incomplete TkCol
171 
172 struct TkImg
173 {
174 	TkTop*	top;
175 	int	ref;
176 	int	type;
177 	int	w;
178 	int	h;
179 	TkEnv*	env;
180 	Image*	img;
181 	TkImg*	link;
182 	TkName*	name;
183 	char *cursor;
184 };
185 
186 struct TkCursor
187 {
188 	int	def;
189 	Point	p;
190 	Image*	bit;
191 	TkImg*	img;
192 };
193 
194 struct TkEbind
195 {
196 	int	event;
197 	char*	cmd;
198 };
199 
200 struct TkMsg
201 {
202 	TkVar*	var;
203 	TkMsg*	link;
204 	char	msg[TKSTRUCTALIGN];
205 };
206 
207 enum
208 {
209 	TkVchan		= 1,
210 	TkVstring,
211 };
212 
213 struct TkVar
214 {
215 	int	type;
216 	TkVar*	link;
217 	void*	value;
218 	char	name[TKSTRUCTALIGN];
219 };
220 
221 struct TkPanelimage
222 {
223 	void*		image;		/* Image paired with Draw_Image: see lookupimage in libinterp/draw.c */
224 	int			ref;
225 	TkPanelimage*	link;
226 };
227 
228 struct TkMouse
229 {
230 	int		x;
231 	int		y;
232 	int		b;
233 };
234 
235 struct TkMemimage
236 {
237 	Rectangle	r;
238 	ulong	chans;
239 	uchar*	data;
240 };
241 
242 struct TkCmdtab
243 {
244 	char*		name;
245 	char*		(*fn)(Tk*, char*, char**);
246 };
247 
248 struct TkWinfo
249 {
250 	Tk*		w;
251 	Rectangle	r;
252 };
253 
254 struct TkAction
255 {
256 	int		event;
257 	int		type;
258 	char*		arg;
259 	TkAction*	link;
260 };
261 
262 struct TkStab
263 {
264 	char*		val;
265 	int		con;
266 };
267 
268 struct TkOption
269 {
270 	char*		o;
271 	int		type;
272 	int		offset;
273 	void*		aux;
274 };
275 
276 struct TkOptab
277 {
278 	void*		ptr;
279 	TkOption*	optab;
280 };
281 
282 enum
283 {
284 	/* Widget Control Bits */
285 	Tktop		= (1<<0),
286 	Tkbottom	= (1<<1),
287 	Tkleft		= (1<<2),
288 	Tkright		= (1<<3),
289 	Tkside		= Tktop|Tkbottom|Tkleft|Tkright,
290 	Tkfillx		= (1<<4),
291 	Tkfilly		= (1<<5),
292 	Tkfill		= Tkfillx|Tkfilly,
293 	Tkexpand	= (1<<6),
294 	Tkrefresh	= (1<<7),
295 	Tknoprop	= (1<<8),
296 	Tkbaseline 	= (1<<10),
297 	Tknumeric	= (1<<11),
298 
299 	Tknorth		= (1<<10),
300 	Tkeast		= (1<<11),
301 	Tksouth		= (1<<12),
302 	Tkwest		= (1<<13),
303 	Tkcenter		= 0,
304 	Tkanchor	= Tknorth|Tkeast|Tksouth|Tkwest,
305 	Tksuspended	= (1<<14),		/* window suspended pending resize */
306 
307 	Tkgridpack	= (1<<17),		/* temporary flag marking addition to grid */
308 	Tkgridremove	= (1<<18),		/* marked for removal from grid */
309 	Tktakefocus	= (1<<19),
310 	Tktransparent		= (1<<20),	/* Doesn't entirely obscure its background */
311 	Tkwindow	= (1<<21),	/* Top level window */
312 	Tkactive		= (1<<22),	/* Pointer is over active object */
313 	Tkactivated	= (1<<23),	/* Button pressed etc.. */
314 	Tkdisabled	= (1<<24),	/* Button is not accepting events */
315 	Tkmapped	= (1<<25),	/* Mapped onto display */
316 	Tknograb		= (1<<26),
317 	Tkdestroy		= (1<<27),	/* Marked for death */
318 	Tksetwidth	= (1<<28),
319 	Tksetheight	= (1<<29),
320 	Tksubsub	= (1<<30),
321 	Tkswept		= (1<<31),
322 
323 	/* Supported Event Types 		*/
324 	/*
325 	 * Bits 0-15 are keyboard characters
326 	 * but duplicated by other events, as we can distinguish
327 	 * key events from others with the TkKey bit.
328 	 * N.B. make sure that this distinction *is* made;
329 	 * i.e.
330 	 *	if (event & TkButton1P)
331 	 *   is no longer sufficient to test for button1 down.
332 	 *
333 	 * 	if (!(event & TkKey) && (event & TkButton1P))
334 	 *   would be better.
335 	 */
336 	TkButton1P	= (1<<0),
337 	TkButton1R	= (1<<1),
338 	TkButton2P	= (1<<2),
339 	TkButton2R	= (1<<3),
340 	TkButton3P	= (1<<4),
341 	TkButton3R	= (1<<5),
342 	TkButton4P	= (1<<6),
343 	TkButton4R	= (1<<7),
344 	TkButton5P	= (1<<8),
345 	TkButton5R	= (1<<9),
346 	TkButton6P	= (1<<10),
347 	TkButton6R	= (1<<11),
348 	/*
349 	 * 12-15 reserved for more buttons.
350 	 */
351 	TkExtn1		= (1<<16),
352 	TkExtn2		= (1<<17),
353 	TkTakefocus	= (1<<18),
354 	/*
355 	 * 19-20 currently free
356 	 */
357 	TkDestroy		= (1<< 21),
358 	TkEnter		= (1<<22),
359 	TkLeave		= (1<<23),
360 	TkMotion	= (1<<24),
361 	TkMap		= (1<<25),
362 	TkUnmap		= (1<<26),
363 	TkKey		= (1<<27),
364 	TkFocusin	= (1<<28),
365 	TkFocusout	= (1<<29),
366 	TkConfigure	= (1<<30),
367 	TkDouble	= (1<<31),
368 	TkEmouse	= TkButton1P|TkButton1R|TkButton2P|TkButton2R|
369 			TkButton3P|TkButton3R|
370 			TkButton4P|TkButton4R|
371 			TkButton5P|TkButton5R|
372 			TkButton6P|TkButton6R|TkMotion,
373 	TkEpress	= TkButton1P|TkButton2P|TkButton3P|
374 			TkButton4P|TkButton5P|TkButton6P,
375 	TkErelease	= TkButton1R|TkButton2R|TkButton3R|
376 					TkButton4R|TkButton5R|TkButton6R,
377 	TkExtns	= TkExtn1|TkExtn2,
378 	TkAllEvents	= ~0,
379 
380 	TkCforegnd	= 0,
381 	TkCbackgnd,			/* group of 3 */
382 	TkCbackgndlght,
383 	TkCbackgnddark,
384 	TkCselect,
385 	TkCselectbgnd,			/* group of 3 */
386 	TkCselectbgndlght,
387 	TkCselectbgnddark,
388 	TkCselectfgnd,
389 	TkCactivebgnd,		/* group of 3 */
390 	TkCactivebgndlght,
391 	TkCactivebgnddark,
392 	TkCactivefgnd,
393 	TkCdisablefgnd,
394 	TkChighlightfgnd,
395 	TkCfill,
396 	TkCtransparent,
397 
398 	TkNcolor,
399 
400 	TkSameshade	= 0,		/* relative shade for tkgshade() and tkrgbashade()*/
401 	TkLightshade,
402 	TkDarkshade
403 };
404 
405 
406 struct TkEnv
407 {
408 	int		ref;
409 	TkTop*		top;			/* Owner */
410 	ulong		set;
411 	ulong		colors[TkNcolor];	/* OPTcolr */
412 	Font*		font;			/* Font description */
413 	int		wzero;			/* Width of "0" in pixel */
414 };
415 
416 struct TkGeom
417 {
418 	int		x;
419 	int		y;
420 	int		width;
421 	int		height;
422 };
423 
424 struct TkGridbeam
425 {
426 	int		equalise;
427 	int		minsize;
428 	int		maxsize;
429 	int		weight;
430 	int		pad;
431 	int		act;
432 	char*	name;
433 };
434 
435 struct TkGridcell
436 {
437 	Tk*		tk;
438 	Point		span;
439 };
440 
441 struct TkGrid
442 {
443 	TkGridcell**	cells;		/* 2D array of cells, y major, x minor */
444 	Point			dim;		/* dimensions of table */
445 	TkGridbeam*	rows;
446 	TkGridbeam*	cols;
447 	Point			origin;	/* top left point grid was rendered at */
448 };
449 
450 struct Tk
451 {
452 	int		type;		/* Widget type */
453 	TkName*		name;		/* Hierarchy name */
454 	Tk*		siblings;	/* Link to descendents */
455 	Tk*		master;		/* Pack owner */
456 	Tk*		slave;		/* Packer slaves */
457 	Tk*		next;		/* Link for packer slaves */
458 	Tk*		parent;		/* Window is sub of this canvas or text */
459 	Tk*		depth;		/* Window depth when mapped */
460 	void		(*geom)(Tk*, int, int, int, int);		/* Geometry change notify function */
461 	void		(*destroyed)(Tk*);		/* Destroy notify function */
462 	int		flag;		/* Misc flags. */
463 	TkEnv*		env;		/* Colors & fonts */
464 	TkAction*	binds;		/* Binding of current events */
465 
466 	TkGeom		req;		/* Requested size and position */
467 	TkGeom		act;		/* Actual size and position */
468 	int		relief;		/* 3D border type */
469 	int		borderwidth;	/* 3D border size */
470 	int		highlightwidth;
471 	Point		pad;		/* outside frame padding */
472 	Point		ipad;		/* inside frame padding */
473 	Rectangle	dirty;	/* dirty rectangle, relative to widget */
474 	TkGrid*	grid;		/* children are packed in a grid */
475 
476 	/* followed by widget-dependent data */
477 };
478 
479 struct TkWin
480 {
481 	Image*	image;
482 	Tk*		next;
483 	Point		act;
484 	Point		req;
485 	void*	di;		/* !=H if it's been set externally */
486 	int		changed;	/* requested rect has changed since request sent */
487 	int		reqid;	/* id of request most recently sent out; replies to earlier requests are ignored */
488 
489 	/* menu specific members */
490 	Tk*		slave;
491 	char*		postcmd;
492 	char*		cascade;
493 	int			freeonunmap;
494 	char			*cbname;		/* name of choicebutton that posted this */
495 
496 	Point			delta;
497 	int			speed;
498 	int			waiting;
499 };
500 
501 struct TkMethod
502 {
503 	char*		name;
504 	TkCmdtab*	cmd;
505 	void		(*free)(Tk*);
506 	char*	(*draw)(Tk*, Point);
507 	void		(*geom)(Tk*);
508 	void		(*getimgs)(Tk*, Image**, Image**);
509 
510 	void		(*focusorder)(Tk*);	/* add any focusable descendants to the focus order */
511 	void		(*dirtychild)(Tk*);		/* Child notifies parent to redraw */
512 	Point		(*relpos)(Tk*);
513 	Tk*		(*deliver)(Tk*, int, void*);
514 	void		(*see)(Tk*, Rectangle*, Point*);
515 	Tk*		(*inwindow)(Tk*, Point*);
516 	void		(*varchanged)(Tk*, char*, char*);
517 	void		(*forgetsub)(Tk*, Tk*);
518 	int		ncmd;
519 };
520 
521 struct TkName
522 {
523 	TkName*		link;
524 	void*		obj;		/* Name for ... */
525 	union {
526 		TkAction*	binds;
527 	}prop;				/* Properties for ... */
528 	int		ref;
529 	char		name[TKSTRUCTALIGN];
530 };
531 
532 struct TkTtabstop
533 {
534 	int		pos;
535 	int		justify;
536 	TkTtabstop*	next;
537 };
538 
539 struct TkCtxt
540 {
541 	void*	lock;
542 	Display*	display;
543 	int		ncol;
544 	TkCol*	chead;
545 	TkCol*	ctail;
546 	Image*	i;			/* temporary image for drawing buttons, etc */
547 	Image*	ia;			/* as above, but with an alpha channel */
548 	Tk*		tkkeygrab;
549 
550 	int		focused;
551 	Tk*		mfocus;
552 	Tk*		mgrab;
553 	Tk*		entered;
554 	TkMouse	mstate;
555 
556 	Tk*		tkmenu;
557 	void*	extn;
558 };
559 
560 struct TkTop
561 {
562 	void*	dd;	/* really Draw_Display */
563 	void*	wreq;	/* really chan of string */
564 	void*	di;		/* really Draw_Image* */
565 	void*	wmctxt;	/* really Draw_Wmcontext */
566 	Rectangle	screenr;	/* XXX sleazy equiv to Draw_Rect, but what else? */
567 
568 	/* Private from here on */
569 	TkCtxt*		ctxt;
570 	Display*	display;
571 	Tk*		root;			/* list of all objects, linked by siblings; first object is "." */
572 	Tk*		windows;
573 	Tk**		focusorder;
574 	int		nfocus;
575 	TkEnv*		env;
576 	TkTop*		link;
577 	TkVar*		vars;
578 	TkImg*		imgs;
579 	TkPanelimage*	panelimages;
580 	TkAction*	binds[TKwidgets];
581 	int		debug;
582 	int		execdepth;
583 	char		focused;
584 	char		dirty;
585 	char		noupdate;
586 	char*	err;
587 	char		errcmd[32];
588 	char		errx[32];
589 };
590 
591 #define TKobj(t, p)	((t*)((p)+1))
592 //#define TKobj(t, p)	((t*)(p->obj))
593 #define OPTION(p, t, o)	(*(t*)((char*)p + o))
594 
595 /* Command entry points */
596 extern	char*	tkbind(TkTop*, char*, char**);
597 extern	char*	tkbutton(TkTop*, char*, char**);
598 extern	char*	tkcanvas(TkTop*, char*, char**);
599 extern	char*	tkcheckbutton(TkTop*, char*, char**);
600 extern	char*	tkchoicebutton(TkTop*, char*, char**);
601 extern	char*	tkcursorcmd(TkTop*, char*, char**);
602 extern	char*	tkdestroy(TkTop*, char*, char**);
603 extern	char*	tkentry(TkTop*, char*, char**);
604 extern	char*	tkfocus(TkTop*, char*, char**);
605 extern	char*	tkframe(TkTop*, char*, char**);
606 extern	char*	tkgrab(TkTop*, char*, char**);
607 extern	char*	tkgrid(TkTop*, char*, char**);
608 extern	char*	tkimage(TkTop*, char*, char**);
609 extern	char*	tklabel(TkTop*, char*, char**);
610 extern	char*	tklistbox(TkTop*, char*, char**);
611 extern	char*	tklower(TkTop*, char*, char**);
612 extern	char*	tkmenu(TkTop*, char*, char**);
613 extern	char*	tkmenubutton(TkTop*, char*, char**);
614 extern	char*	tkpack(TkTop*, char*, char**);
615 extern	char*	tkpanel(TkTop*, char*, char**);
616 extern	char*	tkputs(TkTop*, char*, char**);
617 extern	char*	tkradiobutton(TkTop*, char*, char**);
618 extern	char*	tkraise(TkTop*, char*, char**);
619 extern	char*	tkscale(TkTop*, char*, char**);
620 extern	char*	tkscrollbar(TkTop*, char*, char**);
621 extern	char*	tksend(TkTop*, char*, char**);
622 extern	char*	tktext(TkTop*, char*, char**);
623 extern	char*	tkupdatecmd(TkTop*, char*, char**);
624 extern	char*	tkvariable(TkTop*, char*, char**);
625 extern	char*	tkwinfo(TkTop*, char*, char**);
626 
627 extern	TkMethod	*tkmethod[];
628 
629 /* Errors - xdata.c*/
630 extern	char	TkNomem[];
631 extern	char 	TkBadop[];
632 extern	char 	TkOparg[];
633 extern	char 	TkBadvl[];
634 extern	char 	TkBadwp[];
635 extern	char 	TkNotop[];
636 extern	char	TkDupli[];
637 extern	char	TkNotpk[];
638 extern	char	TkBadcm[];
639 extern	char	TkIstop[];
640 extern	char	TkBadbm[];
641 extern	char	TkBadft[];
642 extern	char	TkBadit[];
643 extern	char	TkBadtg[];
644 extern	char	TkFewpt[];
645 extern	char	TkBadsq[];
646 extern	char	TkBadix[];
647 extern	char	TkNotwm[];
648 extern	char	TkWpack[];
649 extern	char	TkBadvr[];
650 extern	char	TkNotvt[];
651 extern	char	TkMovfw[];
652 extern	char	TkBadsl[];
653 extern	char	TkSyntx[];
654 extern	char TkRecur[];
655 extern	char TkDepth[];
656 extern	char TkNomaster[];
657 extern	char TkNotgrid[];
658 extern	char TkIsgrid[];
659 extern	char TkBadgridcell[];
660 extern	char TkBadspan[];
661 extern	char TkBadcursor[];
662 
663 /* Option tables - xdata.c */
664 extern	TkStab	tkanchor[];
665 extern	TkStab	tkbool[];
666 extern	TkStab	tkcolortab[];
667 extern	TkStab	tkjustify[];
668 extern	TkStab	tkorient[];
669 extern	TkStab	tkrelief[];
670 extern	TkStab	tktabjust[];
671 extern	TkStab	tkwrap[];
672 extern	TkOption	tkgeneric[];
673 extern	TkOption	tktop[];
674 extern	TkOption	tktopdbg[];
675 
676 /* panel.c */
677 extern	void		tkgetpanelimage(Tk*, Image**, Image**);
678 extern	void		tksetpanelimage(Tk *tk, Image*, Image*);
679 
680 /* General - colrs.c */
681 extern	void		tksetenvcolours(TkEnv*);
682 
683 /* General - ebind.c */
684 extern	void		tkcmdbind(Tk*, int, char*, void*);
685 extern	TkCtxt*		tkdeldepth(Tk*);
686 extern	char*		tkdestroy(TkTop*, char*, char**);
687 extern	char*		tkbindings(TkTop*, Tk*, TkEbind*, int);
688 extern	int		tkseqparse(char*);
689 extern	void		tksetkeyfocus(TkTop*, Tk*, int);
690 extern	void		tksetglobalfocus(TkTop*, int);
691 
692 /* General - image.c */
693 extern	TkImg*		tkname2img(TkTop*, char*);
694 extern	void		tkimgput(TkImg*);
695 extern	void		tksizeimage(Tk*, TkImg*);
696 extern	TkImg*		tkauximage(TkTop*, char*, TkMemimage*, int);
697 
698 /* choicebuttons - menus.c */
699 extern	Tk*		tkfindchoicemenu(Tk*);
700 
701 /* General - packr.c */
702 extern	void		tkdelpack(Tk*);
703 extern	void		tkappendpack(Tk*, Tk*, int);
704 extern	void		tkpackqit(Tk*);
705 extern	void		tkrunpack(TkTop*);
706 extern	void		tksetslavereq(Tk*, TkGeom);
707 extern	int		tkisslave(Tk*, Tk*);
708 
709 /* General - grids.c */
710 extern	int		tkgridder(Tk*);
711 extern	void		tkgriddelslave(Tk*);
712 extern	char*	tkpropagate(TkTop*, char*);
713 extern	void		tkfreegrid(TkGrid*);
714 
715 /* General - parse.c */
716 extern	char*		tkconflist(TkOptab*, char**);
717 extern	char*		tkskip(char*, char*);
718 extern	char*		tkword(TkTop*, char*, char*, char*, int*);
719 extern	char*		tkxyparse(Tk*, char**, Point*);
720 extern	char*		tkparse(TkTop*, char*, TkOptab*, TkName**);
721 extern	TkName*		tkmkname(char*);
722 extern	char*		tkgencget(TkOptab*, char*, char**, TkTop*);
723 extern	char*		tkparsecolor(char*, ulong*);
724 
725 /* General - utils.c */
726 extern	Image*		tkgc(TkEnv*, int);
727 extern	Image*		tkgshade(TkEnv*, int, int);
728 extern	Image*		tkcolor(TkCtxt*, ulong);
729 extern	Image*		tkcolormix(TkCtxt*, ulong, ulong);
730 extern	Image*		tkgradient(TkCtxt*, Rectangle, int, ulong, ulong);
731 extern	void			tkclear(Image*, Rectangle);
732 extern	TkEnv*		tknewenv(TkTop*);
733 extern	TkEnv*		tkdefaultenv(TkTop*);
734 extern	void		tkputenv(TkEnv*);
735 extern	TkEnv*		tkdupenv(TkEnv**);
736 extern	Tk*		tknewobj(TkTop*, int, int);
737 extern	Tk*		tkfindsub(Tk*);
738 extern	void		tkfreebind(TkAction*);
739 extern	void		tkfreename(TkName*);
740 extern	void		tkfreeobj(Tk*);
741 extern	char*		tkaddchild(TkTop*, Tk*, TkName**);
742 extern	Tk*		tklook(TkTop*, char*, int);
743 extern	void		tktextsdraw(Image*, Rectangle, TkEnv*, int);
744 extern	void		tkbox(Image*, Rectangle, int, Image*);
745 extern	void		tkbevel(Image*, Point, int, int, int, Image*, Image*);
746 extern	void		tkdrawrelief(Image*, Tk*, Point, int, int);
747 extern	Point		tkstringsize(Tk*, char*);
748 extern	void		tkdrawstring(Tk*, Image*, Point, char*, int, Image *, int);
749 extern	int		tkeventfmt(Fmt*);
750 extern	Tk*		tkdeliver(Tk*, int, void*);
751 extern	int		tksubdeliver(Tk*, TkAction*, int, void*, int);
752 extern	void		tkcancel(TkAction**, int);
753 extern	char*		tkaction(TkAction**, int, int, char*, int);
754 extern	char*		tkitem(char*, char*);
755 extern	Point		tkposn(Tk*);
756 extern	Point		tkscrn2local(Tk*, Point);
757 extern	int		tkvisiblerect(Tk *tk, Rectangle *rr);
758 extern	Point		tkanchorpoint(Rectangle, Point, int);
759 extern	char*		tkfrac(char**, int*, TkEnv*);
760 extern	char*		tkfracword(TkTop*, char**, int*, TkEnv*);
761 extern	char*		tkfprint(char*, int);
762 extern	char*		tkvalue(char**, char*, ...);
763 extern	void		tkdirty(Tk *);
764 extern	void		tksorttable(void);
765 extern	char*		tkexec(TkTop*, char*, char**);
766 extern	int		tkeventfmt(Fmt*);
767 extern	void		tkerr(TkTop*, char*);
768 extern	char*	tkerrstr(TkTop*, char*);
769 extern	char*	tkcursorswitch(TkTop*, Image*, TkImg*);
770 extern	void		tkcursorset(TkTop*, Point);
771 extern	char*	tksetmgrab(TkTop*, Tk*);
772 extern	int 		tkinsidepoly(Point*, int, int, Point);
773 extern	int		tklinehit(Point*, int, int, Point);
774 extern	int		tkiswordchar(int);
775 extern	int		tkhaskeyfocus(Tk*);
776 extern	Rectangle	tkrect(Tk*, int);
777 extern	int		tkchanhastype(ulong, int);
778 extern	int		tkhasalpha(TkEnv*, int);
779 extern	void		tksettransparent(Tk*, int);
780 extern	ulong	tkrgba(int, int, int, int);
781 extern	ulong	tkrgbashade(ulong, int);
782 extern	void		tkrgbavals(ulong, int*, int*, int*, int*);
783 extern	void		tkrepeat(Tk*, void(*)(Tk*, void*, int), void*, int, int);
784 extern	void		tkcancelrepeat(Tk*);
785 extern	void		tkblink(Tk*, void(*)(Tk*, int));
786 extern	void		tkblinkreset(Tk*);
787 extern	char*	tkname(Tk*);
788 
789 /* General - windw.c */
790 extern	TkCtxt*		tknewctxt(Display*);
791 extern	void		tkfreectxt(TkCtxt*);
792 extern	void		tkfreecolcache(TkCtxt*);
793 extern	Image*		tkitmp(TkEnv*, Point, int);
794 extern	void		tkgeomchg(Tk*, TkGeom*, int);
795 extern	Tk*		tkinwindow(Tk*, Point, int);
796 extern	Tk*		tkfindfocus(TkTop*, int, int, int);
797 extern	char*		tkdrawslaves(Tk*, Point, int*);
798 extern	char*		tkupdate(TkTop*);
799 extern	int		tkischild(Tk*, Tk*);
800 extern	void		tksetbits(Tk*, int);
801 extern	char*		tkmap(Tk*);
802 extern	void		tkunmap(Tk*);
803 extern	void		tkmoveresize(Tk*, int, int, int, int);
804 extern	int		tkupdatewinsize(Tk*);
805 extern	void		tkmovewin(Tk*, Point);
806 extern	Image*		tkimageof(Tk*);
807 extern	void		tktopopt(Tk*, char*);
808 extern	void		tkdirtyfocusorder(TkTop*);
809 extern	void		tkbuildfocusorder(TkTop*);
810 extern	void		tksortfocusorder(TkWinfo*, int);
811 extern	void		tkappendfocusorder(Tk*);
812 extern	void		tksee(Tk*, Rectangle, Point);
813 extern	char*	tkseecmd(TkTop*, char*, char**);
814 
815 /* Style specific extensions - extns.c */
816 extern	int		tkextndeliver(Tk*, TkAction*, int, void*);
817 extern	void		tkextnfreeobj(Tk*);
818 extern	int		tkextnnewctxt(TkCtxt*);
819 extern	void		tkextnfreectxt(TkCtxt*);
820 extern	char*	tkextnparseseq(char*, char*, int*);
821 
822 /* Debugging */
823 extern	void		tkdump(Tk*);
824 extern	void		tktopdump(Tk*);
825 extern	void		tkcvsdump(Tk*);
826 
827 /* External to libtk */
828 extern	void		tkenterleave(TkTop*);
829 extern	void		tksetwinimage(Tk*, Image*);
830 extern	void		tkdestroywinimage(Tk*);
831 extern	void		tkfreevar(TkTop*, char*, int);
832 extern	TkVar*		tkmkvar(TkTop*, char*, int);
833 extern	int		tktolimbo(void*, char*);
834 extern	void		tkwreq(TkTop*, char*, ...);
835 extern	void		tkdelpanelimage(TkTop*, Image*);
836 
837 extern	TkMethod		framemethod;
838 extern	TkMethod		labelmethod;
839 extern	TkMethod		checkbuttonmethod;
840 extern	TkMethod		buttonmethod;
841 extern	TkMethod		menubuttonmethod;
842 extern	TkMethod		menumethod;
843 extern	TkMethod		separatormethod;
844 extern	TkMethod		cascademethod;
845 extern	TkMethod		listboxmethod;
846 extern	TkMethod		scrollbarmethod;
847 extern	TkMethod		textmethod;
848 extern	TkMethod		canvasmethod;
849 extern	TkMethod		entrymethod;
850 extern	TkMethod		radiobuttonmethod;
851 extern	TkMethod		scalemethod;
852 extern	TkMethod		panelmethod;
853 extern	TkMethod		choicebuttonmethod;
854