win API docs say that defWndProc must be called for system keydown/keyup
authorDiederick Niehorster <dcnieho@gmail.com>
Tue, 26 Feb 2013 15:20:18 +0000 (15:20 +0000)
committerDiederick Niehorster <dcnieho@gmail.com>
Tue, 26 Feb 2013 15:20:18 +0000 (15:20 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1506 7f0cb862-5218-0410-a997-914c9d46530a

src/mswin/fg_main_mswin.c

index 7f33ac1..6de07a2 100644 (file)
@@ -170,7 +170,7 @@ static int fgPlatformGetModifiers (void)
             ( GetKeyState( VK_RMENU    ) < 0 )) ? GLUT_ACTIVE_ALT   : 0 );
 }
 
-static void fghKeyPress(SFG_Window *window, GLboolean keydown, WPARAM wParam, LPARAM lParam)
+static LRESULT fghKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam)
 {
     static unsigned char lControl = 0, lShift = 0, lAlt = 0,
                          rControl = 0, rShift = 0, rAlt = 0;
@@ -180,7 +180,7 @@ static void fghKeyPress(SFG_Window *window, GLboolean keydown, WPARAM wParam, LP
     
     /* if keydown, check for repeat */
     if( keydown && ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) )
-        return;
+        return 1;
     
     /* Remember the current modifiers state so user can query it from their callback */
     fgState.Modifiers = fgPlatformGetModifiers( );
@@ -315,6 +315,12 @@ static void fghKeyPress(SFG_Window *window, GLboolean keydown, WPARAM wParam, LP
             );
 
     fgState.Modifiers = INVALID_MODIFIERS;
+
+    /* SYSKEY events should be sent to default window proc for system to handle them */
+    if (uMsg==WM_SYSKEYDOWN || uMsg==WM_SYSKEYUP)
+        return DefWindowProc( window->Window.Handle, uMsg, wParam, lParam );
+    else
+        return 1;
 }
 
 /*
@@ -787,14 +793,14 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
     case WM_KEYDOWN:
         if (child_window)
             window = child_window;
-        fghKeyPress(window,GL_TRUE,wParam,lParam);
+        lRet = fghKeyPress(window,uMsg,GL_TRUE,wParam,lParam);
     break;
 
     case WM_SYSKEYUP:
     case WM_KEYUP:
         if (child_window)
             window = child_window;
-        fghKeyPress(window,GL_FALSE,wParam,lParam);
+        lRet = fghKeyPress(window,uMsg,GL_FALSE,wParam,lParam);
     break;
 
     case WM_SYSCHAR: