%
% Chapter Getting Started
%
%           Author: Erick Gallesio [eg@kaolin.unice.fr]
%    Creation date:  4-Nov-1992 15:37
% Last file update: 26-Apr-1995 12:10

\chapter{Getting Started}

%\begin{flushright}
%{\Huge\bf 1}\\[5mm]
%{\Huge\bf Getting Started}
%\end{flushright}


This chapter will explain the things you must know to begin to manipulate Tk
widgets as {\stklos} objects. This is a short introduction for programming the
Tk toolkit with objects. If you know how to program it with the Tcl language,
you will see that things are not too much different (at least at first
sight). A good introduction to Tk programming in Tcl can be found in
\cite{Ouster-bok} or \cite{Welch-book}.

\section{First steps}

When you want to use the Tk toolkit with the {\stklos}, you must first call
the {\stk} interpreter. Launching the interpreter is usually done by a
call to the shell script {\tt stk} which must have been installed in a
standard place. Once, the interpreter is initialized, a small square window
will appear on your display. This window is called the {\em root
window\index{root window}}. Its value is always retained in the global
variable {\tt *top-root*\index{*top-root*}}.

Once the Tk initialization is complete, you have to load the file 
{\tt Tk-classes}. This can be done by 
\begin{quote}
\begin{verbatim}
(require "Tk-classes")
\end{verbatim}
\end{quote}

The {\tt Tk-classes} file contains a set of {\tt autoload}s for all the
Tk widgets defined in the {\stk} release. If you plan to always work with
those classes, you can put this line in your {\stk} init file (i.e. in the
file ``{\tt \~/.stkrc}'') to avoid (manual) loading of this file.

From now, we are able to interact with the Tk toolkit. Try to enter the following
lines at the {\stk} prompt: 
\begin{quote}
\begin{verbatim}	
(define hello (make <Label> :text "Hello, world"))
\end{verbatim}
\end{quote}

The call to {\tt make} creates a new object (i.e. an instance of the class {\tt
<Label>}) with its slot {\tt text} filled with the string {\tt "Hello,
world"}. In the above example, this new object is assigned to the symbol
{\tt hello}. Even, if a new label is created, nothing will be displayed on
your screen. You'll have to use a {\em geometry manager}\index{geometry
manager} for displaying a Tk widget onto screen. Two window managers are
provided with Tk, namely the {\em packer}\index{packer} and the {\em
placer}\index{placer}. Both command have a full set of options which will
be detailed later (see \ref{packer}). For now, we will just use the packer
in its simpler form:
\begin{quote}
\begin{verbatim}	
(pack hello)
\end{verbatim}
\end{quote}
permits to map the {\tt hello} button onto screen. 

Let us see further how the {\tt hello} button is built. Using describe
on it will display:
\begin{quote}
\begin{verbatim}
#[<label> e1444] is an instance of class <label>
Slots are: 
     id = #[Tk-command .v1]
     eid = #[Tk-command .v1]
     parent = #[Tk-command .]
     bitmap = ""
     width = 0
     height = 0
     anchor = "center"
     font = "9x15"
     foreground = "Black"
     pad-x = 1
     pad-y = 1
     text = "Hello, world"
     text-variable = ""
     background = "#cccccc"
     border-width = 0
     cursor = ""
     relief = "flat"
\end{verbatim}
\end{quote}

