\setheader{{\it CHAPTER \thechapter: BASIC EVENT HANDLING}}{}{}{}{}{{\it CHAPTER \thechapter: BASIC EVENT HANDLING}}%
\setfooter{\thepage}{}{}{}{}{\thepage}%
-In which Pooh and Piglet come upon the sticky topic of event handling, and ask Owl to help.
+\section{Introduction}
+
+In most cases, wxWindows uses the concept of {\it event tables} to catch user input.
+
+An event table is placed in an implementation file to tell wxWindows how to map
+events to member functions. These member functions are not virtual functions, but
+they are all similar in form: they take a single wxEvent-derived argument, and have a void return
+type.
+
+Here's an example of an event table.
+
+\begin{verbatim}
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+ EVT_MENU (wxID_EXIT, MyFrame::OnExit)
+ EVT_MENU (DO_TEST, MyFrame::DoTest)
+ EVT_SIZE ( MyFrame::OnSize)
+ EVT_BUTTON (BUTTON1, MyFrame::OnButton1)
+END_EVENT_TABLE()
+\end{verbatim}
+
+The first two entries map menu commands to two different member functions. The EVT\_SIZE macro
+doesn't need a window identifier, since normally you are only interested in the
+current window's size events. (In fact you could intercept a particular window's size event
+by using EVT\_CUSTOM(wxEVT\_SIZE, id, func).)
+
+The EVT\_BUTTON macro demonstrates that the originating event does not have to come from
+the window class implementing the event table - if the event source is a button within a panel within a frame, this will still
+work, because event tables are searched up through the hierarchy of windows. In this
+case, the button's event table will be searched, then the parent panel's, then the frame's.
+
+As mentioned before, the member functions that handle events do not have to be virtual.
+Indeed, the member functions should not be virtual as the event handler ignores that
+the functions are virtual, i.e. overriding a virtual member function in a derived class
+will not have any effect.
+These member functions take an event argument, and the class of event differs according
+to the type of event and the class of the originating window. For size
+events, \wxhelpref{wxSizeEvent}{wxsizeevent} is used. For menu commands and most control
+commands (such as button presses), \wxhelpref{wxCommandEvent}{wxcommandevent} is used.
+When controls get more complicated, then specific event classes are used, such
+as \wxhelpref{wxTreeEvent}{wxtreeevent} for events from \wxhelpref{wxTreeCtrl}{wxtreectrl} windows.
+
+As well as the event table in the implementation file, there must be a DECLARE\_EVENT\_TABLE
+macro in the class definition. For example:
+
+{\small%
+\begin{verbatim}
+class MyFrame: public wxFrame {
+
+ DECLARE_DYNAMIC_CLASS(MyFrame)
+
+public:
+ ...
+ void OnExit(wxCommandEvent& event);
+ void OnSize(wxSizeEvent& event);
+protected:
+ int m_count;
+ ...
+ DECLARE_EVENT_TABLE()
+};
+\end{verbatim}
+}%
+
+\section{How events are processed}\label{eventprocessing}
+
+When an event is received from the windowing system, wxWindows calls \wxhelpref{wxEvtHandler::ProcessEvent}{wxevthandlerprocessevent} on
+the first event handler object belonging to the window generating the event.
+
+It may be noted that wxWindows' event processing system implements something
+very close to virtual methods in normal C++, i.e. it is possible to alter
+the behaviour of a class by overriding its event handling functions. In
+many cases this works even for changing the behaviour of native controls.
+For example it is possible to filter out a number of key events sent by the
+system to a native text control by overriding wxTextCtrl and defining a
+handler for key events using EVT\_KEY\_DOWN. This would indeed prevent
+any key events from being sent to the native control - which might not be
+what is desired. In this case the event handler function has to call Skip()
+so as to indicate that the search for the event handler should continue.
+
+To summarize, instead of explicitly calling the base class version as you
+would have done with C++ virtual functions (i.e. {\it wxTextCtrl::OnChar()}),
+you should instead call \wxhelpref{wxEvent::Skip}{wxeventskip}.
+
+In practice, this would look like the following if the derived text control only
+accepts 'a' to 'z' and 'A' to 'Z':
+
+{\small%
+\begin{verbatim}
+void MyTextCtrl::OnChar(wxKeyEvent& event)
+{
+ if ( isalpha( event.KeyCode() ) )
+ {
+ // key code is within legal range. we call event.Skip() so the
+ // event can be processed either in the base wxWindows class
+ // or the native control.
+
+ event.Skip();
+ }
+ else
+ {
+ // illegal key hit. we don't call event.Skip() so the
+ // event is not processed anywhere else.
+
+ wxBell();
+ }
+}
+\end{verbatim}
+}%
+
+
+The normal order of event table searching by ProcessEvent is as follows:
+
+\begin{enumerate}\itemsep=0pt
+\item If the object is disabled (via a call to \wxhelpref{wxEvtHandler::SetEvtHandlerEnabled}{wxevthandlersetevthandlerenabled})
+the function skips to step (6).
+\item If the object is a wxWindow, {\bf ProcessEvent} is recursively called on the window's\rtfsp
+\wxhelpref{wxValidator}{wxvalidator}. If this returns TRUE, the function exits.
+\item {\bf SearchEventTable} is called for this event handler. If this fails, the base
+class table is tried, and so on until no more tables exist or an appropriate function was found,
+in which case the function exits.
+\item The search is applied down the entire chain of event handlers (usually the chain has a length
+of one). If this succeeds, the function exits.
+\item If the object is a wxWindow and the event is a wxCommandEvent, {\bf ProcessEvent} is
+recursively applied to the parent window's event handler. If this returns TRUE, the function exits.
+\item Finally, {\bf ProcessEvent} is called on the wxApp object.
+\end{enumerate}
+
+{\bf Pay close attention to Step 5.} People often overlook or get
+confused by this powerful feature of the wxWindows event processing
+system. To put it a different way, events derived either directly or
+indirectly from wxCommandEvent will travel up the containment
+hierarchy from child to parent until an event handler is found that
+doesn't call event.Skip(). Events not derived from wxCommandEvent are
+sent only to the window they occurred in and then stop.
+
+Typically events that deal with a window as a window (size, motion,
+paint, mouse, keyboard, etc.) are sent only to the window. Events
+that have a higher level of meaning and/or are generated by the window
+itself, (button click, menu select, tree expand, etc.) are command
+events and are sent up to the parent to see if it is interested in the
+event.
+
+Note that your application may wish to override ProcessEvent to redirect processing of
+events. This is done in the document/view framework, for example, to allow event handlers
+to be defined in the document or view. To test for command events (which will probably
+be the only events you wish to redirect), you may use wxEvent::IsCommandEvent for
+efficiency, instead of using the slower run-time type system.
+
+As mentioned above, only command events are recursively applied to the parents event
+handler. As this quite often causes confusion for users, here is a list of system
+events which will {\it not} get sent to the parent's event handler:
+
+\begin{twocollist}\itemsep=0pt
+\twocolitem{\wxhelpref{wxEvent}{wxevent}}{The event base class}
+\twocolitem{\wxhelpref{wxActivateEvent}{wxactivateevent}}{A window or application activation event}
+\twocolitem{\wxhelpref{wxCloseEvent}{wxcloseevent}}{A close window or end session event}
+\twocolitem{\wxhelpref{wxEraseEvent}{wxeraseevent}}{An erase background event}
+\twocolitem{\wxhelpref{wxFocusEvent}{wxfocusevent}}{A window focus event}
+\twocolitem{\wxhelpref{wxKeyEvent}{wxkeyevent}}{A keypress event}
+\twocolitem{\wxhelpref{wxIdleEvent}{wxidleevent}}{An idle event}
+\twocolitem{\wxhelpref{wxInitDialogEvent}{wxinitdialogevent}}{A dialog initialisation event}
+\twocolitem{\wxhelpref{wxJoystickEvent}{wxjoystickevent}}{A joystick event}
+\twocolitem{\wxhelpref{wxMenuEvent}{wxmenuevent}}{A menu event}
+\twocolitem{\wxhelpref{wxMouseEvent}{wxmouseevent}}{A mouse event}
+\twocolitem{\wxhelpref{wxMoveEvent}{wxmoveevent}}{A move event}
+\twocolitem{\wxhelpref{wxPaintEvent}{wxpaintevent}}{A paint event}
+\twocolitem{\wxhelpref{wxQueryLayoutInfoEvent}{wxquerylayoutinfoevent}}{Used to query layout information}
+\twocolitem{\wxhelpref{wxSizeEvent}{wxsizeevent}}{A size event}
+\twocolitem{\wxhelpref{wxScrollWinEvent}{wxscrollwinevent}}{A scroll event sent by a scrolled window (not a scroll bar)}
+\twocolitem{\wxhelpref{wxSysColourChangedEvent}{wxsyscolourchangedevent}}{A system colour change event}
+\twocolitem{\wxhelpref{wxUpdateUIEvent}{wxupdateuievent}}{A user interface update event}
+\end{twocollist}
+
+In some cases, it might be desired by the programmer to get a certain number
+of system events in a parent window, for example all key events sent to, but not
+used by, the native controls in a dialog. In this case, a special event handler
+will have to be written that will override ProcessEvent() in order to pass
+all events (or any selection of them) to the parent window.
+
+% VZ: it doesn't work like this, but just in case we ever reenable this
+% behaviour, I leave it here
+%
+% \section{Redirection of command events to the window with the focus}
+%
+% The usual upward search through the window hierarchy for command event
+% handlers does not always meet an application's requirements. Say you have two
+% wxTextCtrl windows in a frame, plus a toolbar with Cut, Copy and Paste
+% buttons. To avoid the need to define event handlers in the frame
+% and redirect them explicitly to the window with the focus, command events
+% are sent to the window with the focus first, for
+% menu and toolbar command and UI update events only. This means that
+% each window can handle its own commands and UI updates independently. In
+% fact wxTextCtrl can handle Cut, Copy, Paste, Undo and Redo commands and UI update
+% requests, so no extra coding is required to support them in your menus and
+% toolbars.
+
+\section{Pluggable event handlers}
+
+In fact, you don't have to derive a new class from a window class
+if you don't want to. You can derive a new class from wxEvtHandler instead,
+defining the appropriate event table, and then call
+\rtfsp\wxhelpref{wxWindow::SetEventHandler}{wxwindowseteventhandler} (or, preferably,
+\rtfsp\wxhelpref{wxWindow::PushEventHandler}{wxwindowpusheventhandler}) to make this
+event handler the object that responds to events. This way, you can avoid
+a lot of class derivation, and use the same event handler object to
+handle events from instances of different classes. If you ever have to call a window's event handler
+manually, use the GetEventHandler function to retrieve the window's event handler and use that
+to call the member function. By default, GetEventHandler returns a pointer to the window itself
+unless an application has redirected event handling using SetEventHandler or PushEventHandler.
+
+One use of PushEventHandler is to temporarily or permanently change the
+behaviour of the GUI. For example, you might want to invoke a dialog editor
+in your application that changes aspects of dialog boxes. You can
+grab all the input for an existing dialog box, and edit it `in situ',
+before restoring its behaviour to normal. So even if the application
+has derived new classes to customize behaviour, your utility can indulge
+in a spot of body-snatching. It could be a useful technique for on-line
+tutorials, too, where you take a user through a serious of steps and
+don't want them to diverge from the lesson. Here, you can examine the events
+coming from buttons and windows, and if acceptable, pass them through to
+the original event handler. Use PushEventHandler/PopEventHandler
+to form a chain of event handlers, where each handler processes a different
+range of events independently from the other handlers.
+
+\section{Window identifiers}\label{windowids}
+
+\index{identifiers}\index{wxID}Window identifiers are integers, and are used to uniquely determine window identity in the
+event system (though you can use it for other purposes). In fact, identifiers do not need
+to be unique across your entire application just so long as they are unique within a particular context you're interested
+in, such as a frame and its children. You may use the wxID\_OK identifier, for example, on
+any number of dialogs so long as you don't have several within the same dialog.
+
+If you pass -1 to a window constructor, an identifier will be generated for you, but beware:
+if things don't respond in the way they should, it could be because of an id conflict. It is safer
+to supply window ids at all times. Automatic generation of identifiers starts at 1 so may well conflict
+with your own identifiers.
+
+The following standard identifiers are supplied. You can use wxID\_HIGHEST to determine the
+number above which it is safe to define your own identifiers. Or, you can use identifiers below
+wxID\_LOWEST.
+
+\begin{verbatim}
+#define wxID_LOWEST 4999
+
+#define wxID_OPEN 5000
+#define wxID_CLOSE 5001
+#define wxID_NEW 5002
+#define wxID_SAVE 5003
+#define wxID_SAVEAS 5004
+#define wxID_REVERT 5005
+#define wxID_EXIT 5006
+#define wxID_UNDO 5007
+#define wxID_REDO 5008
+#define wxID_HELP 5009
+#define wxID_PRINT 5010
+#define wxID_PRINT_SETUP 5011
+#define wxID_PREVIEW 5012
+#define wxID_ABOUT 5013
+#define wxID_HELP_CONTENTS 5014
+#define wxID_HELP_COMMANDS 5015
+#define wxID_HELP_PROCEDURES 5016
+#define wxID_HELP_CONTEXT 5017
+
+#define wxID_CUT 5030
+#define wxID_COPY 5031
+#define wxID_PASTE 5032
+#define wxID_CLEAR 5033
+#define wxID_FIND 5034
+#define wxID_DUPLICATE 5035
+#define wxID_SELECTALL 5036
+
+#define wxID_FILE1 5050
+#define wxID_FILE2 5051
+#define wxID_FILE3 5052
+#define wxID_FILE4 5053
+#define wxID_FILE5 5054
+#define wxID_FILE6 5055
+#define wxID_FILE7 5056
+#define wxID_FILE8 5057
+#define wxID_FILE9 5058
+
+#define wxID_OK 5100
+#define wxID_CANCEL 5101
+#define wxID_APPLY 5102
+#define wxID_YES 5103
+#define wxID_NO 5104
+#define wxID_STATIC 5105
+
+#define wxID_HIGHEST 5999
+\end{verbatim}
+
+\section{Event macros summary}\label{eventmacros}
+
+\wxheading{Generic event table macros}
+
+\twocolwidtha{8cm}%
+\begin{twocollist}\itemsep=0pt
+\twocolitem{\windowstyle{EVT\_CUSTOM(event, id, func)}}{Allows you to add a custom event table
+entry by specifying the event identifier (such as wxEVT\_SIZE), the window identifier,
+and a member function to call.}
+\twocolitem{\windowstyle{EVT\_CUSTOM\_RANGE(event, id1, id2, func)}}{The same as EVT\_CUSTOM,
+but responds to a range of window identifiers.}
+\twocolitem{\windowstyle{EVT\_COMMAND(id, event, func)}}{The same as EVT\_CUSTOM, but
+expects a member function with a wxCommandEvent argument.}
+\twocolitem{\windowstyle{EVT\_COMMAND\_RANGE(id1, id2, event, func)}}{The same as EVT\_CUSTOM\_RANGE, but
+expects a member function with a wxCommandEvent argument.}
+\end{twocollist}
+
+\wxheading{Macros listed by event class}
+
+The documentation for specific event macros is organised by event class. Please refer
+to these sections for details.
+
+\twocolwidtha{8cm}%
+\begin{twocollist}\itemsep=0pt
+\twocolitem{\wxhelpref{wxActivateEvent}{wxactivateevent}}{The EVT\_ACTIVATE and EVT\_ACTIVATE\_APP macros intercept
+activation and deactivation events.}
+\twocolitem{\wxhelpref{wxCommandEvent}{wxcommandevent}}{A range of commonly-used control events.}
+\twocolitem{\wxhelpref{wxCloseEvent}{wxcloseevent}}{The EVT\_CLOSE macro handles window closure
+called via \wxhelpref{wxWindow::Close}{wxwindowclose}.}
+\twocolitem{\wxhelpref{wxDropFilesEvent}{wxdropfilesevent}}{The EVT\_DROP\_FILES macros handles
+file drop events.}
+\twocolitem{\wxhelpref{wxEraseEvent}{wxeraseevent}}{The EVT\_ERASE\_BACKGROUND macro is used to handle window erase requests.}
+\twocolitem{\wxhelpref{wxFocusEvent}{wxfocusevent}}{The EVT\_SET\_FOCUS and EVT\_KILL\_FOCUS macros are used to handle keyboard focus events.}
+\twocolitem{\wxhelpref{wxKeyEvent}{wxkeyevent}}{EVT\_CHAR and EVT\_CHAR\_HOOK macros handle keyboard
+input for any window.}
+\twocolitem{\wxhelpref{wxIdleEvent}{wxidleevent}}{The EVT\_IDLE macro handle application idle events
+(to process background tasks, for example).}
+\twocolitem{\wxhelpref{wxInitDialogEvent}{wxinitdialogevent}}{The EVT\_INIT\_DIALOG macro is used
+to handle dialog initialisation.}
+\twocolitem{\wxhelpref{wxListEvent}{wxlistevent}}{These macros handle \wxhelpref{wxListCtrl}{wxlistctrl} events.}
+\twocolitem{\wxhelpref{wxMenuEvent}{wxmenuevent}}{These macros handle special menu events (not menu commands).}
+\twocolitem{\wxhelpref{wxMouseEvent}{wxmouseevent}}{Mouse event macros can handle either individual
+mouse events or all mouse events.}
+\twocolitem{\wxhelpref{wxMoveEvent}{wxmoveevent}}{The EVT\_MOVE macro is used to handle a window move.}
+\twocolitem{\wxhelpref{wxPaintEvent}{wxpaintevent}}{The EVT\_PAINT macro is used to handle window paint requests.}
+\twocolitem{\wxhelpref{wxScrollEvent}{wxscrollevent}}{These macros are used to handle scroll events from
+\wxhelpref{wxScrollBar}{wxscrollbar}, \wxhelpref{wxSlider}{wxslider},and \wxhelpref{wxSpinButton}{wxspinbutton}.}
+\twocolitem{\wxhelpref{wxSizeEvent}{wxsizeevent}}{The EVT\_SIZE macro is used to handle a window resize.}
+\twocolitem{\wxhelpref{wxSplitterEvent}{wxsplitterevent}}{The EVT\_SPLITTER\_SASH\_POS\_CHANGED, EVT\_SPLITTER\_UNSPLIT
+and EVT\_SPLITTER\_DOUBLECLICKED macros are used to handle the various splitter window events.}
+\twocolitem{\wxhelpref{wxSysColourChangedEvent}{wxsyscolourchangedevent}}{The EVT\_SYS\_COLOUR\_CHANGED macro is used to handle
+events informing the application that the user has changed the system colours (Windows only).}
+\twocolitem{\wxhelpref{wxTreeEvent}{wxtreeevent}}{These macros handle \wxhelpref{wxTreeCtrl}{wxtreectrl} events.}
+\twocolitem{\wxhelpref{wxUpdateUIEvent}{wxupdateuievent}}{The EVT\_UPDATE\_UI macro is used to handle user interface
+update pseudo-events, which are generated to give the application the chance to update the visual state of menus,
+toolbars and controls.}
+\end{twocollist}
\setheader{{\it CHAPTER \thechapter: INSTALLING wxWINDOWS}}{}{}{}{}{{\it CHAPTER \thechapter: INSTALLING wxWINDOWS}}%
\setfooter{\thepage}{}{}{}{}{\thepage}%
-Installing wxWindows (and what tools to use).
+CONTENTS: Installing wxWindows (and what tools to use).
+
+Installing wxWindows isn't too hard. Each platform has a different method, so we'll look
+at each major platform in turn.
+
+\section{Unix: GTK+ and Motif}\label{installunix}
+
+\subsection{The most simple case}
+
+If you are compile wxWindows on Linux for the first time and don't like to read
+install instructions, just do this in the base directory:
+
+\begin{verbatim}
+ ./configure --with-gtk
+ make
+ su <type root password>
+ make install
+ ldconfig
+ exit
+\end{verbatim}
+
+This is using the GTK+ port. If using the Motif port, type --with-motif instead of --with-gtk.
+
+Afterwards you can continue with:
+
+\begin{verbatim}
+ make
+ su <type root password>
+ make install
+ ldconfig
+ exit
+\end{verbatim}
+
+If you want to remove wxWindows on Unix you can do this:
+
+\begin{verbatim}
+ su <type root password>
+ make uninstall
+ ldconfig
+ exit
+\end{verbatim}
+
+\subsection{The expert case}
+
+If you want to do some more serious cross-platform programming with wxWindows,
+such as for GTK and Motif, you can now build two complete libraries and use
+them concurrently. For this end, you have to create a directory for each build
+of wxWindows - you may also want to create different versions of wxWindows
+and test them concurrently. Most typically, this would be a version configured
+with --enable-debug\_flag and one without. Note, that only one build can currently
+be installed, so you'd have to use a local version of the library for that purpose.
+For building three versions (one for GTK+, one for Motif and a debug GTK+ version) you'd do this:
+
+\begin{verbatim}
+ md buildmotif
+ cd buildmotif
+ ../configure --with-motif
+ make
+ cd ..
+
+ md buildgtk
+ cd buildgtk
+ ../configure --with-gtk
+ make
+ cd ..
+
+ md buildgtkd
+ cd buildgtkd
+ ../configure --with-gtk --enable-debug_flag
+ make
+ cd ..
+\end{verbatim}
+
+\subsection{The most simple errors}
+
+\begin{itemize}\itemsep=0pt
+\item Configure reports, that you don't have GTK 1.2 installed although you are
+very sure you have. Well, you have installed it, but you also have another
+version of the GTK installed, which you may need to remove including other
+versions of glib (and its headers). Also, look for the PATH variable and check
+if it includes the path to the correct gtk-config! The check your LDPATH if it
+points to the correct library. There is no way to compile wxGTK if configure
+doesn't pass this test as all this test does is compile and link a GTK program.
+\item You get errors during compilation: The reason is that you probably have a broken
+compiler, which includes almost everything that is called gcc. If you use gcc 2.8
+you have to disable optimsation as the compiler will give up with an internal
+compiler error.You get immediate segfault when starting any sample or application: This is either
+due to having compiled the library with different flags or options than your program -
+typically you might have the __WXDEBUG__ option set for the library but not for your
+program - or due to using a broken compiler (and its optimisation) such as GCC 2.8.
+\end{itemize}
+
+\subsection{The most simple program}
+
+Now create your super-application myfoo.app and compile anywhere with:
+
+\begin{verbatim}
+ gcc myfoo.cpp `wx-config --libs --cflags` -o myfoo
+\end{verbatim}
+
+\wxheading{General}
+
+The Unix variants of wxWindows use GNU configure. If you have problems with your
+make use GNU make instead.
+
+If you have general problems with installation, visit Robert Roebling's homepage at
+
+\begin{verbatim}
+ http://wesley.informatik.uni-freiburg.de/~wxxt
+\end{verbatim}
+
+for the latest information. If you still don't have any success, please send a bug
+report to one of the mailing lists.
+
+\wxheading{Libraries needed}
+
+wxWindows/GTK requires the GTK+ library to be installed on your system. It has to
+be a stable version, preferebly version 1.2.3.
+
+You can get the newest version of the GTK+ from the GTK homepage at:
+
+\begin{verbatim}
+ http://www.gtk.org
+\end{verbatim}
+
+wxWindows/Gtk requires a thread library and X libraries known to work with threads.
+This is the case on all commercial Unix-Variants and all Linux-Versions that are
+based on glibc 2 except RedHat 5.0 which is broken in many aspects. As of writing
+this, these Linux distributions have correct glibc 2 support:
+
+\begin{itemize}\itemsep=0pt
+\item RedHat 5.1
+\item Debian 2.0
+\item Stampede
+\item DLD 6.0
+\item SuSE 6.0
+\end{itemize}
+
+You can disable thread support by running
+
+\begin{verbatim}
+./configure "--disable-threads"
+make
+su <type root password>
+make install
+ldconfig
+exit
+\end{verbatim}
+
+\subsection{Building wxGTK on OS/2}
+
+Please send comments and question about the OS/2 installation
+to Andrea Venturoli <a.ventu@flashnet.it> and patches to
+the wxWindows mailing list.
+
+You'll need OS/2 Warp (4.00FP#6), X-Free86/2 (3.3.3 or newer),
+GTK+ (1.2.5 or newer), emx (0.9d fix 1), flex (2.5.4), yacc (1.8),
+korn shell (5.2.13), Autoconf (2.13), GNU file utilities (3.6),
+GNU text utilities (1.3), GNU shell utilites (1.12), m4 (1.4),
+sed (2.05), grep (2.0), Awk (3.0.3), GNU Make (3.76.1).
+
+Open an OS/2 prompt and switch to the directory above.
+First set some global environment variables we need:
+
+\begin{verbatim}
+ SET CXXFLAGS=-Zmtd -D__ST_MT_ERRNO__
+ SET CFLAGS=-Zmtd -D__ST_MT_ERRNO__
+ SET OSTYPE=OS2X
+ SET COMSPEC=sh
+ \end{verbatim}
+
+Notice you can choose whatever you want, if you don't like OS2X.
+
+Now, run autoconf in the main directory and in the samples, demos
+and utils subdirectory. This will generate the OS/2 specific
+versions of the configure scripts. Now run
+
+\begin{verbatim}
+ configure --with-gtk
+\end{verbatim}
+
+as described above.
+
+If you have pthreads library installed, but have a gtk version
+which does not yet support threading, you need to explicitly
+diable threading by using the option --disable-threads.
+
+Note that configure assumes your flex will generate files named
+"lexyy.c", not "lex.yy.c". If you have a version which does
+generate "lex.yy.c", you need to manually change the generated
+makefile.
+
+\subsection{Building wxGTK on SGI}
+
+Using the SGI native compilers, it is recommended that you
+also set CFLAGS and CXXFLAGS before running configure. These
+should be set to:
+
+\begin{verbatim}
+ CFLAGS="-mips3 -n32"
+ CXXFLAGS="-mips3 -n32"
+\end{verbatim}
+
+This is essential if you want to use the resultant binaries
+on any other machine than the one it was compiled on. If you
+have a 64-bit machine (Octane) you should also do this to ensure
+you don't accidently build the libraries as 64bit (which is
+untested).
+
+The SGI native compiler support has only been tested on Irix 6.5.
+
+\subsection{Create your configuration}
+
+Usage:
+
+\begin{verbatim}
+ ./configure options
+\end{verbatim}
+
+If you want to use system's C and C++ compiler,
+set environment variables CC and CCC as
+
+\begin{verbatim}
+ setenv CC cc
+ setenv CCC CC
+ ./configure options
+\end{verbatim}
+
+to see all the options please use:
+
+\begin{verbatim}
+ ./configure --help
+\end{verbatim}
+
+The basic philosophy is that if you want to use different
+configurations, like a debug and a release version,
+or use the same source tree on different systems,
+you have only to change the environment variable OSTYPE.
+(Sadly this variable is not set by default on some systems
+in some shells - on SGI's for example). So you will have to
+set it there. This variable HAS to be set before starting
+configure, so that it knows which system it tries to
+configure for.
+
+Configure (and sometimes make) will complain if the system variable OSTYPE has
+not been defined.
+
+\subsubsection{General options}
+
+Given below are the commands to change the default behaviour,
+i.e. if it says "--disable-threads" it means that threads
+are enabled by default.
+
+Normally, you won't have to choose a toolkit, because when
+you download wxGTK, it will default to --with-gtk etc. But
+if you use all of our CVS repository you have to choose a
+toolkit. You must do this by running configure with either of:
+
+\begin{verbatim}
+ --without-gtk Don't use the GIMP ToolKit (GTK)
+
+ --with-motif Use either Motif or Lesstif
+ Configure will look for both.
+\end{verbatim}
+
+The following options handle the kind of library you want to build.
+
+\begin{verbatim}
+ --disable-threads Compile without thread support.
+
+ --disable-shared Do not create shared libraries.
+
+ --enable-static Create static libraries.
+
+ --disable-optimise Do not optimise the code. Can
+ sometimes be useful for debugging
+ and is required on some architectures
+ such as Sun with gcc 2.8.X which
+ and otherwise produce segvs.
+
+ --enable-profile Add profiling info to the object
+ files. Currently broken, I think.
+
+ --enable-no_rtti Enable compilation without creation of
+ C++ RTTI information in object files.
+ This will speed-up compilation and reduce
+ binary size.
+
+ --enable-no_exceptions Enable compilation without creation of
+ C++ exception information in object files.
+ This will speed-up compilation and reduce
+ binary size. Also fewer crashes during the
+ actual compilation...
+
+ --enable-no_deps Enable compilation without creation of
+ dependency information.
+
+ --enable-permissive Enable compilation without creation of
+ giving erros as soon as you compile with
+ Solaris' ANSI-defying headers.
+
+ --enable-mem_tracing Add built-in memory tracing.
+
+ --enable-dmalloc Use the dmalloc memory debugger.
+ Read more at www.letters.com/dmalloc/
+
+ --enable-debug_info Add debug info to object files and
+ executables for use with debuggers
+ such as gdb (or its many frontends).
+
+ --enable-debug_flag Define __DEBUG__ and __WXDEBUG__ when
+ compiling. This enable wxWindows' very
+ useful internal debugging tricks (such
+ as automatically reporting illegal calls)
+ to work. Note that program and library
+ must be compiled with the same debug
+ options.
+\end{verbatim}
+
+\subsubsection{Feature Options}
+
+When producing an executable that is linked statically with wxGTK
+you'll be surprised at its immense size. This can sometimes be
+drastically reduced by removing features from wxWindows that
+are not used in your program. The most relevant such features
+are
+
+\begin{verbatim}
+ --with-odbc Enables ODBC code. This is disabled
+ by default because iODBC is under the
+ L-GPL license.
+
+ --without-libpng Disables PNG image format code.
+
+ --without-libjpeg Disables JPEG image format code.
+
+ --without-libtiff Disables TIFF image format code.
+
+ --disable-pnm Disables PNM image format code.
+
+ --disable-gif Disables GIF image format code.
+
+ --disable-pcx Disables PCX image format code.
+
+ --disable-resources Disables the use of *.wxr type
+ resources.
+
+ --disable-threads Disables threads. Will also
+ disable sockets.
+
+ --disable-sockets Disables sockets.
+
+ --disable-dnd Disables Drag'n'Drop.
+
+ --disable-clipboard Disables Clipboard.
+
+ --disable-serial Disables object instance serialiasation.
+
+ --disable-streams Disables the wxStream classes.
+
+ --disable-file Disables the wxFile class.
+
+ --disable-textfile Disables the wxTextFile class.
+
+ --disable-intl Disables the internationalisation.
+
+ --disable-validators Disables validators.
+
+ --disable-accel Disables accel.
+\end{verbatim}
+
+Apart from disabling certain features you can very often "strip"
+the program of its debugging information resulting in a significant
+reduction in size.
+
+\subsubsection{Compiling}
+
+The following must be done in the base directory (e.g. ~/wxGTK
+or ~/wxWin or whatever)
+
+Now the makefiles are created (by configure) and you can compile
+the library by typing:
+
+\begin{verbatim}
+ make
+\end{verbatim}
+
+make yourself some coffee, as it will take some time. On an old
+386SX possibly two weeks. During compilation, you'll get a few
+warning messages depending in your compiler.
+
+If you want to be more selective, you can change into a specific
+directiry and type "make" there.
+
+Then you may install the library and it's header files under
+/usr/local/include/wx and /usr/local/lib respectively. You
+have to log in as root (i.e. run "su" and enter the root
+password) and type
+
+\begin{verbatim}
+ make install
+\end{verbatim}
+
+You can remove any traces of wxWindows by typing
+
+\begin{verbatim}
+ make uninstall
+\end{verbatim}
+
+If you want to save disk space by removing unnecessary
+object-files:
+
+\begin{verbatim}
+ make clean
+\end{verbatim}
+
+in the various directories will do the work for you.
+
+\subsubsection{Creating a new Project}
+
+1) The first way uses the installed libraries and header files
+automatically using wx-config
+
+\begin{verbatim}
+gcc myfoo.cpp `wx-config --cflags --libs` -o myfoo
+\end{verbatim}
+
+Using this way, a make file for the minimal sample would look
+like this
+
+\begin{verbatim}
+CC = gcc
+
+minimal: minimal.o
+ $(CC) -o minimal minimal.o `wx-config --libs`
+
+minimal.o: minimal.cpp mondrian.xpm
+ $(CC) `wx-config --cflags` -c minimal.cpp -o minimal.o
+
+clean:
+ rm -f *.o minimal
+\end{verbatim}
+
+This is certain to become the standard way unless we decide
+to sitch to tmake.
+
+2) The other way creates a project within the source code
+directories of wxWindows. For this endeavour, you'll need
+GNU autoconf version 2.14 and add an entry to your Makefile.in
+to the bottom of the configure.in script and run autoconf
+and configure before you can type make.
+
+\section{Windows}\label{installwindows}
+
+
+\section{Mac}\label{installmac}
+
+We don't have information about Mac installation at this time.