From d9b0989056a1c2267b68f01317d4641c70e48719 Mon Sep 17 00:00:00 2001 From: Diederick Niehorster Date: Mon, 23 Jul 2012 08:52:50 +0000 Subject: [PATCH] child window now only used for keyboard callbacks and setting focus in windowproc, was a bit overeager before git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1363 7f0cb862-5218-0410-a997-914c9d46530a --- progs/demos/One/one.c | 1 - src/mswin/fg_main_mswin.c | 98 +++++++++++++++++++++++++++------------------ 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/progs/demos/One/one.c b/progs/demos/One/one.c index 36f7c79..cf2cb14 100644 --- a/progs/demos/One/one.c +++ b/progs/demos/One/one.c @@ -187,7 +187,6 @@ void SampleEntry(int state) { int window = glutGetWindow () ; printf ( "Window %d Entry Callback: %d\n", window, state ) ; - glutPostRedisplay () ; } /* diff --git a/src/mswin/fg_main_mswin.c b/src/mswin/fg_main_mswin.c index 3afc655..b09e8bc 100644 --- a/src/mswin/fg_main_mswin.c +++ b/src/mswin/fg_main_mswin.c @@ -225,10 +225,9 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, static unsigned char lControl = 0, rControl = 0, lShift = 0, rShift = 0, lAlt = 0, rAlt = 0; - SFG_Window* window; + SFG_Window *window, *child_window = NULL; PAINTSTRUCT ps; LRESULT lRet = 1; - GLboolean gotChild = GL_FALSE; FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ; @@ -240,35 +239,39 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0, uMsg, wParam, lParam ); */ - /* events only sent to main window. Check if the current window that the mouse - is over is a child window and if so, make sure we call the callback on that - child instead. - */ + /* Some events only sent to main window. Check if the current window that + * the mouse is over is a child window. Below whn handling some messages, + * we make sure that we process callbacks on the child window instead. + * This mirrors how GLUT does things. + */ if (window && window->Children.First) { POINT mouse_pos; SFG_WindowHandleType hwnd; + SFG_Window* temp_window; GetCursorPos( &mouse_pos ); ScreenToClient( window->Window.Handle, &mouse_pos ); hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); if (hwnd) /* can be NULL if mouse outside parent by the time we get here */ { - window = fgWindowByHandle(hwnd); - if (window->Parent) - gotChild = GL_TRUE; + temp_window = fgWindowByHandle(hwnd); + if (temp_window->Parent) /* Verify we got a child window */ + child_window = temp_window; } } if ( window ) { + SFG_Window* temp_window = child_window?child_window:window; + fgState.Modifiers = fgPlatformGetModifiers( ); /* 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 ) + INVOKE_WCB ( *temp_window, Special, + ( GLUT_KEY_CTRL_L, temp_window->State.MouseX, temp_window->State.MouseY ) ); lControl = 1; @@ -276,8 +279,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( !rControl && GetAsyncKeyState ( VK_RCONTROL ) ) { - INVOKE_WCB ( *window, Special, - ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, Special, + ( GLUT_KEY_CTRL_R, temp_window->State.MouseX, temp_window->State.MouseY ) ); rControl = 1; @@ -285,8 +288,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( !lShift && GetAsyncKeyState ( VK_LSHIFT ) ) { - INVOKE_WCB ( *window, Special, - ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, Special, + ( GLUT_KEY_SHIFT_L, temp_window->State.MouseX, temp_window->State.MouseY ) ); lShift = 1; @@ -294,8 +297,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( !rShift && GetAsyncKeyState ( VK_RSHIFT ) ) { - INVOKE_WCB ( *window, Special, - ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, Special, + ( GLUT_KEY_SHIFT_R, temp_window->State.MouseX, temp_window->State.MouseY ) ); rShift = 1; @@ -303,8 +306,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( !lAlt && GetAsyncKeyState ( VK_LMENU ) ) { - INVOKE_WCB ( *window, Special, - ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, Special, + ( GLUT_KEY_ALT_L, temp_window->State.MouseX, temp_window->State.MouseY ) ); lAlt = 1; @@ -312,8 +315,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( !rAlt && GetAsyncKeyState ( VK_RMENU ) ) { - INVOKE_WCB ( *window, Special, - ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, Special, + ( GLUT_KEY_ALT_R, temp_window->State.MouseX, temp_window->State.MouseY ) ); rAlt = 1; @@ -322,8 +325,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, /* 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 ) + INVOKE_WCB ( *temp_window, SpecialUp, + ( GLUT_KEY_CTRL_L, temp_window->State.MouseX, temp_window->State.MouseY ) ); lControl = 0; @@ -331,8 +334,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( rControl && !GetAsyncKeyState ( VK_RCONTROL ) ) { - INVOKE_WCB ( *window, SpecialUp, - ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, SpecialUp, + ( GLUT_KEY_CTRL_R, temp_window->State.MouseX, temp_window->State.MouseY ) ); rControl = 0; @@ -340,8 +343,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( lShift && !GetAsyncKeyState ( VK_LSHIFT ) ) { - INVOKE_WCB ( *window, SpecialUp, - ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, SpecialUp, + ( GLUT_KEY_SHIFT_L, temp_window->State.MouseX, temp_window->State.MouseY ) ); lShift = 0; @@ -349,8 +352,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( rShift && !GetAsyncKeyState ( VK_RSHIFT ) ) { - INVOKE_WCB ( *window, SpecialUp, - ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, SpecialUp, + ( GLUT_KEY_SHIFT_R, temp_window->State.MouseX, temp_window->State.MouseY ) ); rShift = 0; @@ -358,8 +361,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( lAlt && !GetAsyncKeyState ( VK_LMENU ) ) { - INVOKE_WCB ( *window, SpecialUp, - ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, SpecialUp, + ( GLUT_KEY_ALT_L, temp_window->State.MouseX, temp_window->State.MouseY ) ); lAlt = 0; @@ -367,8 +370,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( rAlt && !GetAsyncKeyState ( VK_RMENU ) ) { - INVOKE_WCB ( *window, SpecialUp, - ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY ) + INVOKE_WCB ( *temp_window, SpecialUp, + ( GLUT_KEY_ALT_R, temp_window->State.MouseX, temp_window->State.MouseY ) ); rAlt = 0; @@ -491,16 +494,25 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, case WM_SETFOCUS: /* printf("WM_SETFOCUS: %p\n", window ); */ - if (gotChild) - /* If child should have focus instead, set it here. */ - SetFocus(window->Window.Handle); lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); + if (child_window) + { + /* If child should have focus instead, set it here. */ + SetFocus(child_window->Window.Handle); + SetActiveWindow( child_window->Window.Handle ); + INVOKE_WCB( *child_window, Entry, ( GLUT_ENTERED ) ); + UpdateWindow ( child_window->Window.Handle ); + } + else + { + SetActiveWindow( window->Window.Handle ); + INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); + } + /* Always request update on main window to be safe */ UpdateWindow ( hWnd ); - if (gotChild) - UpdateWindow ( window->Window.Handle ); + break; case WM_KILLFOCUS: @@ -811,6 +823,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, int keypress = -1; POINT mouse_pos ; + if (child_window) + window = child_window; if( ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) ) break; @@ -905,6 +919,9 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, int keypress = -1; POINT mouse_pos; + if (child_window) + window = child_window; + /* * Remember the current modifiers state. This is done here in order * to make sure the VK_DELETE keyboard callback is executed properly. @@ -991,6 +1008,9 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, case WM_SYSCHAR: case WM_CHAR: { + if (child_window) + window = child_window; + if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) ) break; -- 1.7.10.4