e->found = TRUE;
e->data = w;
}
+ fgEnumSubWindows( w, fgCheckJoystickCallback, e );
}
static int fgHaveJoystick( void )
{
fgEnumWindows( fgCheckJoystickCallback, &enumerator );
return !!enumerator.data;
}
+static void fgHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e)
+{
+ if( w->State.Redisplay )
+ {
+ e->found = TRUE;
+ e->data = w;
+ }
+ fgEnumSubWindows( w, fgHavePendingRedisplaysCallback, e );
+}
+static int fgHavePendingRedisplays (void)
+{
+ SFG_Enumerator enumerator;
+ enumerator.found = FALSE;
+ enumerator.data = NULL;
+ fgEnumWindows( fgHavePendingRedisplaysCallback, &enumerator );
+ return !!enumerator.data;
+}
/*
* Indicates whether there are any outstanding timers.
*/
struct timeval wait;
long msec;
+ if( fgState.IdleCallback ||
+ fgHavePendingRedisplays() )
+ return;
socket = ConnectionNumber( fgDisplay.Display );
FD_ZERO( &fdset );
FD_SET( socket, &fdset );
*/
if( window->ActiveMenu != NULL )
{
+ if ( window == window->ActiveMenu->ParentWindow )
+ {
+ window->ActiveMenu->Window->State.MouseX = event.xmotion.x_root - window->ActiveMenu->X ;
+ window->ActiveMenu->Window->State.MouseY = event.xmotion.y_root - window->ActiveMenu->Y ;
+ }
+
/*
* Let's make the window redraw as a result of the mouse motion.
*/
- window->State.Redisplay = TRUE ;
+ window->ActiveMenu->Window->State.Redisplay = TRUE ;
/*
* Since the window is a menu, make the parent window current
*/
fgSetWindow ( window->ActiveMenu->ParentWindow ) ;
- break;
+ break; /* I think this should stay in -- an active menu should absorb the mouse motion */
}
/*
*/
GETWINDOW( xbutton ); GETMOUSE( xbutton );
- /*
- * GLUT API assumes that you can't have more than three mouse buttons, so:
- */
- switch( event.xbutton.button )
- {
- /*
- * WARNING: this might be wrong, if we only have two mouse buttons,
- * Button2 might mean the right button, isn't that right?
- */
- case Button1: button = GLUT_LEFT_BUTTON; break;
- case Button2: button = GLUT_MIDDLE_BUTTON; break;
- case Button3: button = GLUT_RIGHT_BUTTON; break;
- default: button = -1; break;
- }
-
- /*
- * Skip the unwanted mouse buttons...
- */
- if( button == -1 )
- break;
+ /*
+ * An X button (at least in XFree86) is numbered from 1.
+ * A GLUT button is numbered from 0.
+ * Old GLUT passed through buttons other than just the first
+ * three, though it only gave symbolic names and official
+ * support to the first three.
+ *
+ */
+ button = event.xbutton.button - 1;
/*
* Do not execute the application's mouse callback if a menu is hooked to this button.
*/
if ( window->ActiveMenu != NULL ) /* Window has an active menu, it absorbs any mouse click */
{
- if ( fgCheckActiveMenu ( window, window->ActiveMenu ) == TRUE ) /* Inside the menu, invoke the callback and deactivate the menu*/
+ 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 ;
+ }
+
+ if ( fgCheckActiveMenu ( window->ActiveMenu->Window, window->ActiveMenu ) == TRUE ) /* Inside the 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 ( window ) ;
+ fgSetWindow ( parent_window ) ;
fgStructure.Menu = window->ActiveMenu ;
/* Execute the menu callback */
/*
* No active menu, let's check whether we need to activate one.
*/
- if ( ( window->Menu[ button ] != NULL ) && ( pressed == TRUE ) )
+ if (( 0 <= button ) && ( 2 >= button ) &&
+ ( window->Menu[ button ] != NULL ) && ( pressed == TRUE ) )
{
/*
* Let's make the window redraw as a result of the mouse click.
*/
if ( fgStructure.Windows.First == NULL )
fgState.ExecState = GLUT_EXEC_STATE_STOP ;
- else if( !fgState.IdleCallback )
+ else
fgSleepForEvents();
}
SFG_Window *save_window = fgStructure.Window ;
SFG_Menu *save_menu = fgStructure.Menu ;
SFG_Window *parent_window = window->ActiveMenu->ParentWindow ;
- fgSetWindow ( window ) ;
+ fgSetWindow ( parent_window ) ;
fgStructure.Menu = window->ActiveMenu ;
/* Execute the menu callback */