Only check for child window when needed, some cleanup

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1517 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2013-02-27 06:18:20 +00:00
parent 8363fa9507
commit 363c2c363a

View File

@ -324,7 +324,9 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke
void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window) void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window)
{ {
/* Check if the current window that the mouse is over is a child 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.
*/ */
if (window && window->Children.First) if (window && window->Children.First)
{ {
@ -357,8 +359,7 @@ void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window)
*/ */
LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{ {
SFG_Window *window, *child_window = NULL; SFG_Window *window;
PAINTSTRUCT ps;
LRESULT lRet = 1; LRESULT lRet = 1;
FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ; FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ;
@ -371,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, /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0,
uMsg, wParam, lParam ); */ 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 ) switch( uMsg )
{ {
case WM_CREATE: case WM_CREATE:
@ -570,12 +564,15 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
break; break;
case WM_PAINT: case WM_PAINT:
{
PAINTSTRUCT ps;
/* Turn on the visibility in case it was turned off somehow */ /* Turn on the visibility in case it was turned off somehow */
window->State.Visible = GL_TRUE; 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... */ 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 ); BeginPaint( hWnd, &ps );
fghRedrawWindow( window ); fghRedrawWindow( window );
EndPaint( hWnd, &ps ); EndPaint( hWnd, &ps );
}
break; break;
case WM_CLOSE: case WM_CLOSE:
@ -737,9 +734,11 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
case WM_MOUSEWHEEL: case WM_MOUSEWHEEL:
{ {
SFG_Window *child_window = NULL;
int wheel_number = LOWORD( wParam ); int wheel_number = LOWORD( wParam );
short ticks = ( short )HIWORD( wParam ); short ticks = ( short )HIWORD( wParam );
fghWindowUnderCursor(window, &child_window);
if (child_window) if (child_window)
window = child_window; window = child_window;
@ -797,17 +796,27 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
case WM_SYSKEYDOWN: case WM_SYSKEYDOWN:
case WM_KEYDOWN: case WM_KEYDOWN:
{
SFG_Window *child_window = NULL;
fghWindowUnderCursor(window, &child_window);
lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_TRUE,wParam,lParam); lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_TRUE,wParam,lParam);
}
break; break;
case WM_SYSKEYUP: case WM_SYSKEYUP:
case WM_KEYUP: case WM_KEYUP:
{
SFG_Window *child_window = NULL;
fghWindowUnderCursor(window, &child_window);
lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_FALSE,wParam,lParam); lRet = fghWindowProcKeyPress(child_window?child_window:window,uMsg,GL_FALSE,wParam,lParam);
}
break; break;
case WM_SYSCHAR: case WM_SYSCHAR:
case WM_CHAR: case WM_CHAR:
{ {
SFG_Window *child_window = NULL;
fghWindowUnderCursor(window, &child_window);
if (child_window) if (child_window)
window = child_window; window = child_window;