From: Roberto H. <ro...@ad...> - 2001-09-09 00:38:49
|
Hi all, I've been trying to learn more about the initialization process of the Tk driver. While doing that I came up with a couple of questions, maybe some= of you can help me out with these. I'm also including some things I figured = out (in case they are of any use to anyone). Here are my questions: 1. How can I get the plplot window to start out with the DEBUG menu enabl= ed when using the Tk driver? 2. When I use PLplot in Octave I can start the Tk driver and specify a Tc= l script and an empty frame to be used for the "plxframe". The script is executed AUTOMATICALLY when "plinit" is called. That way I can have a plo= t window as PART of another window. These are the commands that are used in Octave. =A0=A0=A0=A0=A0=A0=A0=A0 plSetOpt ("plwindow", plot_frame); =A0=A0=A0=A0=A0=A0=A0=A0 plSetOpt ("tk_file", init_file); How can I do the same without Octave? 3. When is the "plw_start" procedure in (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) called? What I mean is what = API command calls it. I looked around but couldn't find out. 4. I have a suggestion for a small change in the procedure "plw_start" (h= ope this is the right list). The change and reason for it are specified at th= e end of this mail. ------------------------------------------- From what I've been able to tell, the most important procedures that are executed during the "tk" driver initialization process are: 1. plserver_init (plplotdir/lib/plplot5.0.4/tcl/plserver.tcl) - Sets up t= he top menubar with the File and Help menus =A0 =A0 =A0 =A0|| =A0 =A0 =A0 calls =A0 =A0 =A0 =A0v 2. plstdwin (plplotdir/lib/plplot5.0.4/tcl/pltools.tcl) - Runs the pldefa= luts and plconfig procedures to set up the options and sets the minimum window size and geometry. =A0 =A0 =A0 =A0 =A0(don't know who calls this, probably plinit) 3. plw_create (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) =A0 =A0 =A0 =A0|| =A0 =A0 =A0 calls =A0 =A0 =A0 =A0v 4. plxframe (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) - Creates a container frame (unless already specified) and puts the plot_menu and plf= rame (for the actual plot) inside it. =A0 =A0 =A0 =A0 =A0(don't know who calls this, probably plinit) 5. plw_start (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) - Packs the container frame that was either specified by the user or created by "plxframe". Tells the client that the widget is ready. Calls a procedure "after_plw_start" which is optional code the user can write if he needs t= o execute anything after the driver initialization is done. ------------------------------------------ When the "plinit" command is called with the "tk" driver the procedure "plxframe" is used. This procedure creates a "container" frame and within that frame are the "plot_menu" (if enabled) and a "plframe". There is the option to specify a tcl script and an empty frame for the plxframe to be created in. The procedure that initializes the "tk" driver DOESN'T CHECK whether the specified container frame has been mapped or no= t. It just PACKS the frame. If the frame had been previoulsy mapped with a geometry manager other than PACK it causes the process to lock up. So here there are two options: a) Make sure all the widgets that are siblings of the specified "containe= r" frame are managed with PACK. b) Modify the procedure that initializes the "tk" driver to check whether= the specified container frame has been mapped or not before packing it. The procedure in charge of doing the packing is "plw_start" which is in t= he "plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl" file. The change is as follo= ws: [old] # Manage widget hierarchy =A0 =A0 pack append [winfo parent $w] $w \ =A0 =A0 =A0 =A0{bottom expand fill} =A0 =A0 update [new] # Manage widget hierarchy =A0 =A0 if {! [winfo ismapped $w]} { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0<--- only change =A0 =A0 =A0 =A0 pack append [winfo parent $w] $w \ =A0=A0=A0=A0=A0=A0=A0=A0 =A0 =A0 =A0 =A0{bottom expand fill} =A0 =A0 } =A0 =A0 update Regards, - Roberto |
From: <jca...@in...> - 2001-09-10 16:25:40
|
On Sunday 09 September 2001 01:40, Roberto Hernandez wrote: | Hi all, | | I've been trying to learn more about the initialization process of | the Tk driver. While doing that I came up with a couple of | questions, maybe some of you can help me out with these. I'm also | including some things I figured out (in case they are of any use to | anyone). | | Here are my questions: | | 1. How can I get the plplot window to start out with the DEBUG menu | enabled when using the Tk driver? If you "set debug_on 1" in procedure plserver_init in plserver.tcl,=20 it happens. But if you already knew that, then please change the=20 sources, adding "global debug_on" on the above procedure, and also at=20 pldefaults.tcl, following the same guidelines for other options,=20 submit a patch and become a plplot developper :-) We need you. Hint: "fgrep debug_on *.tcl" in the plplot tmp directory (advantages=20 of the flat model :-) | 2. When I use PLplot in Octave I can start the Tk driver and | specify a Tcl script and an empty frame to be used for the | "plxframe". The script is executed AUTOMATICALLY when "plinit" is | called. That way I can have a plot window as PART of another | window. These are the commands that are used in Octave. | =A0=A0=A0=A0=A0=A0=A0=A0 plSetOpt ("plwindow", plot_frame); | =A0=A0=A0=A0=A0=A0=A0=A0 plSetOpt ("tk_file", init_file); | How can I do the same without Octave? What you mean? In what language (or language bindings) do you intend=20 to work? plSetOpt() is a library call to setup an option (see=20 plargs.c). If you start one of the C demos, say x01c, and type ./x01c=20 -showall -h, you see two options: * -plwindow name Name of PLplot container window (tk or dp=20 driver) * -tk_file file file for plserver (tk or dp driver) These happen automatically, there is no special code in x01c.c. | 3. When is the "plw_start" procedure in | (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) called? What I mean is | what API command calls it. I looked around but couldn't find out. That's not an API entry. Again: bash-2.04# fgrep plw_start *.tcl plclient.tcl:# plw_start_proc proc to manage the plframe widget plclient.tcl: plw_start_proc plw_end_proc \ plclient.tcl: set plw_start_proc plw_start plwidget.tcl:# plw_start plwidget.tcl:proc plw_start {w} { plwidget.tcl: catch after_plw_start bash-2.04# fgrep plw_start *.c =20 tk.c: * $plw_start_proc Does any remaining startup=20 necessary tk.c: server_cmd( pls, "$plw_start_proc $plwindow", 1 ); ( you can also build a tags file (etags *.c *.h *.tcl) open (x)emacs,=20 and find the tag you want, browsing throug the code--but I'm not a=20 sofisticated user :) So, it looks like plw_start is called at tk.c, the tk driver source=20 code. But tk.c is not an easy code to digest; it is a standard driver that=20 at driver initialization time atach to a tk interpreter, than=20 fork/exec (launch) the plserver, establish a communication link=20 between the attached tk and plserver, and then use that channel to=20 send/receive commands to plserver. I'm not shure that this completely=20 correct. It looks like there can exist two kinds of links: either tk standard=20 "send", when the program that uses the tk driver is on the same X=20 display that plserver, and a network socket implemented with "dp",=20 when the programs are running on diferent machines (but I think that=20 "dp"--a tcl extension-- is not in use anymore--not shure again). | 4. I have a suggestion for a small change in the procedure | "plw_start" (hope this is the right list). The change and reason | for it are specified at the end of this mail. | | ------------------------------------------- | | From what I've been able to tell, the most important procedures | that are executed during the "tk" driver initialization process | are: | | 1. plserver_init (plplotdir/lib/plplot5.0.4/tcl/plserver.tcl) - | Sets up the top menubar with the File and Help menus | =A0 =A0 =A0 =A0|| =A0 =A0 =A0 calls | =A0 =A0 =A0 =A0v | 2. plstdwin (plplotdir/lib/plplot5.0.4/tcl/pltools.tcl) - Runs the | pldefaluts and plconfig procedures to set up the options and sets | the minimum window size and geometry. | | =A0 =A0 =A0 =A0 =A0(don't know who calls this, probably plinit) | 3. plw_create (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) | =A0 =A0 =A0 =A0|| =A0 =A0 =A0 calls | =A0 =A0 =A0 =A0v | 4. plxframe (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) - Creates | a container frame (unless already specified) and puts the plot_menu | and plframe (for the actual plot) inside it. | | =A0 =A0 =A0 =A0 =A0(don't know who calls this, probably plinit) This is the important part, I think | 5. plw_start (plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl) - Packs | the container frame that was either specified by the user or | created by "plxframe". Tells the client that the widget is ready. | Calls a procedure "after_plw_start" which is optional code the user | can write if he needs to execute anything after the driver | initialization is done. | | ------------------------------------------ | | When the "plinit" command is called with the "tk" driver the | procedure "plxframe" is used. This procedure creates a "container" | frame and within that frame are the "plot_menu" (if enabled) and a | "plframe". | | There is the option to specify a tcl script and an empty frame for | the plxframe to be created in. The procedure that initializes the | "tk" driver DOESN'T CHECK whether the specified container frame has | been mapped or not. It just PACKS the frame. If the frame had been | previoulsy mapped with a geometry manager other than PACK it causes | the process to lock up. Roberto problem is, if I undestood correctly (we have been talking=20 off-list): "if I write a tk interface using my prefered geometry=20 manager, the "grid", and let an empty frame on it, where I want the=20 plots to go--using plSetOpt ("plwindow", plot_frame)--then the=20 program blocks, because plserver *packs* the frame that is already=20 "grided". | So here there are two options: | | a) Make sure all the widgets that are siblings of the specified | "container" frame are managed with PACK. | | b) Modify the procedure that initializes the "tk" driver to check | whether the specified container frame has been mapped or not before | packing it. | | The procedure in charge of doing the packing is "plw_start" which | is in the "plplotdir/lib/plplot5.0.4/tcl/plwidget.tcl" file. The | change is as follows: | | [old] | # Manage widget hierarchy | =A0 =A0 pack append [winfo parent $w] $w \ | =A0 =A0 =A0 =A0{bottom expand fill} | | =A0 =A0 update | | [new] | # Manage widget hierarchy | =A0 =A0 if {! [winfo ismapped $w]} { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0<--- | only change pack append [winfo parent $w] $w \ | =A0=A0=A0=A0=A0=A0=A0=A0 =A0 =A0 =A0 =A0{bottom expand fill} | =A0 =A0 } | | =A0 =A0 update | It does not work for me, if I try "./x01c -dev tk", I get invalid command name "=A0" while executing "=A0" (procedure "plw_start" line 6) invoked from within "plw_start .x01c" ("after" script) Haven't you done any other changes? The changes I made: bash-2.04# diff -c plwidget.tcl plwidget.tcl.new *** plwidget.tcl Mon Sep 10 16:51:49 2001 --- plwidget.tcl.new Mon Sep 10 16:51:14 2001 *************** *** 575,583 **** global client =20 # Manage widget hierarchy !=20 pack append [winfo parent $w] $w \ {bottom expand fill} =20 update =20 --- 575,586 ---- global client =20 # Manage widget hierarchy ! if (1) { ! if {! [winfo ismapped $w]} { =A0 pack append [winfo parent $w] $w \ {bottom expand fill} + }} else { pack append [winfo parent $w] $w \ + {bottom expand fill}} update Joao | Regards, | | - Roberto | | _______________________________________________ | Plplot-general mailing list | Plp...@li... | https://lists.sourceforge.net/lists/listinfo/plplot-general |