{\tt Id\index{Id slot}}, {\tt Eid\index{Eid slot}} and {\tt
parent\index{parent slot}} slots are present in all Tk widgets and are used
by the system. Don't try to change their value.  Other slots depend of the
kind (i.e. the class) of widget. The slots listed above correspond to
the various Tk options available on a label.  Of course you can
consult/change their value with the standard {\tt slot-ref} or {\tt
slot-set!} primitives.  For instance, one can change the background color
of the {\tt hello} button with the following form:
\begin{quote}
\begin{verbatim}
(slot-set! hello 'background "Chocolate")
\end{verbatim}
\end{quote}
or, using the {\stklos} generalized assignment,
\begin{quote}
\begin{verbatim}
(set! (background hello) "Chocolate")
\end{verbatim}
\end{quote}

Of course, the background value can be queried with
\begin{quote}
\begin{verbatim}
(slot-ref hello 'background)
        --> "Chocolate"
\end{verbatim}
\end{quote}
\noindent
or
\begin{quote}
\begin{verbatim}
(background hello)
        --> "Chocolate"
\end{verbatim}
\end{quote}

Here, {\tt background} is used as an accessor\index{accessor} of the label
background. It would be also possible to specify this value at label
instantiation with the {\tt :background} {\em initialization keyword
\index{initialization keyword}} and the same window could have be obtained
with the following {\tt make} call 
\begin{quote}
\begin{verbatim}
(define hello (make <Label> :text "Hello world" 
                            :background "Chocolate"))
\end{verbatim}
\end{quote}

\section{Class Hierarchy}

{\stklos} Tk classes permit to {\em reify} the Tk widgets into {\stklos
objects}. It means that every graphical object used in a program such as a
menu, a label or a button is represented as a {\stklos} object. All the
defined {\stklos} classes build a hierarchy which is briefly described
here. Firstly, all the classes shared a unique ancestor: the {\tt <Tk-object>}
class. Instances of this class contain informations which are necessary for
establishing a communication between the Scheme and Tk worlds. Principally,
objects of this class have the three slots cited before {\tt Id\index{Id
slot}}, {\tt Eid\index{Eid slot}} and {\tt parent\index{parent slot}}. The
{\tt Id} slot contains a Tk command \cite{STk-ref-man}, generated by
{\stklos} itself, which correspond to the {\stk} command which implement the
object.  The {\tt parent} slot contains a reference to the object which
(graphically) include the current object. This slot will be discussed later.
Normally, end users will not have to use direct instances of the {\tt
<Tk-object>} class\footnote{All classes whose name begin with the ``Tk-''
prefix are not are not intended for the final user. They will be discussed in
this document only if it seems necessary for a good class hierarchy
comprehension.}.

The next level in our class hierarchy define a fork with two branches: the
{\tt <Tk-widget>}\index{<Tk-widget> class} class and {\tt<Tk-canvas-item>}
\index{<Tk-canvas-item> class} class. Instances of the
former class are classical widgets such as buttons, menus or canvases since
instances of the later are objects contained in a canvas such as lines or
rectangles.  {\tt <Tk-widget>}s are also divided in two categories: {\tt
<Tk-simple-widget>}s and {\tt <Tk-composite-widget>}s. Simples widgets are
directly implemented as Tk objects and composite ones are build upon simple
widgets (e.g. file browser, alert messages and so on). The head of the
{\stklos} hierarchy is shown in Figure \ref{Head-hierarchy}.
\begin{figure}
%\centerline{\epsfig{figure={Fig1-1.idraw},height={2.00in},width={2.00in}}}
\centerline{\epsfig{file={Fig1-1.eps}}}
\caption{Head of the {\stklos} hierarchy}
\label{Head-hierarchy}
\end{figure}

\subsection{The {\tt <Tk-widget>} class}

No slot is defined for this class. However, since this class is common to all
the interface objects (menus, buttons, label, \ldots), it permits to define
their common behavior. The behavior of those objects is described using
{\stklos} methods with one of their argument (generally the first) which is a
{\tt <Tk-widget>}. The {\em pack\index{pack}} geometry manager cited below is
one of such methods. The {\em packer} will be fully described below (see
\pageref{packer-doc}); however, briefly stated, we can say that it permits to
explain the geometry of a widget depending of its neighbors.  The example below
shows how to use the pack primitive with arguments.
\begin{quote}
\begin{verbatim}
(define lab1 (make <Label> :text "Label 1"))
(define lab2 (make <Label> :text "Label 2"))

(pack lab1 :side "bottom")
(pack lab2 :side "top" :expand #t :fill "both")
\end{verbatim}
\end{quote}

Here, two labels are defined {\tt lab1} and {\tt lab2}. The first call to
pack says that {\tt lab1} should occupy the bottom of the window. Second
call states that {\tt lab2} will occupy the top of the window. Furthermore,
the  options {\tt :expand} and {\tt :fill} specified during {\tt lab2}
packing tells to the packer that its geometry must be adjusted to fill all
the space if its containing window is resized. If we do now 
\begin{quote}
\begin{verbatim}
(define lab3 (make <Label> :text "Label 3"))
(pack lab3 :after lab2)
\end{verbatim}
\end{quote}
we will define a new label which will be inserted between the {\tt lab1} and
{\tt lab2} labels.  Of course, the window containing the two labels  will
be {\em automagically} resized to take into account the insertion of the third.

Windows can also be unmapped from screen with the {\tt
unpack\index{unpack}} method. This method tells {\em pack} to suspend
geometry management of the specified window. Another call to a geometry
manager should be used to map again the window on display.

Suppose now that we want to delete the top most label of our previous
window (i.e. {\tt lab2}). 
This can be done with the {\tt <Tk-widget>} method {\tt destroy} as
shown below: 
\begin{quote}
\begin{verbatim}
(destroy lab2)
\end{verbatim}
\end{quote}
\noindent
Here, the window is unmapped from screen and definitively destroyed
(i.e. it cannot be mapped on the screen anymore). Technically speaking, the
widget will be destroyed and its class will be changed to the special class
{\tt <Destroyed-object>}\index{<Destroyed-object>}.

\paragraph{\bf Note:} Destroying the root window 
({\tt *top-root*\index{*top-root*}}) will destroy the root window
and, consequently, the interpreter since it as nothing more to manage.

\subsection{The {\tt <Tk-simple-widget>} class}

{\stklos} defines a class for each simple widgets (such as labels, buttons or
messages) of the Tk library. The {\tt <Tk-simple-widget>} class defines slots
and methods which are common to all those objects. The main slots defined for
simple widgets are:
\begin {ip}
\ITEM{background}\label{background}
which specifies
the normal background color to use when displaying the widget.  The value of
this slot should be a {\em string} or a {\em symbol}. It can be 
\begin{itemize}
\item a textual name
for a color defined in the server's color database file (e.g. "Chocolate" or
"Dark Olive Green").
\item a numeric specification of the red, green, and blue intensities
to use to display the color (such as {\tt \#aabbcc} or even {\tt rgb:aa/bb/cc})
using the standard X11 notation.
\end{itemize}

\ITEM{border-width}\label{border-width}
which specifies a non-negative value indicating the width of the 3-D border to
draw around the outside of the widget (if such a border is being drawn; the
{\em relief} option typically determines this).

\ITEM{cursor}\label{cursor}
which specifies the mouse
cursor to be used for the widget. Valid values for this slot are given in
Table~\ref{cursor-table}. Be aware that case is significant when naming a cursor.

\ITEM{relief}\label{relief}
which specifies the 3-D
effect desired for the widget.  Acceptable values are {\tt :raised}, {\tt
:sunken}, {\tt :flat}, {\tt :ridge} or {\tt :groove}.  The value indicates how
the interior of the widget should appear relative to its exterior; for
example, {\tt :raised} means the interior of the widget should appear to
protrude from the screen, relative to the exterior of the widget.
\end{ip}
\begin{table}
{\footnotesize
\begin{center}
\begin{tabular}{|l|l|l|l|} \hline
X\_cursor		& fleur			& sailboat	\\
arrow			& gobbler		& sb\_down\_arrow	\\
based\_arrow\_down	& gumby			& sb\_h\_double\_arrow	\\
based\_arrow\_up		& hand1			& sb\_left\_arrow	\\
boat			& hand2			& sb\_right\_arrow	\\
bogosity		& heart			& sb\_up\_arrow	\\
bottom\_left\_corner	& icon			& sb\_v\_double\_arrow	\\
bottom\_right\_corner	& iron\_cross		& shuttle	\\
bottom\_side		& left\_ptr		& sizing	\\
bottom\_tee		& left\_side		& spider	\\
box\_spiral		& left\_tee		& spraycan	\\
center\_ptr		& leftbutton		& star	\\
circle			& ll\_angle		& target	\\
clock			& lr\_angle		& tcross	\\
coffee\_mug		& man			& top\_left\_arrow	\\
cross			& middlebutton		& top\_left\_corner	\\
cross\_reverse		& mouse			& top\_right\_corner	\\
crosshair		& pencil		& top\_side	\\
diamond\_cross		& pirate		& top\_tee	\\
dot			& plus			& trek	\\
dotbox			& question\_arrow	& ul\_angle	\\
double\_arrow		& right\_ptr		& umbrella	\\
draft\_large		& right\_side		& ur\_angle	\\
draft\_small		& right\_tee		& watch	\\
draped\_box		& rightbutton		& xterm	\\
exchange		& rtl\_logo		& {\ } \\ \hline 
\end{tabular}
\end{center}
}
\caption {Valid cursor values for slot {\tt cursor}}
\label{cursor-table}
\end{table}
These slots are defined for all the basic widgets of the {\stklos}
package. However, they are not defined as real {\stklos} slots (i.e. they are not
implanted in the Scheme world). Instead, this kind of slot has its value which
is stored inside the internal structures of the Tk library. Those slots are
allocated with a special allocation scheme which is called {\tt
:tk-virtual}. Tk virtual slots are managed by the {\tt
<With-Tk-virtual-slots-metaclass>} meta-class.

Consequently, reading or writing a {\em tk-virtual} slot will provoke a direct
reading or writing of a field of the Tk-library C-structure associated to the
object (this avoid to have to synchronize values in the Tk and Scheme
world). For each {\em tk-virtual}, {\stklos} provides an accessor; the
following example shows some simple usages of this kind of slots.

\noindent
{\em Example:}
\begin{quote}
\begin{verbatim}
(define lab (make <Label> :text "Hello" :relief "raised" :background "grey"))
(relief lab)
        --> "raised"
(set! (border-width lab) 4)
(border-width lab)
        --> 4
\end{verbatim}
\end{quote}
\noindent
The first expression creates a new instance of a label, as we have seen before. The
second one queries the Tk server about the relief of the label {\tt lab}.
Finally, the {\tt set!} expression permits to change the value of the
width of {\tt lab}'s border.

\subsection{The {\tt <Tk-canvas-item>} class}

Instances of {\tt <Tk-canvas-item>} class, as said before, are objects such as
rectangles, circles or bitmaps which are contained in a window. A window
containing this kind of object is a special simple widget called a {\em
canvas}. All the objects defined in a {\em canvas} can be manipulated
(e.g. moved, re-colored or re-sized) and even Scheme command can be associated
to them.  All the actions available for {\tt <Tk-canvas-item>}s 
are deferred to a next chapter (\ref{Canvas-chapter}).

\section{Functions of this chapter}
This section presents in details the methods and functions seen in this
chapter (or methods and functions related to things seen in this chapter).
Functions are listed below in alphabetical order.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% DESTROY
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\label{packer-doc}
\schemetitle{destroy}{method}

\begin{schemedoc}{Syntax}
\begin{verbatim}
destroy		((self <Tk-widget>))
destroy		l
\end{verbatim}
\end{schemedoc}

\begin{schemedoc}{Arguments (first form)}
\begin{description}
\item[self] the window to destroy.
\end{description}
\end{schemedoc}

\begin{schemedoc}{Arguments (second form)}
\begin{description}
\item[l] a list of window to destroy (this form maps in facts the previous one to
all its arguments to allow multiple destruction).
\end{description}
\end{schemedoc}

\begin{schemedoc}{Description}
{\tt Destroy} deletes the {\tt self} widget window and all of its descendants.
If {\tt self} equals to {\tt *top-root*}, the interpreter terminates its execution.
\end{schemedoc}

\begin{schemedoc}{Result}
The destroyed object (see note below)
\end{schemedoc}

\begin{schemedoc}{Example}
\begin{verbatim}
(define l1 (make <Label> :text "lab1"))
...
(define l5 (make <Label> :text "lab5"))
(destroy l1)             ;; direct call of first form
(destroy l2 l3 l4 l5)    ;; call of the second form
\end{verbatim}
\end{schemedoc}


\begin{schemedoc}{Note}
When a widget is destroyed, its class is changed to <Destroyed-object> as
shown below:
\begin{quote}
\begin{verbatim}
(define lab (make <Label> :text "A label"))
(class-name (class-of lab))
        --> <label>
(destroy lab)
(class-name (class-of lab))
        --> <destroyed-object>
\end{verbatim}
\end{quote}

\end{schemedoc}

\begin{schemedoc}{See also}
{\tt destroy} method for canvases, unpack
\end{schemedoc}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% PACK
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\schemetitle{pack}{procedure}
\label{pack-doc}
\begin{schemedoc}{Syntax}
\begin{verbatim}
pack l 
\end{verbatim}
\end{schemedoc}

\begin{schemedoc}{Arguments}
{\tt pack} accepts a list of arguments whose behavior depends on the first
element of this list.

\paragraph{\tt (pack 'slave [slave ...] [option])}
\begin{quote}
If the first argument to {\tt pack} is a widget, then the command is
processed in the same way as {\tt (pack 'configure ...)}.
\end{quote}

\paragraph{\tt (pack 'configure [slave ...] [option])}

\begin{quote}
The arguments consist of one or more slave windows followed by pairs of
arguments that specify how to manage the slaves.  See ``THE PACKER
ALGORITHM'' below for details on how the options are used by the packer.
The following options are supported:
\begin{quote}
\par
{\tt :after  other}\\
{\tt :before other}
	\begin{quote}
                     {\tt Other} must the name of another window.   Use
                     its master as the master for the slaves, and
                     insert the slaves just after (or before)  {\tt other} 
		     in  the packing order.
	\end{quote}

\par
{\tt :anchor anchor}
	\begin{quote}
		     {\tt Anchor} must be a valid anchor position such as
                     ``{\tt n}'' or ``{\tt sw}''; it specifies where to
                     position each slave in its parcel.  Defaults to 
		     ``{\tt center}''.
	\end{quote}
\par
{\tt :expand boolean}
	\begin{quote}
                     Specifies   whether  the  slaves  should  be
                     expanded to consume  extra  space  in  their
                     master.  Defaults to {\tt \#f}.
	\end{quote}
\par
{\tt :fill style}
	\begin{quote}
	 If a  slave's  parcel  is  larger  than  its
	 requested  dimensions,  this  option  may be
	 used to stretch the slave.  {\tt Style} must  have
	 one of the following values:

	 \begin{description}
	  \item["none"]   Give  the slave its requested dimensions
		  plus  any  internal   padding
		 requested  with  {\tt :ipadx}  or  {\tt :ipady}.
		 This is the default.

	  \item["x"]  Stretch the  slave  horizontally  to
		 fill  the entire width of its parcel
		 (except leave  external  padding  as
		 specified by {\tt :padx}).

	  \item["y"]      Stretch the slave vertically to fill
		 the  entire  height  of  its  parcel
		 (except  leave  external  padding as
		 specified by {\tt :pady}).

	  \item["both"]   Stretch the slave both  horizontally
		 and vertically.
	 \end{description}
	 \end{quote}
\par
{\tt :in other} 
	\begin{quote} 
	Insert the slave(s) at the end of the packing
	order for the master window given by other.  
	\end{quote}

\par
{\tt :ipadx amount}\\
{\tt :ipady amount}
	\begin{quote}
	 {\tt Amount} specifies how much horizontal (or vertical) 
	 internal padding to leave on each side of the slave(s).  
	 {\tt Amount} must be a valid screen  distance, such as 2 or
	 ``.5c''. It defaults to 0.
	\end{quote}

\par
{\tt :padx amount}\\
{\tt :pady amount}  
	\begin{quote}
        {\tt Amount} specifies how much horizontal external
        padding to leave on each side of the slave(s).  {\tt Amount}
        defaults to 0.
	\end{quote}

\par
{\tt :side side}
	\begin{quote}
	Specifies which side of the master the slave(s) will be packed against.
	Must be ``{\tt left}'', ``{\tt right}'', ``{\tt top}'', or ``{\tt
	bottom}''.  Defaults to ``{\tt top}''.
	\end{quote}
\end{quote}
If no {\tt :in}, {\tt :after} or {\tt :before} option is specified then
each of the slaves will be inserted at the end of the packing list for its
parent unless it is already managed by the packer (in which case it will be
left where it is).  If one of these options is specified then all the
slaves will be inserted at the specified point.  If any of the slaves are
already managed by the geometry manager then any unspecified options for
them retain their previous values rather than receiving default values.
\end{quote}

\paragraph{\tt (pack 'newinfo slave)}
\begin{quote}
Returns a list whose elements are the current configuration state of the
slave given by slave in the same option-value form that might be specified
to {\tt pack 'configure}.  The first two elements of the list are ``{\tt
-in master}'' where master is the slave's {\tt master}.  Starting with Tk
4.0 this option will be renamed ``{\tt (pack 'info ...)}''.
\end{quote}

\paragraph{\tt (pack 'propagate master [boolean])}
\begin{quote}
If {\tt boolean} is {\tt \#t} then propagation is enabled for {\tt master},
which must be a window name (see ``GEOMETRY PROPAGATION'' below).  If {\tt
boolean} has a false boolean value then propagation is disabled for {\tt
master}.  In either of these cases an empty string is returned.  If {\tt boolean}
is omitted then the command returns 0 or 1 to indicate whether propagation
is currently enabled for {\tt master}.  Propagation is enabled by default.
\end{quote}

\paragraph{\tt (pack 'slaves master)}
\begin{quote}
Returns a list of all of the slaves in the packing order for {\tt master}.
The order of the slaves in the list is the same as their order in the
packing order.  If {\tt master} has no slaves then an empty string is
returned.
\end{quote}
\end{schemedoc}

\begin{schemedoc}{Description}

{\bf THE PACKER ALGORITHM} For each master the packer maintains an ordered
list of slaves called the {\em packing list}.  The {\tt :in}, {\tt
:after}, and {\tt :before} configuration options are used to specify the
master for each slave and the slave's position in the packing list.  If
none of these options is given for a slave then the slave is added to the
end of the packing list for its parent.

The packer arranges the slaves for a master by scanning the packing list in
order.  At the time it processes each slave, a rectangular area within the
master is still unallocated.  This area is called the {\em cavity}; for the
first slave it is the entire area of the master.

For each slave the packer carries out the following steps:

\begin{enumerate}
\item
The packer allocates a rectangular {\em parcel} for the slave
along the side of the cavity given by the slave's {\tt :side} option.
If the side is top or bottom then the width of the parcel is
the width of the cavity and its height is the requested height
of the slave plus the {\tt :ipady} and {\tt :pady} options.
For the left or right side the height of the parcel is
the height of the cavity and the width is the requested width
of the slave plus the {\tt :ipadx} and {\tt :padx} options.
The parcel may be enlarged further because of the {\tt :expand}
option (see ``EXPANSION'' below)

\item
The packer chooses the dimensions of the slave.
The width will normally be the slave's requested width plus
twice its {\tt :ipadx} option and the height will normally be
the slave's requested height plus twice its {\tt :ipady}
option.
However, if the {\tt :fill} option is ``{\tt x}'' or ``{\tt both}''
then the width of the slave is expanded to fill the width of the parcel,
minus twice the {\tt :padx} option.
If the {\tt :fill} option is ``{\tt y}'' or ``{\tt both}''
then the height of the slave is expanded to fill the width of the parcel,
minus twice the {\tt :pady} option.

\item
The packer positions the slave over its parcel.
If the slave is smaller than the parcel then the {\tt :anchor}
option determines where in the parcel the slave will be placed.
If {\tt :padx} or {\tt :pady} is non-zero, then the given
amount of external padding will always be left between the
slave and the edges of the parcel.
\end{enumerate}

Once a given slave has been packed, the area of its parcel is subtracted
from the cavity, leaving a smaller rectangular cavity for the next slave.
If a slave doesn't use all of its parcel, the unused space in the parcel
will not be used by subsequent slaves.  If the cavity should become too
small to meet the needs of a slave then the slave will be given whatever
space is left in the cavity.  If the cavity shrinks to zero size, then all
remaining slaves on the packing list will be unmapped from the screen until
the master window becomes large enough to hold them again.

{\bf EXPANSION} If a master window is so large that there will be extra
space left over after all of its slaves have been packed, then the extra
space is distributed uniformly among all of the slaves for which the {\tt
:expand} option is set.  Extra horizontal space is distributed among the
expandable slaves whose {\tt :side} is ``{\tt left}'' or ``{\tt right}'',
and extra vertical space is distributed among the expandable slaves whose
{\tt :side} is ``{\tt top}'' or ``{\tt bottom}''.

{\bf GEOMETRY PROPAGATION} The packer normally computes how large a master
must be to just exactly meet the needs of its slaves, and it sets the
requested width and height of the master to these dimensions.  This causes
geometry information to propagate up through a window hierarchy to a
top-level window so that the entire sub-tree sizes itself to fit the needs
of the leaf windows.  However, the {\tt pack 'propagate} command may be used
to turn off propagation for one or more masters.  If propagation is
disabled then the packer will not set the requested width and height of the
packer.  This may be useful if, for example, you wish for a master window
to have a fixed size that you specify.

{\bf RESTRICTIONS ON MASTER WINDOWS} The master for each slave must either
be the slave's parent (the default) or a descendant of the slave's parent.
This restriction is necessary to guarantee that the slave can be placed
over any part of its master that is visible without danger of the slave
being clipped by its parent.

{\bf PACKING ORDER} If the master for a slave is not its parent then you
must make sure that the slave is higher in the stacking order than the
master.  Otherwise the master will obscure the slave and it will appear as
if the slave hasn't been packed correctly.  The easiest way to make sure
the slave is higher than the master is to create the master window first:
the most recently created window will be highest in the stacking order.
Or, you can use the {\tt raise} and {\tt lower} commands to change the
stacking order of either the master or the slave.
\end{schemedoc}

\begin{schemedoc}{Result}
None
\end{schemedoc}

\begin{schemedoc}{Example}
\begin{verbatim}
(define b1 (make <Button> :text "a button"))
(define b2 (make <Button> :text "a button with a long text"))
(define b3 (make <Button> :text "expanded button"))
(define b4 (make <Button> :text "LARGE BUTTON")) 
(pack b1 b2)
(pack b3 :expand #t :fill "x")
(pack b4 :expand #t :fill "both" :side "right" :before b1)
\end{verbatim}
These calls to {\tt pack} will produce the output shown in
Figure~\ref{pack-options}.
\end{schemedoc}
\begin{figure}
\centerline{\epsfig{file={Packing-demo.ps}}}
\caption{Using the pack options}
\label{pack-options}
\end{figure}

\begin{schemedoc}{See also}
{\tt place}, {\tt unpack}
\end{schemedoc}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% PLACE
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\schemetitle{place}{procedure}

\begin{schemedoc}{Syntax}
\begin{verbatim}
place		l
\end{verbatim}
\end{schemedoc}

SEE TK MAN PAGE :-<

% \begin{schemedoc}{Arguments}
% \begin{description}
% \item[]
% \end{description}
% \end{schemedoc}
% 
% \begin{schemedoc}{Description}
% 
% \end{schemedoc}
% 
% \begin{schemedoc}{Result}
% 
% \end{schemedoc}
% 
% \begin{schemedoc}{Example}
% 
% \end{schemedoc}
% 
% \begin{schemedoc}{Note}
% 
% \end{schemedoc}
% 
% 
% \begin{schemedoc}{See also}
% 
% \end{schemedoc}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% UNPACK
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\schemetitle{unpack}{procedure}

\begin{schemedoc}{Syntax}
\begin{verbatim}
unpack  l
\end{verbatim}
\end{schemedoc}

\begin{schemedoc}{Arguments}
\begin{description}
\item[l] a list of widgets to unmap.
\end{description}
\end{schemedoc}

\begin{schemedoc}{Description}
{\tt Unpack} is a simple way to unmap the widgets of the {\tt l} list. 
This procedure calls in fact {\tt pack 'forget} procedure. After the execution
of this procedure the {\em pack} geometry manager will no longer manage
the geometry of given widgets.
\end{schemedoc}

\begin{schemedoc}{Result}
Undefined
\end{schemedoc}

\begin{schemedoc}{Example}
(define l1 (make <Label> :text "lab1"))
...
(define l5 (make <Label> :text "lab5"))
(destroy l1)             ;; Object is unmapped AND destroyed
(unpack l2 l3 l4 l5)      ;; Objects are ONLY unmapped
(class-name (class-of l1))
        --> <destroyed-object>
(class-name (class-of l2))
        --> <label>
\end{schemedoc}

%\begin{schemedoc}{Note}
%
%\end{schemedoc}

\begin{schemedoc}{See also}
{\tt place}, {\tt pack}, {\tt destroy}
\end{schemedoc}
% LocalWords:  sb bogosity ptr spraycan leftbutton ll lr tcross middlebutton ul
% LocalWords:  crosshair dotbox ur rightbutton xterm rtl logo tk slave's ipadx
% LocalWords:  ipady padx pady newinfo unmap
