X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmswin%2Ffg_main_mswin.c;h=19daf5aee783156cdd40748ccb99315182d4f089;hb=577b5282d04d034afc34c7240491d8f94848e46a;hp=daa8fdc25004740bacc81805b4858a9c42fb4384;hpb=cc8230fde8220aeab13bbc2457cb32c0fcc19d5e;p=freeglut diff --git a/src/mswin/fg_main_mswin.c b/src/mswin/fg_main_mswin.c index daa8fdc..19daf5a 100644 --- a/src/mswin/fg_main_mswin.c +++ b/src/mswin/fg_main_mswin.c @@ -176,7 +176,6 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke rControl = 0, rShift = 0, rAlt = 0; int keypress = -1; - POINT mouse_pos ; /* if keydown, check for repeat */ /* If repeat is globally switched off, it cannot be switched back on per window. @@ -190,12 +189,6 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke /* Remember the current modifiers state so user can query it from their callback */ fgState.Modifiers = fgPlatformGetModifiers( ); - /* Get mouse position roughly at time of keypress */ - GetCursorPos( &mouse_pos ); - ScreenToClient( window->Window.Handle, &mouse_pos ); - window->State.MouseX = mouse_pos.x; - window->State.MouseY = mouse_pos.y; - /* Convert the Win32 keystroke codes to GLUTtish way */ # define KEY(a,b) case a: keypress = b; break; @@ -328,31 +321,37 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke return 1; } -void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window) +static SFG_Window* fghWindowUnderCursor(SFG_Window *window) { /* Check if the current window that the mouse is over is a child window - * of the window the message was sent to. + * of the window the message was sent to. Some events only sent to main window, + * and when handling some messages, we need to make sure that we process + * callbacks on the child window instead. This mirrors how GLUT does things. + * returns either the original window or the found child. */ - if (window && window->Children.First) + if (window && window->Children.First) /* This window has childs */ { - POINT mouse_pos; SFG_WindowHandleType hwnd; - SFG_Window* temp_window; + SFG_Window* child_window; - GetCursorPos( &mouse_pos ); + /* Get mouse position at time of message */ + DWORD mouse_pos_dw = GetMessagePos(); + POINT mouse_pos = {GET_X_LPARAM(mouse_pos_dw), GET_Y_LPARAM(mouse_pos_dw)}; ScreenToClient( window->Window.Handle, &mouse_pos ); + hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); if (hwnd && hwnd!=window->Window.Handle) /* can be NULL if mouse outside parent by the time we get here, or can be same as parent if we didn't find a child */ { - temp_window = fgWindowByHandle(hwnd); - if (temp_window) /* Verify we got a FreeGLUT window */ + child_window = fgWindowByHandle(hwnd); + if (child_window) /* Verify we got a FreeGLUT window */ { - *child_window = temp_window; /* ChildWindowFromPoint only searches immediate children, so search again to see if actually in grandchild or further descendant */ - fghWindowUnderCursor(temp_window,child_window); + window = fghWindowUnderCursor(child_window); } } } + + return window; } /* @@ -360,8 +359,7 @@ void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window) */ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { - SFG_Window *window, *child_window = NULL; - PAINTSTRUCT ps; + SFG_Window *window; LRESULT lRet = 1; FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ; @@ -374,13 +372,6 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0, uMsg, wParam, lParam ); */ - /* Some events only sent to main window. Check if the current window that - * the mouse is over is a child window. Below when handling some messages, - * we make sure that we process callbacks on the child window instead. - * This mirrors how GLUT does things. - */ - fghWindowUnderCursor(window, &child_window); - switch( uMsg ) { case WM_CREATE: @@ -526,20 +517,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - if (child_window) - { - /* If we're dealing with a child window, make sure it has input 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 */ + SetActiveWindow( window->Window.Handle ); + INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); UpdateWindow ( hWnd ); break; @@ -559,6 +538,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR #if 0 case WM_ACTIVATE: + //printf("WM_ACTIVATE: %x %d %d\n",lParam, HIWORD(wParam), LOWORD(wParam)); if (LOWORD(wParam) != WA_INACTIVE) { /* printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window, @@ -584,13 +564,16 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR break; case WM_PAINT: + { + PAINTSTRUCT ps; /* Turn on the visibility in case it was turned off somehow */ window->State.Visible = GL_TRUE; InvalidateRect( hWnd, NULL, GL_FALSE ); /* Make sure whole window is repainted. Bit of a hack, but a safe one from what google turns up... */ BeginPaint( hWnd, &ps ); fghRedrawWindow( window ); EndPaint( hWnd, &ps ); - break; + } + break; case WM_CLOSE: fgDestroyWindow ( window ); @@ -751,10 +734,13 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR case WM_MOUSEWHEEL: { + SFG_Window *child_window = NULL; int wheel_number = LOWORD( wParam ); short ticks = ( short )HIWORD( wParam ); - fgState.MouseWheelTicks += ticks; + window = fghWindowUnderCursor(window); + + fgState.MouseWheelTicks += ticks; if ( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA ) { int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1; @@ -808,23 +794,24 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR case WM_SYSKEYDOWN: case WM_KEYDOWN: - if (child_window) - window = child_window; + { + window = fghWindowUnderCursor(window); lRet = fghWindowProcKeyPress(window,uMsg,GL_TRUE,wParam,lParam); + } break; case WM_SYSKEYUP: case WM_KEYUP: - if (child_window) - window = child_window; + { + window = fghWindowUnderCursor(window); lRet = fghWindowProcKeyPress(window,uMsg,GL_FALSE,wParam,lParam); + } break; case WM_SYSCHAR: case WM_CHAR: { - if (child_window) - window = child_window; + window = fghWindowUnderCursor(window); if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) ) break;