Update from John: Includes mouse button, mouse motion, and mouse wheel
[freeglut] / src / freeglut_main.c
index dcb5bd9..485ee4b 100644 (file)
@@ -29,8 +29,6 @@
 #include "config.h"
 #endif
 
-#define  G_LOG_DOMAIN  "freeglut-main"
-
 #include "../include/GL/freeglut.h"
 #include "freeglut_internal.h"
 
@@ -90,7 +88,7 @@ static void fghRedrawWindowByHandle
 
     fgSetWindow( window );
     window->State.Redisplay = FALSE;
-    window->Callbacks.Display();
+    window->Callbacks.Display( );
 }
 
 /*
@@ -105,7 +103,7 @@ static void fghReshapeWindowByHandle
     ( HWND handle, int width, int height )
 #endif
 {
-    SFG_Window *current_window = fgStructure.Window ;
+    SFG_Window *current_window = fgStructure.Window;
 
     SFG_Window* window = fgWindowByHandle( handle );
     freeglut_return_if_fail( window != NULL );
@@ -123,10 +121,10 @@ static void fghReshapeWindowByHandle
      * But without this we get this bad behaviour whenever we resize the
      * window.
      */
-    window->State.Redisplay = TRUE ;
+    window->State.Redisplay = TRUE;
 
     if( window->IsMenu )
-        fgSetWindow( current_window ) ;
+        fgSetWindow( current_window );
 }
 
 /*
@@ -143,15 +141,15 @@ static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator )
 
         fgSetWindow( window );
         window->State.Redisplay = FALSE;
-        window->Callbacks.Display();
-        fgSetWindow( current_window ) ;
+        window->Callbacks.Display( );
+        fgSetWindow( current_window );
     }
 
 #elif TARGET_HOST_WIN32
 
     if( window->State.NeedToResize )
     {
-        SFG_Window *current_window = fgStructure.Window ;
+        SFG_Window *current_window = fgStructure.Window;
 
         fgSetWindow( window );
 
@@ -162,7 +160,7 @@ static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator )
         );
 
         window->State.NeedToResize = FALSE;
-        fgSetWindow ( current_window ) ;
+        fgSetWindow ( current_window );
     }
 
     if( (window->Callbacks.Display != NULL) &&
@@ -201,7 +199,7 @@ static void fghDisplayAll( void )
 static void fghcbCheckJoystickPolls( SFG_Window *window,
                                      SFG_Enumerator *enumerator )
 {
-    long int checkTime = fgElapsedTime();
+    long int checkTime = fgElapsedTime( );
 
     if( window->State.JoystickLastPoll + window->State.JoystickPollRate <=
         checkTime )
@@ -231,7 +229,7 @@ static void fghCheckJoystickPolls( void )
  */
 static void fghCheckTimers( void )
 {
-    long checkTime = fgElapsedTime();
+    long checkTime = fgElapsedTime( );
     SFG_Timer *timer, *next;
     SFG_List timedOut;
 
@@ -278,9 +276,9 @@ long fgElapsedTime( void )
     elapsed = (now.tv_usec - fgState.Time.Value.tv_usec) / 1000;
     elapsed += (now.tv_sec - fgState.Time.Value.tv_sec) * 1000;
     
-    return( elapsed );
+    return elapsed;
 #elif TARGET_HOST_WIN32
-    return (timeGetTime() - fgState.Time.Value);
+    return timeGetTime() - fgState.Time.Value;
 #endif
 }
 
@@ -409,15 +407,14 @@ static void fgSleepForEvents( void )
     struct timeval wait;
     long msec;    
     
-    if( fgState.IdleCallback ||
-        fgHavePendingRedisplays() )
+    if( fgState.IdleCallback || fgHavePendingRedisplays( ) )
         return;
     socket = ConnectionNumber( fgDisplay.Display );
     FD_ZERO( &fdset );
     FD_SET( socket, &fdset );
     
