Perhaps the most useful of the global variables available in
ET is Et_Interp
.
This variable is a pointer to the Tcl/Tk interpreter, the one
created by Et_Init()
and used to execute all Tcl/Tk
commands within the program.
The Et_Interp
variable has the same value as the
interp
formal parameter found in every ET_PROC()
function.
The Et_Interp
variable is useful because you may
often want to call C routines in the Tcl/Tk library, and most
of these routines require a pointer to the interpreter as their
first parameter.
For instance, suppose in the initialization code you want to create
a link between the global C variable nClients
and a
Tcl/Tk variable by the same name.
Using the Et_Interp
variable as the first parameter
to the Tcl function Tcl_LinkVar()
, you could write:
Tcl_LinkVar(Et_Interp,"nClients",(char*)&nClients,TCL_LINK_INT);Having done this, any changes to the C
nClients
variable
will be reflected in the Tcl/Tk variable, and vice versa.
Perhaps the second most useful global varible is Et_Display
.
This variable contains the Display
pointer required as
the first argument to most Xlib routines.
It is used by daring, down-to-the-bare-metal programmers who like to
call Xlib directly.
Here's an example.
Suppose you want to create a new Tcl/Tk command,
PitchedBell
, that makes
the X terminal emit a beep with a pitch specified by its sole argument.
Once such a command is implemented, then the following Tcl/Tk code
would emit a single tone at the pitch of concert A:
PitchedBell 440Here a short piece of Tcl/Tk code that plays the opening bar of Beethoven's Fifth Symphony:
foreach pitch {784 784 784 659} { PitchedBell $pitch after 200 }You probably get the idea. Here's the code that implements the
PitchedBell
command:
#include <tk.h> /* Will also pickup <Xlib.h> */ ET_PROC( PitchedBell ){ XKeyboardControl ctrl; /* For changing the bell pitch */ if( argc!=2 ){ interp->result = "Wrong # args. Should be: ``PitchedBell PITCH''"; return ET_ERROR; } ctrl.bell_pitch = atoi( argv[1] ); XChangeKeyboardControl(Et_Display,KBBellPitch,&ctrl); XBell(Et_Display,0); XFlush(Et_Display); return ET_OK; }After checking to make sure it has exactly one argument, the
PitchedBell
command uses the
XChangeKeyboardControl()
function of Xlib to change the bell pitch.
It then rings the bell using the XBell()
Xlib function, and
finally flushes the Xlib message queue using XFlush()
to
force the bell to be rung immediately.
All three of these Xlib functions require a Display
pointer as their first argument, a role that is perfectly filled
by the Et_Display
global variable.
The third and final global C variable in ET is Et_MainWindow
.
This variable is a pointer to
the Tcl/Tk structure that defines the application's
main window.
Back in the days of Tk3.6, several Tcl/Tk library functions
required this value as a parameter.
But the Tcl/Tk library interface changed in the move to Tk4.0, so that
the main window pointer is no longer required.
Hence, the Et_MainWindow
variable isn't used much any more.
It has been kept around as an historical artifact.