Part one of fixing bug 3058987 -- the 'freeglut_patch_visual_info.diff' changes
[freeglut] / src / freeglut_main.c
index 79ad79c..3926b38 100644 (file)
@@ -338,37 +338,62 @@ void fgError( const char *fmt, ... )
 {
     va_list ap;
 
-    va_start( ap, fmt );
+    if (fgState.ErrorFunc) {
 
-    fprintf( stderr, "freeglut ");
-    if( fgState.ProgramName )
-        fprintf( stderr, "(%s): ", fgState.ProgramName );
-    VFPRINTF( stderr, fmt, ap );
-    fprintf( stderr, "\n" );
+        va_start( ap, fmt );
 
-    va_end( ap );
+        /* call user set error handler here */
+        fgState.ErrorFunc(fmt, ap);
 
-    if ( fgState.Initialised )
-        fgDeinitialize ();
+        va_end( ap );
 
-    exit( 1 );
+    } else {
+
+        va_start( ap, fmt );
+
+        fprintf( stderr, "freeglut ");
+        if( fgState.ProgramName )
+            fprintf( stderr, "(%s): ", fgState.ProgramName );
+        VFPRINTF( stderr, fmt, ap );
+        fprintf( stderr, "\n" );
+
+        va_end( ap );
+
+        if ( fgState.Initialised )
+            fgDeinitialize ();
+
+        exit( 1 );
+    }
 }
 
 void fgWarning( const char *fmt, ... )
 {
     va_list ap;
 
-    va_start( ap, fmt );
+    if (fgState.WarningFunc) {
+
+        va_start( ap, fmt );
+
+        /* call user set warning handler here */
+        fgState.WarningFunc(fmt, ap);
 
-    fprintf( stderr, "freeglut ");
-    if( fgState.ProgramName )
-        fprintf( stderr, "(%s): ", fgState.ProgramName );
-    VFPRINTF( stderr, fmt, ap );
-    fprintf( stderr, "\n" );
+        va_end( ap );
 
-    va_end( ap );
+    } else {
+
+        va_start( ap, fmt );
+
+        fprintf( stderr, "freeglut ");
+        if( fgState.ProgramName )
+            fprintf( stderr, "(%s): ", fgState.ProgramName );
+        VFPRINTF( stderr, fmt, ap );
+        fprintf( stderr, "\n" );
+
+        va_end( ap );
+    }
 }
 
+
 /*
  * Indicates whether Joystick events are being used by ANY window.
  *
@@ -1590,117 +1615,119 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
     /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0,
              uMsg, wParam, lParam ); */
 
-    /* Checking for CTRL, ALT, and SHIFT key positions:  Key Down! */
-    if ( !lControl && GetAsyncKeyState ( VK_LCONTROL ) )
-    {
-        INVOKE_WCB     ( *window, Special,
-                      ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )
-                    );
-
-        lControl = 1;
-    }
-
-    if ( !rControl && GetAsyncKeyState ( VK_RCONTROL ) )
-    {
-        INVOKE_WCB ( *window, Special,
-                     ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )
-                   );
-
-        rControl = 1;
-    }
-
-    if ( !lShift && GetAsyncKeyState ( VK_LSHIFT ) )
-    {
-        INVOKE_WCB ( *window, Special,
-                     ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )
-                   );
-
-        lShift = 1;
-    }
-
-    if ( !rShift && GetAsyncKeyState ( VK_RSHIFT ) )
-    {
-        INVOKE_WCB ( *window, Special,
-                     ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )
-                   );
-
-        rShift = 1;
-    }
-
-    if ( !lAlt && GetAsyncKeyState ( VK_LMENU ) )
-    {
-        INVOKE_WCB ( *window, Special,
-                     ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )
-                   );
-
-        lAlt = 1;
-    }
-
-    if ( !rAlt && GetAsyncKeyState ( VK_RMENU ) )
-    {
-        INVOKE_WCB ( *window, Special,
-                     ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )
-                   );
-
-        rAlt = 1;
-    }
-
-    /* Checking for CTRL, ALT, and SHIFT key positions:  Key Up! */
-    if ( lControl && !GetAsyncKeyState ( VK_LCONTROL ) )
-    {
-        INVOKE_WCB ( *window, SpecialUp,
-                     ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )
-        );
-
-        lControl = 0;
-    }
-
-    if ( rControl && !GetAsyncKeyState ( VK_RCONTROL ) )
+    if ( window )
     {
-        INVOKE_WCB ( *window, SpecialUp,
-                     ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )
-                   );
-
-        rControl = 0;
+      /* Checking for CTRL, ALT, and SHIFT key positions:  Key Down! */
+      if ( !lControl && GetAsyncKeyState ( VK_LCONTROL ) )
+      {
+          INVOKE_WCB   ( *window, Special,
+                        ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )
+                      );
+
+          lControl = 1;
+      }
+
+      if ( !rControl && GetAsyncKeyState ( VK_RCONTROL ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rControl = 1;
+      }
+
+      if ( !lShift && GetAsyncKeyState ( VK_LSHIFT ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lShift = 1;
+      }
+
+      if ( !rShift && GetAsyncKeyState ( VK_RSHIFT ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rShift = 1;
+      }
+
+      if ( !lAlt && GetAsyncKeyState ( VK_LMENU ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lAlt = 1;
+      }
+
+      if ( !rAlt && GetAsyncKeyState ( VK_RMENU ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rAlt = 1;
+      }
+
+      /* Checking for CTRL, ALT, and SHIFT key positions:  Key Up! */
+      if ( lControl && !GetAsyncKeyState ( VK_LCONTROL ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lControl = 0;
+      }
+
+      if ( rControl && !GetAsyncKeyState ( VK_RCONTROL ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rControl = 0;
+      }
+
+      if ( lShift && !GetAsyncKeyState ( VK_LSHIFT ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lShift = 0;
+      }
+
+      if ( rShift && !GetAsyncKeyState ( VK_RSHIFT ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rShift = 0;
+      }
+
+      if ( lAlt && !GetAsyncKeyState ( VK_LMENU ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lAlt = 0;
+      }
+
+      if ( rAlt && !GetAsyncKeyState ( VK_RMENU ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rAlt = 0;
+      }
     }
 
-    if ( lShift && !GetAsyncKeyState ( VK_LSHIFT ) )
-    {
-        INVOKE_WCB ( *window, SpecialUp,
-                     ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )
-                   );
-
-        lShift = 0;
-    }
-
-    if ( rShift && !GetAsyncKeyState ( VK_RSHIFT ) )
-    {
-        INVOKE_WCB ( *window, SpecialUp,
-                     ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )
-        );
-
-        rShift = 0;
-    }
-
-    if ( lAlt && !GetAsyncKeyState ( VK_LMENU ) )
-    {
-        INVOKE_WCB ( *window, SpecialUp,
-                     ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )
-                   );
-
-        lAlt = 0;
-    }
-
-    if ( rAlt && !GetAsyncKeyState ( VK_RMENU ) )
-    {
-        INVOKE_WCB ( *window, SpecialUp,
-                     ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )
-                   );
-
-        rAlt = 0;
-    }
-
-
     switch( uMsg )
     {
     case WM_CREATE: