* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
#include <GL/freeglut.h>
#include "freeglut_internal.h"
+#if HAVE_ERRNO_H
+# include <errno.h>
+#endif
+#include <stdarg.h>
+#if HAVE_VPRINTF
+# define VFPRINTF(s,f,a) vfprintf((s),(f),(a))
+#elif HAVE_DOPRNT
+# define VFPRINTF(s,f,a) _doprnt((f),(a),(s))
+#else
+# define VFPRINTF(s,f,a)
+#endif
-#include <limits.h>
-#if TARGET_HOST_UNIX_X11
-#include <sys/types.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/stat.h>
-#elif TARGET_HOST_WIN32
-#elif TARGET_HOST_WINCE
+#if TARGET_HOST_WINCE
typedef struct GXDisplayProperties GXDisplayProperties;
typedef struct GXKeyList GXKeyList;
#endif
-#ifndef MAX
-#define MAX(a,b) (((a)>(b)) ? (a) : (b))
+/*
+ * Try to get the maximum value allowed for ints, falling back to the minimum
+ * guaranteed by ISO C99 if there is no suitable header.
+ */
+#if HAVE_LIMITS_H
+# include <limits.h>
+#endif
+#ifndef INT_MAX
+# define INT_MAX 32767
#endif
#ifndef MIN
fprintf( stderr, "freeglut ");
if( fgState.ProgramName )
- fprintf (stderr, "(%s): ", fgState.ProgramName);
- vfprintf( stderr, fmt, ap );
+ fprintf( stderr, "(%s): ", fgState.ProgramName );
+ VFPRINTF( stderr, fmt, ap );
fprintf( stderr, "\n" );
va_end( ap );
fprintf( stderr, "freeglut ");
if( fgState.ProgramName )
fprintf( stderr, "(%s): ", fgState.ProgramName );
- vfprintf( stderr, fmt, ap );
+ VFPRINTF( stderr, fmt, ap );
fprintf( stderr, "\n" );
va_end( ap );
return;
msec = fghNextTimer( );
- if( fghHaveJoystick( ) ) /* XXX Use GLUT timers for joysticks... */
- msec = MIN( msec, 10 ); /* XXX Dumb; forces granularity to .01sec */
+ /* XXX Use GLUT timers for joysticks... */
+ /* XXX Dumb; forces granularity to .01sec */
+ if( fghHaveJoystick( ) && ( msec < 10 ) )
+ msec = 10;
#if TARGET_HOST_UNIX_X11
/*
button = event.xbutton.button - 1;
/*
- * XXX This comment is replicated in the WIN32 section and
- * XXX maybe also in the menu code. Can we move the info
- * XXX to one central place and *reference* it from here?
- *
* Do not execute the application's mouse callback if a menu
* is hooked to this button. In that case an appropriate
* private call should be generated.
- * Near as I can tell, this is the menu behaviour:
- * - Down-click the menu button, menu not active: activate
- * the menu with its upper left-hand corner at the mouse
- * location.
- * - Down-click any button outside the menu, menu active:
- * deactivate the menu
- * - Down-click any button inside the menu, menu active:
- * select the menu entry and deactivate the menu
- * - Up-click the menu button, menu not active: nothing happens
- * - Up-click the menu button outside the menu, menu active:
- * nothing happens
- * - Up-click the menu button inside the menu, menu active:
- * select the menu entry and deactivate the menu
*/
- /* Window has an active menu, it absorbs any mouse click */
- if( window->ActiveMenu )
- {
- if( window == window->ActiveMenu->ParentWindow )
- {
- window->ActiveMenu->Window->State.MouseX =
- event.xbutton.x_root - window->ActiveMenu->X;
- window->ActiveMenu->Window->State.MouseY =
- event.xbutton.y_root - window->ActiveMenu->Y;
- }
-
- /* In the menu, invoke the callback and deactivate the menu*/
- if( fgCheckActiveMenu( window->ActiveMenu->Window,
- window->ActiveMenu ) )
- {
- /*
- * Save the current window and menu and set the current
- * window to the window whose menu this is
- */
- SFG_Window *save_window = fgStructure.Window;
- SFG_Menu *save_menu = fgStructure.Menu;
- SFG_Window *parent_window =
- window->ActiveMenu->ParentWindow;
- fgSetWindow( parent_window );
- fgStructure.Menu = window->ActiveMenu;
-
- /* Execute the menu callback */
- fgExecuteMenuCallback( window->ActiveMenu );
- fgDeactivateMenu( parent_window );
-
- /* Restore the current window and menu */
- fgSetWindow( save_window );
- fgStructure.Menu = save_menu;
- }
- else if( pressed )
- /*
- * Outside the menu, deactivate if it's a downclick
- *
- * XXX This isn't enough. A downclick outside of
- * XXX the interior of our freeglut windows should also
- * XXX deactivate the menu. This is more complicated.
- */
- fgDeactivateMenu( window->ActiveMenu->ParentWindow );
-
- /*
- * XXX Why does an active menu require a redisplay at
- * XXX this point? If this can come out cleanly, then
- * XXX it probably should do so; if not, a comment should
- * XXX explain it.
- */
- window->State.Redisplay = GL_TRUE;
+ if( fgCheckActiveMenu( window, button, pressed,
+ event.xbutton.x_root, event.xbutton.y_root ) )
break;
- }
-
- /* No active menu, let's check whether we need to activate one. */
- if( ( 0 <= button ) &&
- ( FREEGLUT_MAX_MENUS > button ) &&
- ( window->Menu[ button ] ) &&
- pressed )
- {
- /* XXX Posting a requisite Redisplay seems bogus. */
- window->State.Redisplay = GL_TRUE;
- fgSetWindow( window );
- fgActivateMenu( window, button );
- break;
- }
/*
* Check if there is a mouse or mouse wheel callback hooked to the
SetCursor( NULL ); \
break;
+/* printf ( "Cursor event %x %x %x %x\n", window, window->State.Cursor, lParam, wParam ) ; */
if( LOWORD( lParam ) == HTCLIENT )
switch( window->State.Cursor )
{
return DefWindowProc( hWnd, uMsg, lParam, wParam );
/*
- * XXX This comment is duplicated in two other spots.
- * XXX Can we centralize it?
- *
- * Do not execute the application's mouse callback if a
- * menu is hooked to this button.
- * In that case an appropriate private call should be generated.
- * Near as I can tell, this is the menu behaviour:
- * - Down-click the menu button, menu not active: activate
- * the menu with its upper left-hand corner at the mouse location.
- * - Down-click any button outside the menu, menu active:
- * deactivate the menu
- * - Down-click any button inside the menu, menu active:
- * select the menu entry and deactivate the menu
- * - Up-click the menu button, menu not active: nothing happens
- * - Up-click the menu button outside the menu, menu active:
- * nothing happens
- * - Up-click the menu button inside the menu, menu active:
- * select the menu entry and deactivate the menu
+ * Do not execute the application's mouse callback if a menu
+ * is hooked to this button. In that case an appropriate
+ * private call should be generated.
*/
- /* Window has an active menu, it absorbs any mouse click */
- if( window->ActiveMenu )
- {
- /* Outside the menu, deactivate the menu if it's a downclick */
- if( ! fgCheckActiveMenu( window, window->ActiveMenu ) )
- {
- if( pressed )
- fgDeactivateMenu( window->ActiveMenu->ParentWindow );
- }
- else /* In menu, invoke the callback and deactivate the menu*/
- {
- /*
- * Save the current window and menu and set the current
- * window to the window whose menu this is
- */
- SFG_Window *save_window = fgStructure.Window;
- SFG_Menu *save_menu = fgStructure.Menu;
- SFG_Window *parent_window = window->ActiveMenu->ParentWindow;
- fgSetWindow( parent_window );
- fgStructure.Menu = window->ActiveMenu;
-
- /* Execute the menu callback */
- fgExecuteMenuCallback( window->ActiveMenu );
- fgDeactivateMenu( parent_window );
-
- /* Restore the current window and menu */
- fgSetWindow( save_window );
- fgStructure.Menu = save_menu;
- }
-
- /*
- * Let's make the window redraw as a result of the mouse
- * click and menu activity.
- */
- if( ! window->IsMenu )
- window->State.Redisplay = GL_TRUE;
-
+ if( fgCheckActiveMenu( window, button, pressed,
+ window->State.MouseX, window->State.MouseY ) )
break;
- }
if( window->Menu[ button ] && pressed )
{