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:
parent
8363fa9507
commit
363c2c363a
@ -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,13 +564,16 @@ 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:
|
||||||
fgDestroyWindow ( window );
|
fgDestroyWindow ( window );
|
||||||
@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user