Simplified fghWindowUnderCursor, cleane dup code
git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1518 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
parent
363c2c363a
commit
9652d57d4f
@ -321,37 +321,37 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke
|
|||||||
return 1;
|
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
|
/* Check if the current window that the mouse is over is a child window
|
||||||
* of the window the message was sent to. Some events only sent to main window,
|
* 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
|
* 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.
|
* 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_WindowHandleType hwnd;
|
||||||
SFG_Window* temp_window;
|
SFG_Window* child_window;
|
||||||
|
|
||||||
/* Get mouse position at time of message */
|
/* Get mouse position at time of message */
|
||||||
DWORD mouse_pos_Dword = GetMessagePos();
|
DWORD mouse_pos_dw = GetMessagePos();
|
||||||
mouse_pos.x = GET_X_LPARAM(mouse_pos_Dword);
|
POINT mouse_pos = {GET_X_LPARAM(mouse_pos_dw), GET_Y_LPARAM(mouse_pos_dw)};
|
||||||
mouse_pos.y = GET_Y_LPARAM(mouse_pos_Dword);
|
|
||||||
ScreenToClient( window->Window.Handle, &mouse_pos );
|
ScreenToClient( window->Window.Handle, &mouse_pos );
|
||||||
|
|
||||||
hwnd = ChildWindowFromPoint(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 */
|
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);
|
child_window = fgWindowByHandle(hwnd);
|
||||||
if (temp_window) /* Verify we got a FreeGLUT window */
|
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 */
|
/* 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -738,9 +738,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
|
|||||||
int wheel_number = LOWORD( wParam );
|
int wheel_number = LOWORD( wParam );
|
||||||
short ticks = ( short )HIWORD( wParam );
|
short ticks = ( short )HIWORD( wParam );
|
||||||
|
|
||||||
fghWindowUnderCursor(window, &child_window);
|
window = fghWindowUnderCursor(window);
|
||||||
if (child_window)
|
|
||||||
window = child_window;
|
|
||||||
|
|
||||||
fgState.MouseWheelTicks += ticks;
|
fgState.MouseWheelTicks += ticks;
|
||||||
if ( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA )
|
if ( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA )
|
||||||
@ -797,28 +795,23 @@ 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;
|
window = fghWindowUnderCursor(window);
|
||||||
fghWindowUnderCursor(window, &child_window);
|
lRet = fghWindowProcKeyPress(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;
|
window = fghWindowUnderCursor(window);
|
||||||
fghWindowUnderCursor(window, &child_window);
|
lRet = fghWindowProcKeyPress(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;
|
window = fghWindowUnderCursor(window);
|
||||||
fghWindowUnderCursor(window, &child_window);
|
|
||||||
if (child_window)
|
|
||||||
window = child_window;
|
|
||||||
|
|
||||||
if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) )
|
if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) )
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user