home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _024f51e177ed866f5229eb4c97f4d498 < prev    next >
Text File  |  2000-03-23  |  8KB  |  164 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>CallingTk -  what is Perl Tk interface doing when you call Tk functions.</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> CallingTk -  what is Perl Tk interface doing when you call Tk functions.</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  24. </UL>
  25. <!-- INDEX END -->
  26.  
  27. <HR>
  28. <P>
  29. <H1><A NAME="name">NAME</A></H1>
  30. <P>CallingTk -  what is Perl Tk interface doing when you call Tk functions.</P>
  31. <P>This information is worse than useless for <CODE>perlTk</CODE> users, but can of
  32. some help for people interested in using modified Tk source with
  33. <CODE>perlTk</CODE>.</P>
  34. <P><EM>This document is under construction. The information is believed to
  35. be pertinent to the version of</EM> <CODE>portableTk</CODE> <EM>available when it was
  36. created. All the details are subject to change.</EM></P>
  37. <P>
  38. <HR>
  39. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  40. <UL>
  41. <LI>Linux</LI>
  42. <LI>Solaris</LI>
  43. <LI>Windows</LI>
  44. </UL>
  45. <HR>
  46. <H1><A NAME="description">DESCRIPTION</A></H1>
  47. <DL>
  48. <DT><STRONG><A NAME="item_PreCompiling">PreCompiling</A></STRONG><BR>
  49. <DD>
  50. Before the actual compilation stage a script scans the source
  51. and extracts the subcommands of different commands. This information
  52. resides in the file <CODE>pTk/Methods.def</CODE>.
  53. <P></P>
  54. <DT><STRONG><A NAME="item_Compilation">Compilation</A></STRONG><BR>
  55. <DD>
  56. During compilation the above file is included in the source of booting
  57. routine of dynamic (or static) library. More precisely, the booting
  58. code of module <CODE>Tk</CODE> calls the subroutine <CODE>Boot_Glue()</CODE> from the module
  59. <CODE>tkGlue.c</CODE>, and this subroutine includes the file (with appropriate
  60. macro definitions).
  61. <P></P>
  62. <DT><STRONG><A NAME="item_Inside_use_Tk%3B">Inside <CODE>use Tk;</CODE></A></STRONG><BR>
  63. <DD>
  64. The module bootstraps the C code, then loads the Perl libraries. The
  65. heart of the Perl code is contained in the <CODE>Tk::Widget</CODE> library, all the
  66. widgets inherit from this module. Code for toplevels is loaded from
  67. <CODE>Tk::MainWindow</CODE>.
  68. <P>During bootstrap of the C glue code the <CODE>Xevent::?</CODE> codes and a
  69. handful of <CODE>Tk::Widget</CODE> and <CODE>Tk::Image</CODE> routines are defined. (Much
  70. more XSUBs are created from <CODE>Tk.xs</CODE> code.) The widget subcommands are
  71. glued to Perl basing on the list included from <CODE>pTk/Methods.def</CODE>. In
  72. fact all the subcommands are glued to XSUBs that are related to the
  73. same C subroutine XStoWidget(), but have different data parts.</P>
  74. <P>During the Perl code bootstrap the method <CODE>Tk::Widget::import</CODE> is
  75. called. This call requires all the code from particular widget
  76. packages.</P>
  77. <P>Code from the widget packages calls an obscure command like</P>
  78. <PRE>
  79.   (bless \"Text")->WidgetClass;</PRE>
  80. <P>This command (actually Tk::Widget::WidgetClass()) creates three
  81. routines: Tk::Widget::Text(), Tk::Widget::isText(), and
  82. Tk::Text::isText(). The first one is basically <A HREF="#item_new"><CODE>new</CODE></A> of <CODE>Tk::Text</CODE>,
  83. the other two return constants. It also puts the class into
  84. depository.</P>
  85. <P></P>
  86. <DT><STRONG><A NAME="item_new">Inside <CODE>$top = MainWindow->new;</CODE></A></STRONG><BR>
  87. <DD>
  88. This is quite intuitive. This call goes direct to
  89. <CODE>Tk::MainWindow::new</CODE>, that calls XSUB
  90. <CODE>Tk::MainWindow::CreateMainWindow</CODE>, that calls C subroutine
  91. Tk_CreateMainWindow(). It is a <CODE>Tk</CODE> subroutine, so here black magic
  92. ends (almost).
  93. <P>The only remaining black magic is that the <CODE>Tk</CODE> initialization
  94. routine creates a lot of commands, but the subroutine for creation is
  95. usurped by <STRONG>portableTk</STRONG> and the commands are created in the package
  96. <CODE>Tk</CODE>. They are associated to XSUBs that are related to one of three C
  97. subroutines XStoSubCmd(), XStoBind(), or XStoTk(), but have different
  98. data parts.</P>
  99. <P>The result of the call is blessed into <CODE>Tk::MainWindow</CODE>, as it should.</P>
  100. <P></P>
  101. <DT><STRONG><A NAME="item_title">Inside <CODE>$top->title('Text demo');</CODE></A></STRONG><BR>
  102. <DD>
  103. The package <CODE>Tk::Toplevel</CODE> defines a lot of subroutines on the fly on
  104. some list. All the commands from the list are converted to the
  105. corresponding subcommands of <CODE>wm</CODE> method of the widget. Here
  106. subcommand is a command with some particular second argument (in this
  107. case <CODE>"title"</CODE>). Recall that the first argument is $self.
  108. <P>Now <CODE>Tk::Toplevel</CODE> @ISA <CODE>Tk::Widget</CODE>, that in turn @ISA <CODE>Tk</CODE>. So a
  109. call to <CODE>$top->wm('title','Text demo')</CODE> calls <CODE>Tk::wm</CODE>, that is
  110. defined during call to Tk_CreateMainWindow(). As it is described
  111. above, the XSUB associated to <CODE>XStoSubCmd()</CODE> is called.</P>
  112. <P>This C routine is defined in <CODE>tkGlue.c</CODE>. It gets the data part of
  113. XSUB, creates a <A HREF="../../../lib/Pod/perlguts.html#item_SV"><CODE>SV</CODE></A> with the name of the command, and calls
  114. <CODE>Call_Tk()</CODE> with the XSUB data as the first argument, and with the name
  115. of XSUB stuffed into the Perl stack in the place there <CODE>tk</CODE> expects
  116. it. (In fact it can also reorder the arguments if it thinks it is
  117. what you want).</P>
  118. <P>The latter procedure extracts name of <CODE>tk</CODE> procedure and
  119. <CODE>clientData</CODE> from the first argument and makes a call, using Perl
  120. stack as <CODE>argv</CODE> for the procedure. A lot of black magic is performed
  121. afterwards to convert result of the procedure to a Perl array return.</P>
  122. <P></P>
  123. <DT><STRONG><A NAME="item_Text">Inside <CODE>$text = $top->Text(background => $txtBg);</CODE></A></STRONG><BR>
  124. <DD>
  125. Above we discussed how the command <CODE>Tk::Widget::Text</CODE> is created. The
  126. above command calls it via inheritance. It is translated to
  127. <PRE>
  128.   Tk::Text::new($top, background => $txtBg);</PRE>
  129. <P>The package <CODE>Tk::Text</CODE> has no method <A HREF="#item_new"><CODE>new</CODE></A>, so the
  130. <CODE>Tk::Widget::new</CODE> is called. In turn it calls
  131. <CODE>Tk::Text->DoInit($top)</CODE>, that is
  132. <CODE>Tk::Widget::DoInit(Tk::Text,$top)</CODE>, that initializes the bindings if
  133. necessary. Then it creates the name for the widget of the form
  134. <CODE>.text0</CODE>, and calls <CODE>Tk::text('.text0', background => $txtBg)</CODE>
  135. (note lowercase). The result of the call is blessed into <CODE>Tk::Text</CODE>,
  136. and the method <CODE>bindtags</CODE> for this object is called.</P>
  137. <P>Now the only thing to discuss is who defines the methods <CODE>text</CODE> and
  138. <CODE>bindtags</CODE>. The answer is that they are defined in <CODE>tkWindow.c</CODE>,
  139. and these commands are created in the package <CODE>Tk</CODE> in the same sweep
  140. that created the command <CODE>Tk::wm</CODE> discussed above.</P>
  141. <P>So the the same C code that corresponds to the processing of
  142. corresponding TCL commands is called here as well (this time via
  143. <CODE>XStoTk</CODE> interface).</P>
  144. <P></P>
  145. <DT><STRONG><A NAME="item_insert">Inside <CODE>$text->insert('insert','Hello, world!');</CODE></A></STRONG><BR>
  146. <DD>
  147. As we discussed above, the subcommands of widget procedures correspond
  148. to XSUB <CODE>XStoWidget</CODE>. This XSUB substitutes the first argument $text
  149. (that is a hash reference) to an appropriate value from this hash,
  150. adds the additional argument after the first one that contains the
  151. name of the subcommand extracted from the data part of XSUB, and calls
  152. the corresponding Tk C subroutine via <CODE>Call_Tk</CODE>.
  153. <P></P></DL>
  154. <P>Ilya Zakharevich <<A HREF="mailto:ilya@math.ohio-state.edu">ilya@math.ohio-state.edu</A>></P>
  155. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  156. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  157. <STRONG><P CLASS=block> CallingTk -  what is Perl Tk interface doing when you call Tk functions.</P></STRONG>
  158. </TD></TR>
  159. </TABLE>
  160.  
  161. </BODY>
  162.  
  163. </HTML>
  164.