Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / perl-5.8.0 / lib / site_perl / 5.8.0 / sun4-solaris / Tk / Internals.pod
CommitLineData
86530b38
AT
1=head1 NAME
2
3CallingTk - what is Perl Tk interface doing when you call Tk functions.
4
5=for category C Programming
6
7This information is worse than useless for C<perlTk> users, but can of
8some help for people interested in using modified Tk source with
9C<perlTk>.
10
11I<This document is under construction. The information is believed to
12be pertinent to the version of> C<portableTk> I<available when it was
13created. All the details are subject to change.>
14
15=head1 DESCRIPTION
16
17=over 4
18
19=item PreCompiling
20
21Before the actual compilation stage a script scans the source
22and extracts the subcommands of different commands. This information
23resides in the file C<pTk/Methods.def>.
24
25=item Compilation
26
27During compilation the above file is included in the source of booting
28routine of dynamic (or static) library. More precisely, the booting
29code of module C<Tk> calls the subroutine Boot_Glue() from the module
30C<tkGlue.c>, and this subroutine includes the file (with appropriate
31macro definitions).
32
33=item Inside C<use Tk;>
34
35The module bootstraps the C code, then loads the Perl libraries. The
36heart of the Perl code is contained in the C<Tk::Widget> library, all the
37widgets inherit from this module. Code for toplevels is loaded from
38C<Tk::MainWindow>.
39
40During bootstrap of the C glue code the C<Xevent::?> codes and a
41handful of C<Tk::Widget> and C<Tk::Image> routines are defined. (Much
42more XSUBs are created from C<Tk.xs> code.) The widget subcommands are
43glued to Perl basing on the list included from C<pTk/Methods.def>. In
44fact all the subcommands are glued to XSUBs that are related to the
45same C subroutine XStoWidget(), but have different data parts.
46
47During the Perl code bootstrap the method C<Tk::Widget::import> is
48called. This call requires all the code from particular widget
49packages.
50
51Code from the widget packages calls an obscure command like
52
53 (bless \"Text")->WidgetClass;
54
55This command (actually Tk::Widget::WidgetClass()) creates three
56routines: Tk::Widget::Text(), Tk::Widget::isText(), and
57Tk::Text::isText(). The first one is basically C<new> of C<Tk::Text>,
58the other two return constants. It also puts the class into
59depository.
60
61=item Inside C<$top = MainWindow-E<gt>new;>
62
63This is quite intuitive. This call goes direct to
64C<Tk::MainWindow::new>, that calls XSUB
65C<Tk::MainWindow::CreateMainWindow>, that calls C subroutine
66Tk_CreateMainWindow(). It is a C<Tk> subroutine, so here black magic
67ends (almost).
68
69The only remaining black magic is that the C<Tk> initialization
70routine creates a lot of commands, but the subroutine for creation is
71usurped by B<portableTk> and the commands are created in the package
72C<Tk>. They are associated to XSUBs that are related to one of three C
73subroutines XStoSubCmd(), XStoBind(), or XStoTk(), but have different
74data parts.
75
76The result of the call is blessed into C<Tk::MainWindow>, as it should.
77
78=item Inside C<$top-E<gt>title('Text demo');>
79
80The package C<Tk::Toplevel> defines a lot of subroutines on the fly on
81some list. All the commands from the list are converted to the
82corresponding subcommands of C<wm> method of the widget. Here
83subcommand is a command with some particular second argument (in this
84case C<"title">). Recall that the first argument is $self.
85
86Now C<Tk::Toplevel> @ISA C<Tk::Widget>, that in turn @ISA C<Tk>. So a
87call to C<$top-E<gt>wm('title','Text demo')> calls C<Tk::wm>, that is
88defined during call to Tk_CreateMainWindow(). As it is described
89above, the XSUB associated to XStoSubCmd() is called.
90
91This C routine is defined in C<tkGlue.c>. It gets the data part of
92XSUB, creates a C<SV> with the name of the command, and calls
93Call_Tk() with the XSUB data as the first argument, and with the name
94of XSUB stuffed into the Perl stack in the place there C<tk> expects
95it. (In fact it can also reorder the arguments if it thinks it is
96what you want).
97
98The latter procedure extracts name of C<tk> procedure and
99C<clientData> from the first argument and makes a call, using Perl
100stack as C<argv> for the procedure. A lot of black magic is performed
101afterwards to convert result of the procedure to a Perl array return.
102
103=item Inside C<$text = $top-E<gt>Text(background =E<gt> $txtBg);>
104
105Above we discussed how the command C<Tk::Widget::Text> is created. The
106above command calls it via inheritance. It is translated to
107
108 Tk::Text::new($top, background => $txtBg);
109
110The package C<Tk::Text> has no method C<new>, so the
111C<Tk::Widget::new> is called. In turn it calls
112C<Tk::Text-E<gt>DoInit($top)>, that is
113C<Tk::Widget::DoInit(Tk::Text,$top)>, that initializes the bindings if
114necessary. Then it creates the name for the widget of the form
115C<.text0>, and calls C<Tk::text('.text0', background =E<gt> $txtBg)>
116(note lowercase). The result of the call is blessed into C<Tk::Text>,
117and the method C<bindtags> for this object is called.
118
119Now the only thing to discuss is who defines the methods C<text> and
120C<bindtags>. The answer is that they are defined in C<tkWindow.c>,
121and these commands are created in the package C<Tk> in the same sweep
122that created the command C<Tk::wm> discussed above.
123
124So the the same C code that corresponds to the processing of
125corresponding TCL commands is called here as well (this time via
126C<XStoTk> interface).
127
128=item Inside C<$text-E<gt>insert('insert','Hello, world!');>
129
130As we discussed above, the subcommands of widget procedures correspond
131to XSUB C<XStoWidget>. This XSUB substitutes the first argument $text
132(that is a hash reference) to an appropriate value from this hash,
133adds the additional argument after the first one that contains the
134name of the subcommand extracted from the data part of XSUB, and calls
135the corresponding Tk C subroutine via C<Call_Tk>.
136
137=back
138
139Ilya Zakharevich <ilya@math.ohio-state.edu>
140
141=cut
142