xref: /inferno-os/libtk/NOTES (revision cd17ce433410c01516d7ba8f052a6c5b67b0e2d5)
1Notes on the Tk implementation.
2
3General
4
5	TkTop represents a top-level window.
6	It holds pointers to the widgets created in that
7	window:
8		windows		gives a list of all windows (this includes "." and any menu widgets)
9		root			the list of all widgets, whether packed or not.
10
11	Each Tk widget holds pointers to the widgets packed inside it, its slaves.
12	Widgets that do their own child widget management (canvas
13	and text) do not use the slaves list, but store pointers
14	to them in their own data structures.
15
16	Each Tk widget, w, holds a pointer to the widget it's packed or stored inside.
17
18		w->master
19			if it's packed or stored in a grid
20		w->parent
21			if it's a child widget of a canvas or text widget.
22
23	A widget type is operated on through functions referred to in its TkMethod structure,
24	defined in that widget type's source file, and pointed to by the
25	method dispatch table, tkmethod, defined in xdata.c.
26
27	utils.c contains the master table holding the built-in commands
28	(e.g. widget creation, focus, grab, etc) with their
29	associated functions.
30
31	xdata.c holds the method table (tkmethod) mapping from
32	widget type to the method functions supported by individual widgets.
33
34
35
36Coordinates:
37
38	A widget requests a particular size allocation
39	by setting its req.width and req.height fields.
40	The packer (or its parent) determines the actual
41	size allocation, and position and sets act.x, act.y, act.width
42	and act.height appropriately.
43
44	The requested width and height do not include the
45	borderwidth, which is factored in additionally.
46
47	Coordinates as delivered by the %x and %y verbs provided
48	by bind(9) are relative to the top left of the widget,
49	inside its border. I'll call this the "widget's coordinate system".
50
51	The draw method of each widget type is provided with
52	an "origin" argument.
53
54		(origin.x + act.x + borderwidth, origin.y + act.y + borderwidth)
55
56	gives the screen coordinate of (0, 0) in the widget coordinate
57	system.
58
59
60Dirtiness
61
62	Each widget has a "dirty" rectangle, the bounding
63	box of any changes that it needs to make visible.
64	This is in the widget's coordinate system.
65
66	A widget does not have to update everything in
67	the dirty rectangle, unless the Tkrefresh flag
68	is set, in which case it must.
69
70	A widget never has to draw anything outside of its dirty
71	rectangle.
72
73Locking
74
75	Mostly, Tk is non-reentrant because the interpreter is held
76	when a call to, e.g.  Tk_cmd, is made.
77
78	However, when the display is remote, any access of the display
79	(drawing, stringsize, etc) can do a release() and therefore
80	let another thread access tk.
81
82	The drawing code itself locks the display, so code invoked
83	from within a widgets draw() method is guaranteed
84	non-reentrant.
85
86	If access to the draw device is required during code executed
87	in a non-drawing context (e.g.  to calculate the size of a
88	string), care must be taken to lock the draw device
89	appropriately.  Tk provides some convenience functions to do
90	this (e.g.  tkstringsize).
91