\chapter{Standard Windowing Interface}

The modules in this chapter are available only on those systems where
the STDWIN library is available.  STDWIN runs on \UNIX{} under X11 and
on the Macintosh.  See CWI report CS-R8817.

\warning{Using STDWIN is not recommended for new
applications.  It has never been ported to Microsoft Windows or
Windows NT, and for X11 or the Macintosh it lacks important
functionality --- in particular, it has no tools for the construction
of dialogs.  For most platforms, alternative, native solutions exist
(though none are currently documented in this manual): Tkinter for
\UNIX{} under X11, native Xt with Motif or Athena widgets for \UNIX{}
under X11, Win32 for Windows and Windows NT, and a collection of
native toolkit interfaces for the Macintosh.}


\section{\module{stdwin} ---
         Platform-independent Graphical User Interface System}

\declaremodule{builtin}{stdwin}
\modulesynopsis{Older graphical user interface system for X11 and Macintosh.}


This module defines several new object types and functions that
provide access to the functionality of STDWIN.

On \UNIX{} running X11, it can only be used if the \envvar{DISPLAY}
environment variable is set or an explicit
\programopt{-display} \var{displayname} argument is passed to the
Python interpreter.

Functions have names that usually resemble their C STDWIN counterparts
with the initial `w' dropped.  Points are represented by pairs of
integers; rectangles by pairs of points.  For a complete description
of STDWIN please refer to the documentation of STDWIN for C
programmers (aforementioned CWI report).

\subsection{Functions Defined in Module \module{stdwin}}
\nodename{STDWIN Functions}

The following functions are defined in the \module{stdwin} module:

\begin{funcdesc}{open}{title}
Open a new window whose initial title is given by the string argument.
Return a window object; window object methods are described
below.\footnote{
	The Python version of STDWIN does not support draw procedures;
	all drawing requests are reported as draw events.}
\end{funcdesc}

\begin{funcdesc}{getevent}{}
Wait for and return the next event.
An event is returned as a triple: the first element is the event
type, a small integer; the second element is the window object to which
the event applies, or
\code{None}
if it applies to no window in particular;
the third element is type-dependent.
Names for event types and command codes are defined in the standard
module \refmodule{stdwinevents}.
\end{funcdesc}

\begin{funcdesc}{pollevent}{}
Return the next event, if one is immediately available.
If no event is available, return \code{()}.
\end{funcdesc}

\begin{funcdesc}{getactive}{}
Return the window that is currently active, or \code{None} if no
window is currently active.  (This can be emulated by monitoring
WE_ACTIVATE and WE_DEACTIVATE events.)
\end{funcdesc}

\begin{funcdesc}{listfontnames}{pattern}
Return the list of font names in the system that match the pattern (a
string).  The pattern should normally be \code{'*'}; returns all
available fonts.  If the underlying window system is X11, other
patterns follow the standard X11 font selection syntax (as used e.g.
in resource definitions), i.e. the wildcard character \code{'*'}
matches any sequence of characters (including none) and \code{'?'}
matches any single character.
On the Macintosh this function currently returns an empty list.
\end{funcdesc}

\begin{funcdesc}{setdefscrollbars}{hflag, vflag}
Set the flags controlling whether subsequently opened windows will
have horizontal and/or vertical scroll bars.
\end{funcdesc}

\begin{funcdesc}{setdefwinpos}{h, v}
Set the default window position for windows opened subsequently.
\end{funcdesc}

\begin{funcdesc}{setdefwinsize}{width, height}
Set the default window size for windows opened subsequently.
\end{funcdesc}

\begin{funcdesc}{getdefscrollbars}{}
Return the flags controlling whether subsequently opened windows will
have horizontal and/or vertical scroll bars.
\end{funcdesc}

\begin{funcdesc}{getdefwinpos}{}
Return the default window position for windows opened subsequently.
\end{funcdesc}

\begin{funcdesc}{getdefwinsize}{}
Return the default window size for windows opened subsequently.
\end{funcdesc}

\begin{funcdesc}{getscrsize}{}
Return the screen size in pixels.
\end{funcdesc}

\begin{funcdesc}{getscrmm}{}
Return the screen size in millimeters.
\end{funcdesc}

\begin{funcdesc}{fetchcolor}{colorname}
Return the pixel value corresponding to the given color name.
Return the default foreground color for unknown color names.
Hint: the following code tests whether you are on a machine that
supports more than two colors:
\begin{verbatim}
if stdwin.fetchcolor('black') <> \
          stdwin.fetchcolor('red') <> \
          stdwin.fetchcolor('white'):
    print 'color machine'
else:
    print 'monochrome machine'
\end{verbatim}
\end{funcdesc}

\begin{funcdesc}{setfgcolor}{pixel}
Set the default foreground color.
This will become the default foreground color of windows opened
subsequently, including dialogs.
\end{funcdesc}

\begin{funcdesc}{setbgcolor}{pixel}
Set the default background color.
This will become the default background color of windows opened
subsequently, including dialogs.
\end{funcdesc}

\begin{funcdesc}{getfgcolor}{}
Return the pixel value of the current default foreground color.
\end{funcdesc}

\begin{funcdesc}{getbgcolor}{}
Return the pixel value of the current default background color.
\end{funcdesc}

\begin{funcdesc}{setfont}{fontname}
Set the current default font.
This will become the default font for windows opened subsequently,
and is also used by the text measuring functions \function{textwidth()},
\function{textbreak()}, \function{lineheight()} and
\function{baseline()} below.  This accepts two more optional
parameters, size and style:  Size is the font size (in `points').
Style is a single character specifying the style, as follows:
\code{'b'} = bold,
\code{'i'} = italic,
\code{'o'} = bold + italic,
\code{'u'} = underline;
default style is roman.
Size and style are ignored under X11 but used on the Macintosh.
(Sorry for all this complexity --- a more uniform interface is being designed.)
\end{funcdesc}

\begin{funcdesc}{menucreate}{title}
Create a menu object referring to a global menu (a menu that appears in
all windows).
Methods of menu objects are described below.
Note: normally, menus are created locally; see the window method
\method{menucreate()} below.
\warning{The menu only appears in a window as long as the object
returned by this call exists.}
\end{funcdesc}

\begin{funcdesc}{newbitmap}{width, height}
Create a new bitmap object of the given dimensions.
Methods of bitmap objects are described below.
Not available on the Macintosh.
\end{funcdesc}

\begin{funcdesc}{fleep}{}
Cause a beep or bell (or perhaps a `visual bell' or flash, hence the
name).
\end{funcdesc}

\begin{funcdesc}{message}{string}
Display a dialog box containing the string.
The user must click OK before the function returns.
\end{funcdesc}

\begin{funcdesc}{askync}{prompt, default}
Display a dialog that prompts the user to answer a question with yes or
no.  Return 0 for no, 1 for yes.  If the user hits the Return key, the
default (which must be 0 or 1) is returned.  If the user cancels the
dialog, \exception{KeyboardInterrupt} is raised.
\end{funcdesc}

\begin{funcdesc}{askstr}{prompt, default}
Display a dialog that prompts the user for a string.
If the user hits the Return key, the default string is returned.
If the user cancels the dialog, \exception{KeyboardInterrupt} is
raised.
\end{funcdesc}

\begin{funcdesc}{askfile}{prompt, default, new}
Ask the user to specify a filename.  If \var{new} is zero it must be
an existing file; otherwise, it must be a new file.  If the user
cancels the dialog, \exception{KeyboardInterrupt} is raised.
\end{funcdesc}

\begin{funcdesc}{setcutbuffer}{i, string}
Store the string in the system's cut buffer number \var{i}, where it
can be found (for pasting) by other applications.  On X11, there are 8
cut buffers (numbered 0..7).  Cut buffer number 0 is the `clipboard'
on the Macintosh.
\end{funcdesc}

\begin{funcdesc}{getcutbuffer}{i}
Return the contents of the system's cut buffer number \var{i}.
\end{funcdesc}

\begin{funcdesc}{rotatecutbuffers}{n}
On X11, rotate the 8 cut buffers by \var{n}.  Ignored on the
Macintosh.
\end{funcdesc}

\begin{funcdesc}{getselection}{i}
Return X11 selection number \var{i.}  Selections are not cut buffers.
Selection numbers are defined in module \refmodule{stdwinevents}.
Selection \constant{WS_PRIMARY} is the \dfn{primary} selection (used
by \program{xterm}, for instance); selection \constant{WS_SECONDARY}
is the \dfn{secondary} selection; selection \constant{WS_CLIPBOARD} is
the \dfn{clipboard} selection (used by \program{xclipboard}).  On the
Macintosh, this always returns an empty string.
\end{funcdesc}

\begin{funcdesc}{resetselection}{i}
Reset selection number \var{i}, if this process owns it.  (See window
method \method{setselection()}).
\end{funcdesc}

\begin{funcdesc}{baseline}{}
Return the baseline of the current font (defined by STDWIN as the
vertical distance between the baseline and the top of the
characters).
\end{funcdesc}

\begin{funcdesc}{lineheight}{}
Return the total line height of the current font.
\end{funcdesc}

\begin{funcdesc}{textbreak}{str, width}
Return the number of characters of the string that fit into a space of
\var{width}
bits wide when drawn in the current font.
\end{funcdesc}

\begin{funcdesc}{textwidth}{str}
Return the width in bits of the string when drawn in the current font.
\end{funcdesc}

\begin{funcdesc}{connectionnumber}{}
\funcline{fileno}{}
(X11 under \UNIX{} only) Return the ``connection number'' used by the
underlying X11 implementation.  (This is normally the file number of
the socket.)  Both functions return the same value;
\method{connectionnumber()} is named after the corresponding function in
X11 and STDWIN, while \method{fileno()} makes it possible to use the
\module{stdwin} module as a ``file'' object parameter to
\function{select.select()}.  Note that if \constant{select()} implies that
input is possible on \module{stdwin}, this does not guarantee that an
event is ready --- it may be some internal communication going on
between the X server and the client library.  Thus, you should call
\function{stdwin.pollevent()} until it returns \code{None} to check for
events if you don't want your program to block.  Because of internal
buffering in X11, it is also possible that \function{stdwin.pollevent()}
returns an event while \function{select()} does not find \module{stdwin} to
be ready, so you should read any pending events with
\function{stdwin.pollevent()} until it returns \code{None} before entering
a blocking \function{select()} call.
\withsubitem{(in module select)}{\ttindex{select()}}
\end{funcdesc}

\subsection{Window Objects}
\nodename{STDWIN Window Objects}

Window objects are created by \function{stdwin.open()}.  They are closed
by their \method{close()} method or when they are garbage-collected.
Window objects have the following methods:

\begin{methoddesc}[window]{begindrawing}{}
Return a drawing object, whose methods (described below) allow drawing
in the window.
\end{methoddesc}

\begin{methoddesc}[window]{change}{rect}
Invalidate the given rectangle; this may cause a draw event.
\end{methoddesc}

\begin{methoddesc}[window]{gettitle}{}
Returns the window's title string.
\end{methoddesc}

\begin{methoddesc}[window]{getdocsize}{}
\begin{sloppypar}
Return a pair of integers giving the size of the document as set by
\method{setdocsize()}.
\end{sloppypar}
\end{methoddesc}

\begin{methoddesc}[window]{getorigin}{}
Return a pair of integers giving the origin of the window with respect
to the document.
\end{methoddesc}

\begin{methoddesc}[window]{gettitle}{}
Return the window's title string.
\end{methoddesc}

\begin{methoddesc}[window]{getwinsize}{}
Return a pair of integers giving the size of the window.
\end{methoddesc}

\begin{methoddesc}[window]{getwinpos}{}
Return a pair of integers giving the position of the window's upper
left corner (relative to the upper left corner of the screen).
\end{methoddesc}

\begin{methoddesc}[window]{menucreate}{title}
Create a menu object referring to a local menu (a menu that appears
only in this window).
Methods of menu objects are described below.
\warning{The menu only appears as long as the object
returned by this call exists.}
\end{methoddesc}

\begin{methoddesc}[window]{scroll}{rect, point}
Scroll the given rectangle by the vector given by the point.
\end{methoddesc}

\begin{methoddesc}[window]{setdocsize}{point}
Set the size of the drawing document.
\end{methoddesc}

\begin{methoddesc}[window]{setorigin}{point}
Move the origin of the window (its upper left corner)
to the given point in the document.
\end{methoddesc}

\begin{methoddesc}[window]{setselection}{i, str}
Attempt to set X11 selection number \var{i} to the string \var{str}.
(See \module{stdwin} function \function{getselection()} for the
meaning of \var{i}.)  Return true if it succeeds.
If  succeeds, the window ``owns'' the selection until
(a) another application takes ownership of the selection; or
(b) the window is deleted; or
(c) the application clears ownership by calling
\function{stdwin.resetselection(\var{i})}.  When another application
takes ownership of the selection, a \constant{WE_LOST_SEL} event is
received for no particular window and with the selection number as
detail.  Ignored on the Macintosh.
\end{methoddesc}

\begin{methoddesc}[window]{settimer}{dsecs}
Schedule a timer event for the window in \code{\var{dsecs}/10}
seconds.
\end{methoddesc}

\begin{methoddesc}[window]{settitle}{title}
Set the window's title string.
\end{methoddesc}

\begin{methoddesc}[window]{setwincursor}{name}
\begin{sloppypar}
Set the window cursor to a cursor of the given name.  It raises
\exception{RuntimeError} if no cursor of the given name exists.
Suitable names include
\code{'ibeam'},
\code{'arrow'},
\code{'cross'},
\code{'watch'}
and
\code{'plus'}.
On X11, there are many more (see \code{<X11/cursorfont.h>}).
\end{sloppypar}
\end{methoddesc}

\begin{methoddesc}[window]{setwinpos}{h, v}
Set the the position of the window's upper left corner (relative to
the upper left corner of the screen).
\end{methoddesc}

\begin{methoddesc}[window]{setwinsize}{width, height}
Set the window's size.
\end{methoddesc}

\begin{methoddesc}[window]{show}{rect}
Try to ensure that the given rectangle of the document is visible in
the window.
\end{methoddesc}

\begin{methoddesc}[window]{textcreate}{rect}
Create a text-edit object in the document at the given rectangle.
Methods of text-edit objects are described below.
\end{methoddesc}

\begin{methoddesc}[window]{setactive}{}
Attempt to make this window the active window.  If successful, this
will generate a WE_ACTIVATE event (and a WE_DEACTIVATE event in case
another window in this application became inactive).
\end{methoddesc}

\begin{methoddesc}[window]{close}{}
Discard the window object.  It should not be used again.
\end{methoddesc}

\subsection{Drawing Objects}

Drawing objects are created exclusively by the window method
\method{begindrawing()}.  Only one drawing object can exist at any
given time; the drawing object must be deleted to finish drawing.  No
drawing object may exist when \function{stdwin.getevent()} is called.
Drawing objects have the following methods:

\begin{methoddesc}[drawing]{box}{rect}
Draw a box just inside a rectangle.
\end{methoddesc}

\begin{methoddesc}[drawing]{circle}{center, radius}
Draw a circle with given center point and radius.
\end{methoddesc}

\begin{methoddesc}[drawing]{elarc}{center, (rh, rv), (a1, a2)}
Draw an elliptical arc with given center point.
\code{(\var{rh}, \var{rv})}
gives the half sizes of the horizontal and vertical radii.
\code{(\var{a1}, \var{a2})}
gives the angles (in degrees) of the begin and end points.
0 degrees is at 3 o'clock, 90 degrees is at 12 o'clock.
\end{methoddesc}

\begin{methoddesc}[drawing]{erase}{rect}
Erase a rectangle.
\end{methoddesc}

\begin{methoddesc}[drawing]{fillcircle}{center, radius}
Draw a filled circle with given center point and radius.
\end{methoddesc}

\begin{methoddesc}[drawing]{fillelarc}{center, (rh, rv), (a1, a2)}
Draw a filled elliptical arc; arguments as for \method{elarc()}.
\end{methoddesc}

\begin{methoddesc}[drawing]{fillpoly}{points}
Draw a filled polygon given by a list (or tuple) of points.
\end{methoddesc}

\begin{methoddesc}[drawing]{invert}{rect}
Invert a rectangle.
\end{methoddesc}

\begin{methoddesc}[drawing]{line}{p1, p2}
Draw a line from point
\var{p1}
to
\var{p2}.
\end{methoddesc}

\begin{methoddesc}[drawing]{paint}{rect}
Fill a rectangle.
\end{methoddesc}

\begin{methoddesc}[drawing]{poly}{points}
Draw the lines connecting the given list (or tuple) of points.
\end{methoddesc}

\begin{methoddesc}[drawing]{shade}{rect, percent}
Fill a rectangle with a shading pattern that is about
\var{percent}
percent filled.
\end{methoddesc}

\begin{methoddesc}[drawing]{text}{p, str}
Draw a string starting at point p (the point specifies the
top left coordinate of the string).
\end{methoddesc}

\begin{methoddesc}[drawing]{xorcircle}{center, radius}
\funcline{xorelarc}{center, (rh, rv), (a1, a2)}
\funcline{xorline}{p1, p2}
\funcline{xorpoly}{points}
Draw a circle, an elliptical arc, a line or a polygon, respectively,
in XOR mode.
\end{methoddesc}

\begin{methoddesc}[drawing]{setfgcolor}{}
\funcline{setbgcolor}{}
\funcline{getfgcolor}{}
\funcline{getbgcolor}{}
These functions are similar to the corresponding functions described
above for the \module{stdwin}
module, but affect or return the colors currently used for drawing
instead of the global default colors.
When a drawing object is created, its colors are set to the window's
default colors, which are in turn initialized from the global default
colors when the window is created.
\end{methoddesc}

\begin{methoddesc}[drawing]{setfont}{}
\funcline{baseline}{}
\funcline{lineheight}{}
\funcline{textbreak}{}
\funcline{textwidth}{}
These functions are similar to the corresponding functions described
above for the \module{stdwin}
module, but affect or use the current drawing font instead of
the global default font.
When a drawing object is created, its font is set to the window's
default font, which is in turn initialized from the global default
font when the window is created.
\end{methoddesc}

\begin{methoddesc}[drawing]{bitmap}{point, bitmap, mask}
Draw the \var{bitmap} with its top left corner at \var{point}.
If the optional \var{mask} argument is present, it should be either
the same object as \var{bitmap}, to draw only those bits that are set
in the bitmap, in the foreground color, or \code{None}, to draw all
bits (ones are drawn in the foreground color, zeros in the background
color).
Not available on the Macintosh.
\end{methoddesc}

\begin{methoddesc}[drawing]{cliprect}{rect}
Set the ``clipping region'' to a rectangle.
The clipping region limits the effect of all drawing operations, until
it is changed again or until the drawing object is closed.  When a
drawing object is created the clipping region is set to the entire
window.  When an object to be drawn falls partly outside the clipping
region, the set of pixels drawn is the intersection of the clipping
region and the set of pixels that would be drawn by the same operation
in the absence of a clipping region.
\end{methoddesc}

\begin{methoddesc}[drawing]{noclip}{}
Reset the clipping region to the entire window.
\end{methoddesc}

\begin{methoddesc}[drawing]{close}{}
\funcline{enddrawing}{}
Discard the drawing object.  It should not be used again.
\end{methoddesc}

\subsection{Menu Objects}

A menu object represents a menu.
The menu is destroyed when the menu object is deleted.
The following methods are defined:


\begin{methoddesc}[menu]{additem}{text, shortcut}
Add a menu item with given text.
The shortcut must be a string of length 1, or omitted (to specify no
shortcut).
\end{methoddesc}

\begin{methoddesc}[menu]{setitem}{i, text}
Set the text of item number \var{i}.
\end{methoddesc}

\begin{methoddesc}[menu]{enable}{i, flag}
Enable or disables item \var{i}.
\end{methoddesc}

\begin{methoddesc}[menu]{check}{i, flag}
Set or clear the \dfn{check mark} for item \var{i}.
\end{methoddesc}

\begin{methoddesc}[menu]{close}{}
Discard the menu object.  It should not be used again.
\end{methoddesc}

\subsection{Bitmap Objects}

A bitmap represents a rectangular array of bits.
The top left bit has coordinate (0, 0).
A bitmap can be drawn with the \method{bitmap()} method of a drawing object.
Bitmaps are currently not available on the Macintosh.

The following methods are defined:


\begin{methoddesc}[bitmap]{getsize}{}
Return a tuple representing the width and height of the bitmap.
(This returns the values that have been passed to the
\function{newbitmap()} function.)
\end{methoddesc}

\begin{methoddesc}[bitmap]{setbit}{point, bit}
Set the value of the bit indicated by \var{point} to \var{bit}.
\end{methoddesc}

\begin{methoddesc}[bitmap]{getbit}{point}
Return the value of the bit indicated by \var{point}.
\end{methoddesc}

\begin{methoddesc}[bitmap]{close}{}
Discard the bitmap object.  It should not be used again.
\end{methoddesc}

\subsection{Text-edit Objects}

A text-edit object represents a text-edit block.
For semantics, see the STDWIN documentation for \C{} programmers.
The following methods exist:


\begin{methoddesc}[text-edit]{arrow}{code}
Pass an arrow event to the text-edit block.
The \var{code} must be one of \constant{WC_LEFT}, \constant{WC_RIGHT}, 
\constant{WC_UP} or \constant{WC_DOWN} (see module
\refmodule{stdwinevents}).
\end{methoddesc}

\begin{methoddesc}[text-edit]{draw}{rect}
Pass a draw event to the text-edit block.
The rectangle specifies the redraw area.
\end{methoddesc}

\begin{methoddesc}[text-edit]{event}{type, window, detail}
Pass an event gotten from
\function{stdwin.getevent()}
to the text-edit block.
Return true if the event was handled.
\end{methoddesc}

\begin{methoddesc}[text-edit]{getfocus}{}
Return 2 integers representing the start and end positions of the
focus, usable as slice indices on the string returned by
\method{gettext()}.
\end{methoddesc}

\begin{methoddesc}[text-edit]{getfocustext}{}
Return the text in the focus.
\end{methoddesc}

\begin{methoddesc}[text-edit]{getrect}{}
Return a rectangle giving the actual position of the text-edit block.
(The bottom coordinate may differ from the initial position because
the block automatically shrinks or grows to fit.)
\end{methoddesc}

\begin{methoddesc}[text-edit]{gettext}{}
Return the entire text buffer.
\end{methoddesc}

\begin{methoddesc}[text-edit]{move}{rect}
Specify a new position for the text-edit block in the document.
\end{methoddesc}

\begin{methoddesc}[text-edit]{replace}{str}
Replace the text in the focus by the given string.
The new focus is an insert point at the end of the string.
\end{methoddesc}

\begin{methoddesc}[text-edit]{setfocus}{i, j}
Specify the new focus.
Out-of-bounds values are silently clipped.
\end{methoddesc}

\begin{methoddesc}[text-edit]{settext}{str}
Replace the entire text buffer by the given string and set the focus
to \code{(0, 0)}.
\end{methoddesc}

\begin{methoddesc}[text-edit]{setview}{rect}
Set the view rectangle to \var{rect}.  If \var{rect} is \code{None},
viewing mode is reset.  In viewing mode, all output from the text-edit
object is clipped to the viewing rectangle.  This may be useful to
implement your own scrolling text subwindow.
\end{methoddesc}

\begin{methoddesc}[text-edit]{close}{}
Discard the text-edit object.  It should not be used again.
\end{methoddesc}

\subsection{Example}
\nodename{STDWIN Example}

Here is a minimal example of using STDWIN in Python.
It creates a window and draws the string ``Hello world'' in the top
left corner of the window.
The window will be correctly redrawn when covered and re-exposed.
The program quits when the close icon or menu item is requested.

\begin{verbatim}
import stdwin
from stdwinevents import *

def main():
    mywin = stdwin.open('Hello')
    #
    while 1:
        (type, win, detail) = stdwin.getevent()
        if type == WE_DRAW:
            draw = win.begindrawing()
            draw.text((0, 0), 'Hello, world')
            del draw
        elif type == WE_CLOSE:
            break

main()
\end{verbatim}


\section{\module{stdwinevents} ---
         Constants for use with \module{stdwin}}

\declaremodule{standard}{stdwinevents}
\modulesynopsis{Constant definitions for use with \module{stdwin}}


This module defines constants used by STDWIN for event types
(\constant{WE_ACTIVATE} etc.), command codes (\constant{WC_LEFT} etc.)
and selection types (\constant{WS_PRIMARY} etc.).
Read the file for details.
Suggested usage is

\begin{verbatim}
>>> from stdwinevents import *
>>> 
\end{verbatim}


\section{\module{rect} ---
         Functions for use with \module{stdwin}}

\declaremodule{standard}{rect}
\modulesynopsis{Geometry-related utility function for use with
                \module{stdwin}.}


This module contains useful operations on rectangles.
A rectangle is defined as in module \refmodule{stdwin}:
a pair of points, where a point is a pair of integers.
For example, the rectangle

\begin{verbatim}
(10, 20), (90, 80)
\end{verbatim}

is a rectangle whose left, top, right and bottom edges are 10, 20, 90
and 80, respectively.  Note that the positive vertical axis points
down (as in \refmodule{stdwin}).

The module defines the following objects:

\begin{excdesc}{error}
The exception raised by functions in this module when they detect an
error.  The exception argument is a string describing the problem in
more detail.
\end{excdesc}

\begin{datadesc}{empty}
The rectangle returned when some operations return an empty result.
This makes it possible to quickly check whether a result is empty:

\begin{verbatim}
>>> import rect
>>> r1 = (10, 20), (90, 80)
>>> r2 = (0, 0), (10, 20)
>>> r3 = rect.intersect([r1, r2])
>>> if r3 is rect.empty: print 'Empty intersection'
Empty intersection
>>> 
\end{verbatim}
\end{datadesc}

\begin{funcdesc}{is_empty}{r}
Returns true if the given rectangle is empty.
A rectangle
\code{(\var{left}, \var{top}), (\var{right}, \var{bottom})}
is empty if
\begin{math}\var{left} \geq \var{right}\end{math} or
\begin{math}\var{top} \geq \var{bottom}\end{math}.
\end{funcdesc}

\begin{funcdesc}{intersect}{list}
Returns the intersection of all rectangles in the list argument.
It may also be called with a tuple argument.  Raises
\exception{rect.error} if the list is empty.  Returns
\constant{rect.empty} if the intersection of the rectangles is empty.
\end{funcdesc}

\begin{funcdesc}{union}{list}
Returns the smallest rectangle that contains all non-empty rectangles in
the list argument.  It may also be called with a tuple argument or
with two or more rectangles as arguments.  Returns
\constant{rect.empty} if the list is empty or all its rectangles are
empty.
\end{funcdesc}

\begin{funcdesc}{pointinrect}{point, rect}
Returns true if the point is inside the rectangle.  By definition, a
point \code{(\var{h}, \var{v})} is inside a rectangle
\code{(\var{left}, \var{top}), (\var{right}, \var{bottom})} if
\begin{math}\var{left} \leq \var{h} < \var{right}\end{math} and
\begin{math}\var{top} \leq \var{v} < \var{bottom}\end{math}.
\end{funcdesc}

\begin{funcdesc}{inset}{rect, (dh, dv)}
Returns a rectangle that lies inside the \var{rect} argument by
\var{dh} pixels horizontally and \var{dv} pixels vertically.  If
\var{dh} or \var{dv} is negative, the result lies outside \var{rect}.
\end{funcdesc}

\begin{funcdesc}{rect2geom}{rect}
Converts a rectangle to geometry representation:
\code{(\var{left}, \var{top}), (\var{width}, \var{height})}.
\end{funcdesc}

\begin{funcdesc}{geom2rect}{geom}
Converts a rectangle given in geometry representation back to the
standard rectangle representation
\code{(\var{left}, \var{top}), (\var{right}, \var{bottom})}.
\end{funcdesc}
