Tweaking for menu behavior in Linux regarding mouse whatnot - John Fay
[freeglut] / src / freeglut_main.c
index 0c90e21..c6eaa64 100644 (file)
@@ -445,6 +445,7 @@ static void fgCheckJoystickCallback( SFG_Window* w, SFG_Enumerator* e)
        e->found = TRUE;
        e->data = w;
     }
+    fgEnumSubWindows( w, fgCheckJoystickCallback, e );
 }
 static int fgHaveJoystick( void )
 {
@@ -461,6 +462,7 @@ static void fgHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e)
        e->found = TRUE;
        e->data = w;
     }
+    fgEnumSubWindows( w, fgHavePendingRedisplaysCallback, e );
 }      
 static int fgHavePendingRedisplays (void)
 {
@@ -750,17 +752,23 @@ void FGAPIENTRY glutMainLoopEvent( void )
          */
         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 */
         }
 
         /*
@@ -822,26 +830,15 @@ void FGAPIENTRY glutMainLoopEvent( void )
          */
         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.
@@ -856,7 +853,13 @@ void FGAPIENTRY glutMainLoopEvent( void )
          */
         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 ;
@@ -889,7 +892,8 @@ void FGAPIENTRY glutMainLoopEvent( void )
         /*
          * 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.