-GLUT should simply exit (the default).
-<h3>
-3.4.3 String Rendering</h3>
-New functions have been added to render full character strings (including
-carriage returns) rather than rendering one character at a time.
-More functions return the widths of character strings and the font heights,
-in pixels for bitmapped fonts and in OpenGL units for the stroke fonts.
-<h3>
-3.4.4 Geometry Rendering</h3>
-Two functions have been added to render a wireframe and a solid rhombic
-dodecahedron.
-<h1>
-4.0 <a NAME="Initialization"></a>Initialization Functions</h1>
-
-<h2>
-4.1 glutInit</h2>
-
-<h2>
-4.2 glutInitWindowPosition, glutInitWindowSize</h2>
-
-<h2>
-4.3 glutInitDisplayMode</h2>
-
-<h2>
-4.4 glutInitDisplayString</h2>
-
-<h1>
-5.0 <a NAME="EventProcessing"></a>Event Processing Functions</h1>
-After an application has finished initializing its windows and menus, it
-enters an event loop. Within this loop, <i>freeglut</i> polls the
-data entry devices (keyboard, mouse, etc.) and calls the application's
-appropriate callbacks.
-<p>In GLUT, control never returned from the event loop (as invoked by the
-"<tt>glutMainLoop</tt>" function) to the calling function. This prevented
-an application from having re-entrant code, in which GLUT could be invoked
-from within a callback, and it prevented the application from doing any
-post-processing (such as freeing allocated memory) after GLUT had closed
-down. <i>Freeglut</i> allows the application programmer to specify
-more direct control over the event loop by means of two new functions.
-The first, "<tt>glutMainLoopEvent</tt>", processes a single iteration of
-the event loop and allows the application to use a different event loop
-controller or to contain re-entrant code. The second, "<tt>glutLeaveMainLoop</tt>",
-causes the event loop to exit nicely; this is preferable to the application's
-calling "<tt>exit</tt>" from within a GLUT callback.
-<h2>
-5.1 glutMainLoop</h2>
-The "<tt>glutMainLoop</tt>" function enters the event loop.
-<p><b>Usage</b>
-<p><tt>void glutMainLoop ( void ) ;</tt>
-<p><b>Description</b>
-<p>The "<tt>glutMainLoop</tt>" function causes the program to enter
-the window event loop. An application should call this function at
-most once. It will call any application callback functions as required
-to process mouse clicks, mouse motion, key presses, and so on.
-<p><b>Changes From GLUT</b>
-<p>In GLUT, there was absolutely no way for the application programmer
-to have control return from the "<tt>glutMainLoop</tt>" function to the
-calling function. <i>Freeglut</i> allows the programmer to force
-this by setting the "<tt>GLUT_ACTION_ON_WINDOW_CLOSE</tt>" option and invoking
-the "<tt>glutLeaveMainLoop</tt>" function from one of the callbacks.
-Stopping the program this way is preferable to simply calling "<tt>exit</tt>"
-from within a callback because this allows <i>freeglut</i> to free allocated
-memory and otherwise clean up after itself. (I know I just said this,
-but I think it is important enough that it bears repeating.)
-<h2>
-5.2 glutMainLoopEvent</h2>
-The "<tt>glutMainLoopEvent</tt>" function processes a single iteration
-in the <i>freeglut</i> event loop.
-<p><b>Usage</b>
-<p><tt>void glutMainLoopEvent ( void ) ;</tt>
-<p><b>Description</b>
-<p>The "<tt>glutMainLoopEvent</tt>" function causes <i>freeglut</i>
-to process one iteration's worth of events in its event loop. This
-allows the application to control its own event loop and still use the
-<i>freeglut</i> windowing system.
-<p><b>Changes From GLUT</b>
-<p>GLUT does not include this function.
-<h2>
-5.3 glutLeaveMainLoop</h2>
-The "<tt>glutLeaveMainLoop</tt>" function causes <i>freeglut</i> to stop
-its event loop.
-<p><b>Usage</b>
-<p><tt>void glutLeaveMainLoop ( void ) ;</tt>
-<p><b>Description</b>
-<p>The "<tt>glutLeaveMainLoop</tt>" function causes <i>freeglut</i>
-to stop the event loop. If the "<tt>GLUT_ACTION_ON_WINDOW_CLOSE</tt>"
-option has been set to "<tt>GLUT_ACTION_CONTINUE_EXECUTION</tt>", control
-will return to the function which called "<tt>glutMainLoop</tt>"; otherwise
-the application will exit.
-<p><b>Changes From GLUT</b>
-<p>GLUT does not include this function.
-<h1>
-6.0 <a NAME="Window"></a>Window Functions</h1>
-
-<h2>
-6.1 glutCreateWindow</h2>
-
-<h2>
-6.2 glutCreateSubwindow</h2>
-
-<h2>
-6.3 glutDestroyWindow</h2>
-
-<h2>
-6.4 glutSetWindow, glutGetWindow</h2>
-
-<h2>
-6.5 glutSetWindowTitle, glutSetIconTitle</h2>
-
-<h2>
-6.6 glutReshapeWindow</h2>
-
-<h2>
-6.7 glutPositionWindow</h2>
-
-<h2>
-6.8 glutShowWindow, glutHideWindow, glutIconifyWindow</h2>
-
-<h2>
-6.9 glutPushWindow, glutPopWindow</h2>
-
-<h2>
-6.10 glutFullScreen</h2>
-
-<h1>
-7.0 <a NAME="Display"></a>Display Functions</h1>
-
-<h2>
-7.1 glutPostRedisplay</h2>
-
-<h2>
-7.2 glutPostWindowRedisplay</h2>
-
-<h2>
-7.3 glutSwapBuffers</h2>
-
-<h1>
-8.0 <a NAME="MouseCursor"></a>Mouse Cursor Functions</h1>
-
-<h2>
-8.1 glutSetCursor</h2>
-
-<h2>
-8.2 glutWarpPointer</h2>
-
-<h1>
-9.0 <a NAME="Overlay"></a>Overlay Functions</h1>
-
-<h2>
-9.1 glutEstablishOverlay</h2>
-
-<h2>
-9.2 glutRemoveOverlay</h2>
-
-<h2>
-9.3 glutUseLayer</h2>
-
-<h2>
-9.4 glutPostOverlayRedisplay</h2>
-
-<h2>
-9.5 glutPostWindowOverlayRedisplay</h2>
-
-<h2>
-9.6 glutShowOverlay, glutHideOverlay</h2>
-
-<h1>
-10.0 <a NAME="Menu"></a>Menu Functions</h1>
-
-<h2>
-10.1 glutCreateMenu</h2>
-
-<h2>
-10.2 glutDestroyMenu</h2>
-
-<h2>
-10.3 glutGetMenu, glutSetMenu</h2>
-
-<h2>
-10.4 glutAddMenuEntry</h2>
-
-<h2>
-10.5 glutAddSubMenu</h2>
-
-<h2>
-10.6 glutChangeToMenuEntry</h2>
-
-<h2>
-10.7 glutChangeToSubMenu</h2>
+GLUT should simply exit (the default).
+
+ <h3>3.4.3 Changes to Callbacks<br>
+ </h3>
+ Several new callbacks have been added and several callbacks which were specific
+to Silicon Graphics hardware have not been implemented. Most or all
+of the new callbacks are listed in the GLUT Version 4 "glut.h" header file
+but did not make it into the documentation. The new callbacks consist
+of regular and special key release callbacks, a joystick callback, a menu
+state callback (with one argument, distinct from the menu status callback
+which has three arguments), and a window status callback <br>
+ (also with one argument). Unsupported callbacks are the three Spaceball
+callbacks, the ButtonBox callback, the Dials callback, and the two Tablet
+callbacks. If the user has a need for an unsupported callback he should
+contact the <i>freeglut</i> development team.<br>
+
+ <h3>3.4.4 String Rendering<br>
+ </h3>
+ New functions have been added to render full character strings (including
+carriage returns) rather than rendering one character at a time. More
+functions return the widths of character strings and the font heights, in
+pixels for bitmapped fonts and in OpenGL units for the stroke fonts.<br>
+
+ <h3>3.4.5 Geometry Rendering<br>
+ </h3>
+ Two functions have been added to render a wireframe and a solid rhombic
+dodecahedron.
+ <h3> 3.4.5 Extension Function Queries</h3>
+ glutGetProcAddress is a wrapper for the glXGetProcAddressARB and wglGetProcAddress
+functions.
+ <h1> 4.0 <a name="Initialization"></a>
+ Initialization Functions</h1>
+
+ <h2> 4.1 glutInit</h2>
+
+ <h2> 4.2 glutInitWindowPosition, glutInitWindowSize</h2>
+ The "<tt>glutInitWindowPosition</tt> " and "<tt>glutInitWindowSize</tt>
+" functions specify a desired position and size for windows that <i>freeglut</i>
+ will create in the future.
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutInitWindowPosition ( int
+x, int y ) ;</tt> <br>
+ <tt>void glutInitWindowSize ( int width,
+int height ) ;</tt> </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutInitWindowPosition</tt>
+ " and "<tt>glutInitWindowSize</tt>" functions specify a desired position
+and size for windows that <i>freeglut</i> will create in the future.
+The position is measured in pixels from the upper left hand corner of the
+screen, with "x" increasing to the right and "y" increasing towards the bottom
+of the screen. The size is measured in pixels. <i>Freeglut</i>
+ does not promise to follow these specifications in creating its windows,
+it certainly makes an attempt to. </p>
+
+ <p>The position and size of a window are
+a matter of some subtlety. Most windows have a usable area surrounded
+by a border and with a title bar on the top. The border and title bar
+are commonly called "decorations." The position of the window unfortunately
+varies with the operating system. On Linux, it is the coordinates of
+the upper left-hand corner of its decorations. On Windows, it is the
+coordinates of the upper left hand corner of its usable interior. For
+both operating systems, the size of the window is the size of the usable interior.
+ </p>
+
+ <p>Windows has some additional quirks which
+the application programmer should know about. First, the minimum y-coordinate
+of a window decoration is zero. (This is a feature of <i>freeglut</i>
+ and can be adjusted if so desired.) Second, there appears to be a
+minimum window width on Windows which is 104 pixels. The user may specify
+a smaller width, but the Windows system calls ignore it. It is also
+impossible to make a window narrower than this by dragging on its corner.
+ </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>For some reason, GLUT is not affected
+by the 104-pixel minimum window width. If the user clicks on the corner
+of a window which is narrower than this amount, the window will immediately
+snap out to this width, but the application can call "<tt>glutReshapeWindow</tt>
+ " and make a window narrower again. </p>
+
+ <h2> 4.3 glutInitDisplayMode</h2>
+
+ <h2> 4.4 glutInitDisplayString</h2>
+
+ <h1> 5.0 <a name="EventProcessing"></a>
+ Event Processing Functions</h1>
+ After an application has finished initializing its windows and menus, it
+ enters an event loop. Within this loop, <i>freeglut</i> polls the
+data entry devices (keyboard, mouse, etc.) and calls the application's appropriate
+callbacks.
+ <p>In GLUT, control never returned from
+the event loop (as invoked by the "<tt>glutMainLoop</tt>" function) to the
+calling function. This prevented an application from having re-entrant
+code, in which GLUT could be invoked from within a callback, and it prevented
+the application from doing any post-processing (such as freeing allocated
+memory) after GLUT had closed down. <i>Freeglut</i> allows the application
+programmer to specify more direct control over the event loop by means of
+two new functions. The first, "<tt>glutMainLoopEvent</tt>", processes
+a single iteration of the event loop and allows the application to use a different
+event loop controller or to contain re-entrant code. The second, "<tt>
+glutLeaveMainLoop</tt>", causes the event loop to exit nicely; this is preferable
+to the application's calling "<tt>exit</tt>" from within a GLUT callback.
+ </p>
+
+ <h2> 5.1 glutMainLoop</h2>
+ The "<tt>glutMainLoop</tt>" function enters the event loop.
+
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutMainLoop ( void ) ;</tt>
+ </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutMainLoop</tt>" function
+causes the program to enter the window event loop. An application should
+call this function at most once. It will call any application callback
+functions as required to process mouse clicks, mouse motion, key presses,
+and so on. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>In GLUT, there was absolutely no way
+for the application programmer to have control return from the "<tt>glutMainLoop</tt>
+ " function to the calling function. <i>Freeglut</i> allows the programmer
+to force this by setting the "<tt>GLUT_ACTION_ON_WINDOW_CLOSE</tt>" option
+and invoking the "<tt>glutLeaveMainLoop</tt>" function from one of the callbacks.
+ Stopping the program this way is preferable to simply calling "<tt>exit</tt>
+ " from within a callback because this allows <i>freeglut</i> to free allocated
+ memory and otherwise clean up after itself. (I know I just said this,
+ but I think it is important enough that it bears repeating.) </p>
+
+ <h2> 5.2 glutMainLoopEvent</h2>
+ The "<tt>glutMainLoopEvent</tt>" function processes a single iteration
+in the <i>freeglut</i> event loop.
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutMainLoopEvent ( void ) ;</tt>
+ </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutMainLoopEvent</tt>
+ " function causes <i>freeglut</i> to process one iteration's worth of events
+in its event loop. This allows the application to control its own event
+loop and still use the <i>freeglut</i> windowing system. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT does not include this function.
+ </p>
+
+ <h2> 5.3 glutLeaveMainLoop</h2>
+ The "<tt>glutLeaveMainLoop</tt>" function causes <i>freeglut</i> to stop
+ its event loop.
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutLeaveMainLoop ( void ) ;</tt>
+ </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutLeaveMainLoop</tt>
+ " function causes <i>freeglut</i> to stop the event loop. If the
+"<tt> GLUT_ACTION_ON_WINDOW_CLOSE</tt>" option has been set to "<tt>GLUT_ACTION_CONTINUE_EXECUTION</tt>
+ ", control will return to the function which called "<tt>glutMainLoop</tt>
+ "; otherwise the application will exit. </p>
+
+ <p>If the application has two nested calls
+to "<tt>glutMainLoop</tt>" and calls "<tt>glutLeaveMainLoop</tt>", the behaviour
+of <i>freeglut</i> is undefined. It may leave only the inner nested
+loop or it may leave both loops. If the reader has a strong preference
+for one behaviour over the other he should contact the <i>freeglut</i> Programming
+Consortium and ask for the code to be fixed. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT does not include this function.
+ </p>
+
+ <h1> 6.0 <a name="Window"></a>
+ Window Functions</h1>
+
+ <h2> 6.1 glutCreateWindow</h2>
+
+ <h2> 6.2 glutCreateSubwindow</h2>
+
+ <h2> 6.3 glutDestroyWindow</h2>
+
+ <h2> 6.4 glutSetWindow, glutGetWindow</h2>
+
+ <h2> 6.5 glutSetWindowTitle, glutSetIconTitle</h2>
+
+ <h2> 6.6 glutReshapeWindow</h2>
+
+ <h2> 6.7 glutPositionWindow</h2>
+
+ <h2> 6.8 glutShowWindow, glutHideWindow,
+glutIconifyWindow</h2>
+
+ <h2> 6.9 glutPushWindow, glutPopWindow</h2>
+
+ <h2> 6.10 glutFullScreen</h2>
+
+ <h1> 7.0 <a name="Display"></a>
+ Display Functions</h1>
+
+ <h2> 7.1 glutPostRedisplay</h2>
+
+ <h2> 7.2 glutPostWindowRedisplay</h2>
+
+ <h2> 7.3 glutSwapBuffers</h2>
+
+ <h1> 8.0 <a name="MouseCursor"></a>
+ Mouse Cursor Functions</h1>
+
+ <h2> 8.1 glutSetCursor</h2>
+
+ <h2> 8.2 glutWarpPointer</h2>
+
+ <h1> 9.0 <a name="Overlay"></a>
+ Overlay Functions</h1>
+ <i>Freeglut</i> does not allow overlays, although it does "answer the mail"
+ with function stubs so that GLUT-based programs can compile and link against
+ <i>freeglut</i> without modification.
+If the reader needs overlays, he should contact the <i>freeglut</i> Programming
+Consortium and ask for them to be implemented. He should also be prepared
+to assist in the implementation.
+ <h2> 9.1 glutEstablishOverlay</h2>
+ The "<tt>glutEstablishOverlay</tt>" function is not implemented in <i>freeglut</i>
+ .
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutEstablishOverlay ( void
+) ;</tt> </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutEstablishOverlay</tt>" function
+is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 9.2 glutRemoveOverlay</h2>
+ The "<tt>glutRemoveOverlay</tt>" function is not implemented in <i>freeglut</i>
+ .
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutRemoveOverlay ( void ) ;</tt>
+ </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutRemoveOverlay</tt>" function
+is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 9.3 glutUseLayer</h2>
+ The "<tt>glutUseLayer</tt>" function is not implemented in <i>freeglut</i>
+ .
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutUseLayer ( GLenum
+layer ) ;</tt> </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutUseLayer</tt>" function
+is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 9.4 glutPostOverlayRedisplay</h2>
+ The "<tt>glutPostOverlayRedisplay</tt> " function is not implemented in
+ <i> freeglut</i>.
+
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutPostOverlayRedisplay ( void
+) ;</tt> </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutPostOverlayRedisplay</tt>
+ " function is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 9.5 glutPostWindowOverlayRedisplay</h2>
+ The "<tt>glutPostWindowOverlayRedisplay</tt> " function is not implemented
+ in <i>freeglut</i>.
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutPostWindowOverlayRedisplay
+( int window ) ;</tt> </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutPostWindowOverlayRedisplay</tt>
+ " function is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 9.6 glutShowOverlay, glutHideOverlay</h2>
+ The "<tt>glutShowOverlay</tt>" and "<tt>glutHideOverlay</tt>" functions
+are not implemented in <i>freeglut</i> .
+
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutShowOverlay( void ) ;</tt>
+ <br>
+ <tt>void glutHideOverlay( void ) ;</tt>
+ </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutShowOverlay</tt>" and "<tt>
+glutHideOverlay</tt>" functions are not implemented in <i>freeglut</i> .
+ </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>GLUT implements these functions. </p>
+
+ <h1> 10.0 <a name="Menu"></a>
+ Menu Functions</h1>
+
+ <h2> 10.1 glutCreateMenu</h2>
+
+ <h2> 10.2 glutDestroyMenu</h2>
+
+ <h2> 10.3 glutGetMenu, glutSetMenu</h2>
+
+ <h2> 10.4 glutAddMenuEntry</h2>
+
+ <h2> 10.5 glutAddSubMenu</h2>
+
+ <h2> 10.6 glutChangeToMenuEntry</h2>
+
+ <h2> 10.7 glutChangeToSubMenu</h2>
+
+ <h2> 10.8 glutRemoveMenuItem</h2>
+
+ <h2> 10.9 glutAttachMenu, glutDetachMenu</h2>
+
+ <h1> 11.0 <a name="GlobalCallback"></a>
+ Global Callback Registration Functions</h1>
+
+ <h2> 11.1 glutTimerFunc</h2>
+
+ <h2> 11.2 glutIdleFunc</h2>
+ The "<tt>glutIdleFunc</tt>" function sets the global idle callback. <i>
+Freeglut</i> calls the idle callback when there are no inputs from the user.
+
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutIdleFunc ( void (*func)
+( void ) ) ;</tt> </p>
+
+ <p><tt>func </tt>The new
+global idle callback function </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutIdleFunc</tt>" function
+specifies the function that <i>freeglut</i> will call to perform background
+processing tasks such as continuous animation when window system events are
+not being received. If enabled, this function is called continuously
+from <i>freeglut</i> while no events are received. The callback function
+has no parameters and returns no value. <i>Freeglut</i> does not change
+the <i>current window</i> or the <i>current menu</i> before invoking the idle
+callback; programs with multiple windows or menus must explicitly set the
+ <i>current window</i> and <i>current menu</i>
+ and not rely on its current setting. <br>
+ The amount of computation and rendering done in an idle
+callback should be minimized to avoid affecting the program's interactive
+ response. In general, no more than a single frame of rendering should
+ be done in a single invocation of an idle callback. <br>
+ Calling "<tt>glutIdleFunc</tt>" with a NULL argument
+disables the call to an idle callback. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>Application programmers should note that
+if they have specified the "continue execution" action on window closure,
+ <i>freeglut</i> will continue to call the
+idle callback after the user has closed a window by clicking on the "x" in
+the window header bar. If the idle callback renders a particular window
+(this is considered bad form but is frequently done anyway), the programmer
+should supply a window closure callback for that window which changes or disables
+the idle callback. </p>
+
+ <h1> 12.0 <a name="WindowCallback"></a>
+ Window-Specific Callback Registration Functions</h1>
+
+ <h2> 12.1 glutDisplayFunc</h2>
+
+ <h2> 12.2 glutOverlayDisplayFunc</h2>
+
+ <h2> 12.3 glutReshapeFunc</h2>
+
+ <h2> 12.4 glutCloseFunc</h2>
+
+ <h2> 12.5 glutKeyboardFunc</h2>
+
+ <h2> 12.6 glutSpecialFunc</h2>
+ The "<tt>glutSpecialFunc</tt>" function sets the window's special key press
+ callback. <i>Freeglut</i> calls the special key press callback when the
+user presses a special key.
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutSpecialFunc ( void (*func)
+( int key, int x, int y ) ) ;</tt> </p>
+
+ <p><tt>func </tt>The window's
+new special key press callback function <br>
+ <tt>key </tt>The
+key whose press triggers the callback <br>
+ <tt>x
+ </tt>The x-coordinate of the mouse relative
+to the window at the time the key is pressed <br>
+ <tt>y
+ </tt>The y-coordinate of the mouse relative
+to the window at the time the key is pressed </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutSpecialFunc</tt>"
+function specifies the function that <i>freeglut</i> will call when the user
+presses a special key on the keyboard. The callback function has one
+argument: the name of the function to be invoked ("called back") at
+the time at which the special key is pressed. The function returns no
+value. <i>Freeglut</i> sets the <i>current window</i> to the window
+which is active when the callback is invoked. "Special keys" are the
+function keys, the arrow keys, the Page Up and Page Down keys, and the Insert
+key. The Delete key is considered to be a regular key. <br>
+ Calling "<tt>glutSpecialUpFunc</tt>" with a NULL argument
+disables the call to the window's special key press callback. </p>
+
+ <p> The "<tt>key</tt>
+" argument may take one of the following defined constant values: </p>
+
+ <ul>
+ <li> <tt>GLUT_KEY_F1, GLUT_KEY_F2, ..., GLUT_KEY_F12</tt>
+ - F1 through F12 keys</li>
+ <li> <tt>GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN</tt>
+ - Page Up and Page Down keys</li>
+ <li> <tt>GLUT_KEY_HOME, GLUT_KEY_END</tt>
+ - Home and End keys</li>
+ <li> <tt>GLUT_KEY_LEFT, GLUT_KEY_RIGHT, GLUT_KEY_UP, GLUT_KEY_DOWN</tt>
+ - arrow keys</li>
+ <li> <tt>GLUT_KEY_INSERT</tt>
+ - Insert key</li>
+
+ </ul>
+ <b>Changes From GLUT</b>
+ <p>None. </p>
+
+ <h2> 12.7 glutKeyboardUpFunc</h2>
+ The "<tt>glutKeyboardUpFunc</tt>" function sets the window's key release
+ callback. <i>Freeglut</i> calls the key release callback when the user releases
+a key.
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutKeyboardUpFunc ( void (*func)
+( unsigned char key, int x, int y ) ) ;</tt> </p>
+
+ <p><tt>func </tt>The window's
+new key release callback function <br>
+ <tt>key </tt>The
+key whose release triggers the callback <br>
+ <tt>x
+ </tt>The x-coordinate of the mouse relative
+to the window at the time the key is released <br>
+ <tt>y
+ </tt>The y-coordinate of the mouse relative
+to the window at the time the key is released </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutKeyboardUpFunc</tt>
+" function specifies the function that <i>freeglut</i> will call when the
+user releases a key from the keyboard. The callback function has one
+argument: the name of the function to be invoked ("called back") at
+the time at which the key is released. The function returns no value.
+ <i>Freeglut</i> sets the <i>current window</i>
+ to the window which is active when the callback is invoked. <br>
+ While <i>freeglut</i> checks for upper or lower case
+letters, it does not do so for non-alphabetical characters. Nor does
+it account for the Caps-Lock key being on. The operating system may
+send some unexpected characters to <i>freeglut</i>, such as "8" when the
+user is pressing the Shift key. <i>Freeglut</i> also invokes the callback
+when the user releases the Control, Alt, or Shift keys, among others.
+Releasing the Delete key causes this function to be invoked with a value
+of 127 for "<tt>key</tt>". <br>
+ Calling "<tt>glutKeyboardUpFunc</tt>" with a NULL argument
+disables the call to the window's key release callback. </p>
+
+ <p><b>Changes From GLUT</b> </p>
+
+ <p>This function is not implemented in GLUT
+versions before Version 4. It has been designed to be as close to GLUT
+as possible. Users who find differences should contact the
+ <i>freeglut</i> Programming Consortium to
+have them fixed. </p>
+
+ <h2> 12.8 glutSpecialUpFunc</h2>
+ The "<tt>glutSpecialUpFunc</tt>" function sets the window's special key
+release callback. <i>Freeglut</i> calls the special key release callback
+when the user releases a special key.
+ <p><b>Usage</b> </p>
+
+ <p><tt>void glutSpecialUpFunc ( void (*func)
+( int key, int x, int y ) ) ;</tt> </p>
+
+ <p><tt>func </tt>The window's
+new special key release callback function <br>
+ <tt>key </tt>The
+key whose release triggers the callback <br>
+ <tt>x
+ </tt>The x-coordinate of the mouse relative
+to the window at the time the key is released <br>
+ <tt>y
+ </tt>The y-coordinate of the mouse relative
+to the window at the time the key is released </p>
+
+ <p><b>Description</b> </p>
+
+ <p>The "<tt>glutSpecialUpFunc</tt>
+" function specifies the function that <i>freeglut</i> will call when the
+user releases a special key from the keyboard. The callback function
+has one argument: the name of the function to be invoked ("called back")
+at the time at which the special key is released. The function returns
+no value. <i>Freeglut</i> sets the <i>current window</i> to the window
+which is active when the callback is invoked. "Special keys" are the
+function keys, the arrow keys, the Page Up and Page Down keys, and the Insert
+key. The Delete key is considered to be a regular key. <br>
+ Calling "<tt>glutSpecialUpFunc</tt>" with a NULL argument
+disables the call to the window's special key release callback. </p>
+
+ <p> The "<tt>key</tt>
+" argument may take one of the following defined constant values: </p>
+
+ <ul>
+ <li> <tt>GLUT_KEY_F1, GLUT_KEY_F2, ..., GLUT_KEY_F12</tt>
+ - F1 through F12 keys</li>
+ <li> <tt>GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN</tt>
+ - Page Up and Page Down keys</li>
+ <li> <tt>GLUT_KEY_HOME, GLUT_KEY_END</tt>
+ - Home and End keys</li>
+ <li> <tt>GLUT_KEY_LEFT, GLUT_KEY_RIGHT, GLUT_KEY_UP, GLUT_KEY_DOWN</tt>
+ - arrow keys</li>
+ <li> <tt>GLUT_KEY_INSERT</tt>
+ - Insert key</li>
+
+ </ul>
+ <b>Changes From GLUT</b>
+ <p>This function is not implemented in GLUT
+versions before Version 4. It has been designed to be as close to GLUT
+as possible. Users who find differences should contact the
+ <i>freeglut</i> Programming Consortium to
+have them fixed. </p>
+
+ <h2> 12.9 glutMouseFunc</h2>
+
+ <h2> 12.10 glutMotionFunc, glutPassiveMotionFunc</h2>
+
+ <h2> 12.11 glutVisibilityFunc</h2>
+
+ <h2> 12.12 glutEntryFunc</h2>
+
+ <h2> 12.13 glutJoystickFunc</h2>
+
+ <h2> 12.14 glutSpaceballMotionFunc</h2>
+ The "<tt>glutSpaceballMotionFunc</tt>" function is not implemented in
+ <i>freeglut</i>, although the library does
+"answer the mail" to the extent that a call to the function will not produce
+an error..
+ <p><b>Usage</b></p>
+
+ <p><tt>void glutSpaceballMotionFunc ( void
+(* callback)( int x, int y, int z )</tt><tt> ) ;</tt></p>
+
+ <p><b>Description</b></p>
+
+ <p>The "<tt>glutSpaceballMotionFunc</tt>
+ " function is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b></p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 12.15 glutSpaceballRotateFunc</h2>
+ The "<tt>glutSpaceballRotateFunc</tt>" function is not implemented in
+ <i>freeglut</i>, although the library does
+"answer the mail" to the extent that a call to the function will not produce
+an error..
+ <p><b>Usage</b></p>
+
+ <p><tt>void glutSpaceballRotateFunc ( void
+(* callback)( int x, int y, int z )</tt><tt> ) ;</tt></p>
+
+ <p><b>Description</b></p>
+
+ <p>The "<tt>glutSpaceballRotateFunc</tt>
+ " function is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b></p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 12.16 glutSpaceballButtonFunc</h2>
+ The "<tt>glutSpaceballButtonFunc</tt>" function is not implemented in
+ <i>freeglut</i>, although the library does
+"answer the mail" to the extent that a call to the function will not produce
+an error..
+ <p><b>Usage</b></p>
+
+ <p><tt>void glutSpaceballButtonFunc ( void
+(* callback)( int button, int updown )</tt><tt> ) ;</tt></p>
+
+ <p><b>Description</b></p>
+
+ <p>The "<tt>glutSpaceballButtonFunc</tt>
+ " function is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b></p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 12.17 glutButtonBoxFunc</h2>
+ The "<tt>glutSpaceballButtonBoxFunc</tt>" function is not implemented
+in <i>freeglut</i>, although the library does "answer the mail" to the extent
+that a call to the function will not produce an error..
+
+ <p><b>Usage</b></p>
+
+ <p><tt>void glutSpaceballButtonBoxFunc (
+void (* callback)( int button, int updown )</tt><tt> ) ;</tt></p>
+
+ <p><b>Description</b></p>
+
+ <p>The "<tt>glutSpaceballButtonBoxFunc</tt>
+ " function is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b></p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 12.18 glutDialsFunc</h2>
+ The "<tt>glutDialsFunc</tt>" function is not implemented in <i>freeglut</i>
+ , although the library does "answer the mail" to the extent that a call
+to the function will not produce an error..
+
+ <p><b>Usage</b></p>
+
+ <p><tt>void glutDialsFunc ( void (* callback)(
+int dial, int value )</tt><tt> ) ;</tt></p>
+
+ <p><b>Description</b></p>
+
+ <p>The "<tt>glutDialsFunc</tt>" function
+is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b></p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 12.19 glutTabletMotionFunc</h2>
+ The "<tt>glutTabletMotionFunc</tt>" function is not implemented in <i>
+ freeglut</i>, although the library does "answer the mail" to the extent
+that a call to the function will not produce an error..
+
+ <p><b>Usage</b></p>
+
+ <p><tt>void glutTabletMotionFunc ( void
+(* callback)( int x, int y )</tt><tt> ) ;</tt></p>
+
+ <p><b>Description</b></p>
+
+ <p>The "<tt>glutTabletMotionFunc</tt>" function
+is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b></p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 12.20 glutTabletButtonFunc</h2>
+ The "<tt>glutTabletButtonFunc</tt>" function is not implemented in <i>
+ freeglut</i>, although the library does "answer the mail" to the extent
+that a call to the function will not produce an error..
+
+ <p><b>Usage</b></p>
+
+ <p><tt>void glutTabletButtonFunc ( void
+(* callback)( int button, int updown, int x, int y )</tt><tt> ) ;</tt></p>
+
+ <p><b>Description</b></p>
+
+ <p>The "<tt>glutTabletButtonFunc</tt>" function
+is not implemented in <i>freeglut</i>. </p>
+
+ <p><b>Changes From GLUT</b></p>
+
+ <p>GLUT implements this function. </p>
+
+ <h2> 12.21 glutMenuStatusFunc</h2>
+
+ <h2> 12.22 glutWindowStatusFunc</h2>
+
+ <h1> 13.0 <a name="StateSetting"></a>
+ State Setting and Retrieval Functions</h1>
+
+ <h2> 13.1 glutSetOption</h2>
+
+ <h2> 13.2 glutGet</h2>
+
+
+<p>
+The following state variables may be queried with "<tt>glutGet</tt>".
+The returned value is an integer.
+</p>
+
+<p>
+These queries are with respect to the current window:
+</p>