-    msec = fgNextTimer();
-    if( fgHaveJoystick() )
+    msec = fgNextTimer( );
+    if( fgHaveJoystick( ) )
         msec = MIN( msec, 10 );
     
     wait.tv_sec = msec / 1000;
@@ -435,7 +432,7 @@ static void fgSleepForEvents( void )
 /*
  * Returns GLUT modifier mask for an XEvent.
  */
-int fgGetXModifiers(XEvent *event)
+int fgGetXModifiers( XEvent *event )
 {
     int ret = 0;
 
@@ -656,10 +653,14 @@ void FGAPIENTRY glutMainLoopEvent( void )
                                               event.xmotion.y );
                 }
             }
-            else if( window->Callbacks.Passive )
+            else
             {
-                fgSetWindow ( window ) ;
-                window->Callbacks.Passive( event.xmotion.x, event.xmotion.y );
+                if( window->Callbacks.Passive )
+                {
+                    fgSetWindow( window );
+                    window->Callbacks.Passive( event.xmotion.x,
+                                               event.xmotion.y );
+                }
             }
         }
         break;
@@ -793,43 +794,40 @@ void FGAPIENTRY glutMainLoopEvent( void )
                 if( window->Callbacks.Mouse )
                     fgStructure.Window->Callbacks.Mouse(
                         button,
-                        event.type == ButtonPress ? GLUT_DOWN : GLUT_UP,
+                        pressed ? GLUT_DOWN : GLUT_UP,
                         event.xbutton.x,
                         event.xbutton.y
                     );
             }
             else
             {
-                if( ( button >= 4 ) && window->Callbacks.MouseWheel )
-                {
-                    /*
-                     * Map 4 and 5 to wheel zero; EVEN to +1, ODD to -1
-                     *  "  6 and 7 "    "   one; ...
-                     *
-                     * XXX This *should* be behind some variables/macros,
-                     * XXX since the order and numbering isn't certain
-                     * XXX See XFree86 configuration docs (even back in the
-                     * XXX 3.x days, and especially with 4.x).
-                     */
-                    int wheel_number = (button - 4) / 2;
-                    int direction = (button & 1)*2 - 1;
-
-                    if( ButtonPress )
-                        fgStructure.Window->Callbacks.MouseWheel(
-                            wheel_number,
-                            direction,
-                            event.xbutton.x,
-                            event.xbutton.y
-                        );
-                }
+                /*
+                 * Map 4 and 5 to wheel zero; EVEN to +1, ODD to -1
+                 *  "  6 and 7 "    "   one; ...
+                 *
+                 * XXX This *should* be behind some variables/macros,
+                 * XXX since the order and numbering isn't certain
+                 * XXX See XFree86 configuration docs (even back in the
+                 * XXX 3.x days, and especially with 4.x).
+                 */
+                int wheel_number = (button - 4) / 2;
+                int direction = (button & 1)*2 - 1;
+                
+                if( pressed )
+                    fgStructure.Window->Callbacks.MouseWheel(
+                        wheel_number,
+                        direction,
+                        event.xbutton.x,
+                        event.xbutton.y
+                    );
             }
 
             /*
              * Trash the modifiers state
              */
             fgStructure.Window->State.Modifiers = 0xffffffff;
-            break;
         }
+        break;
 
         case KeyRelease:
         case KeyPress:
@@ -1021,7 +1019,7 @@ void FGAPIENTRY glutMainLoop( void )
     }
 
     {
-        fgExecutionState execState = fgState.ActionOnWindowClose;
+        fgExecutionState execState = fgState.ExecState;
         
         /*
          * When this loop terminates, destroy the display, state and structure
@@ -1086,24 +1084,24 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         window->Window.Device = GetDC( hWnd );
         if( fgState.BuildingAMenu )
         {
-          unsigned int current_DisplayMode = fgState.DisplayMode;
-          fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH;
-          fgSetupPixelFormat( window, FALSE, PFD_MAIN_PLANE );
-          fgState.DisplayMode = current_DisplayMode;
-
-          if( fgStructure.MenuContext )
-              wglMakeCurrent( window->Window.Device,
-                              fgStructure.MenuContext->Context ) ;
-          else
-          {
-              fgStructure.MenuContext =
-                  (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) );
-              fgStructure.MenuContext->Context =
-                  wglCreateContext( window->Window.Device );
-          }
-
-          /* window->Window.Context = wglGetCurrentContext () ;   */
-          window->Window.Context = wglCreateContext( window->Window.Device );
+            unsigned int current_DisplayMode = fgState.DisplayMode;
+            fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH;
+            fgSetupPixelFormat( window, FALSE, PFD_MAIN_PLANE );
+            fgState.DisplayMode = current_DisplayMode;
+
+            if( fgStructure.MenuContext )
+                wglMakeCurrent( window->Window.Device,
+                                fgStructure.MenuContext->Context ) ;
+            else
+            {
+                fgStructure.MenuContext =
+                    (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) );
+                fgStructure.MenuContext->Context =
+                    wglCreateContext( window->Window.Device );
+            }
+
+            /* window->Window.Context = wglGetCurrentContext () ;   */
+            window->Window.Context = wglCreateContext( window->Window.Device );
         }
         else
         {
@@ -1143,7 +1141,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
             /* glutSetCursor( fgStructure.Window->State.Cursor ); */
             printf("WM_ACTIVATE: glutSetCursor( %p, %d)\n", window,
                    window->State.Cursor );
-
             glutSetCursor( window->State.Cursor );
         }
 
@@ -1239,7 +1236,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
          * Put on a linked list of windows to be removed after all the
          * callbacks have returned
          */
-        fgAddToWindowDestroyList( window, FALSE ) ;
+        fgAddToWindowDestroyList( window, FALSE );
         DestroyWindow( hWnd );
         break;
 
@@ -1247,7 +1244,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         /*
          * The window already got destroyed, so don't bother with it.
          */
-        return( 0 );
+        return 0;
 
     case WM_MOUSEMOVE:
     {
@@ -1256,13 +1253,8 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         
         if ( window->ActiveMenu )
         {
-            window->State.Redisplay = TRUE ;
-
-            /*
-             * Since the window is a menu, make the parent window current
-             */
-            fgSetWindow ( window->ActiveMenu->ParentWindow ) ;
-
+            window->State.Redisplay = TRUE;
+            fgSetWindow ( window->ActiveMenu->ParentWindow );
             break;
         }
 
@@ -1390,7 +1382,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
             break;
         }
 
-        if ( ( window->Menu[ button ] != NULL ) && ( pressed == TRUE ) )
+        if ( ( window->Menu[ button ] ) && ( pressed == TRUE ) )
         {
             window->State.Redisplay = TRUE;
             fgSetWindow( window );
@@ -1461,13 +1453,16 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
                  * XXX buttons.  Sorry.
                  */
                 int button = wheel_number*2 + 4;
-                button += (1 + direction)/2;
+                if( direction > 0 )
+                    ++button;
                 window->Callbacks.Mouse( button, GLUT_DOWN,
                                          window->State.MouseX,
-                                         window->State.MouseY ) ;
+                                         window->State.MouseY
+                );
                 window->Callbacks.Mouse( button, GLUT_UP,
                                          window->State.MouseX,
-                                         window->State.MouseY ) ;
+                                         window->State.MouseY
+                );
             }
 
         fgStructure.Window->State.Modifiers = 0xffffffff;
@@ -1551,7 +1546,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
     case WM_KEYUP:
     {
         int keypress = -1;
-        POINT mouse_pos ;
+        POINT mouse_pos;
 
         /*
          * Remember the current modifiers state. This is done here in order 
@@ -1660,7 +1655,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         if( window->Callbacks.Display )
         {
             fgSetWindow( window );
-
             window->Callbacks.Display( );
         }
 
@@ -1714,7 +1708,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         break;
     }
 
-    return lRet ;
+    return lRet;
 }
 #endif