810 lines
30 KiB
TeX
810 lines
30 KiB
TeX
|
%
|
||
|
% Chapter Getting Started
|
||
|
%
|
||
|
% Author: Erick Gallesio [eg@kaolin.unice.fr]
|
||
|
% Creation date: 4-Nov-1992 15:37
|
||
|
% Last file update: 24-Jul-1996 16:28
|
||
|
|
||
|
\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
|
||
|
|