( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 );
}
-static void fghKeyPress(SFG_Window *window, GLboolean keydown, WPARAM wParam, LPARAM lParam)
+static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean keydown, WPARAM wParam, LPARAM lParam)
{
static unsigned char lControl = 0, lShift = 0, lAlt = 0,
rControl = 0, rShift = 0, rAlt = 0;
/* if keydown, check for repeat */
if( keydown && ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) )
- return;
+ return 1;
/* Remember the current modifiers state so user can query it from their callback */
fgState.Modifiers = fgPlatformGetModifiers( );
);
fgState.Modifiers = INVALID_MODIFIERS;
+
+ /* SYSKEY events should be sent to default window proc for system to handle them */
+ if (uMsg==WM_SYSKEYDOWN || uMsg==WM_SYSKEYUP)
+ return DefWindowProc( window->Window.Handle, uMsg, wParam, lParam );
+ else
+ return 1;
+}
+
+void fghWindowUnderCursor(SFG_Window *window, SFG_Window **child_window)
+{
+ /* Check if the current window that the mouse is over is a child window
+ * of the window the message was sent to.
+ */
+ 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 && 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 = temp_window;
+ /* ChildWindowFromPoint only searches immediate children, so search again to see if actually in grandchild or further descendant */
+ fghWindowUnderCursor(temp_window,child_window);
+ }
+ }
+ }
}
/*
* 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 */
- {
- temp_window = fgWindowByHandle(hwnd);
- if (temp_window && temp_window->Parent) /* Verify we got a child window */
- child_window = temp_window;
- }
- }
+ fghWindowUnderCursor(window, &child_window);
switch( uMsg )
{
case WM_KEYDOWN:
if (child_window)
window = child_window;
- fghKeyPress(window,GL_TRUE,wParam,lParam);
+ lRet = fghWindowProcKeyPress(window,uMsg,GL_TRUE,wParam,lParam);
break;
case WM_SYSKEYUP:
case WM_KEYUP:
if (child_window)
window = child_window;
- fghKeyPress(window,GL_FALSE,wParam,lParam);
+ lRet = fghWindowProcKeyPress(window,uMsg,GL_FALSE,wParam,lParam);
break;
case WM_SYSCHAR: