\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.

\strong{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.
\strong{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.
\strong{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}
