extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y );
-extern void fghPlatformGetCursorPos(SFG_XYUse *mouse_pos);
+extern void fghPlatformGetCursorPos(const SFG_Window *window, GLboolean client, SFG_XYUse *mouse_pos);
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
* origin when looking at a child window
* for parent windows: window->State.MouseX + glutGet( GLUT_WINDOW_X ) == mouse_pos.X
*/
- fghPlatformGetCursorPos(&mouse_pos);
+ fghPlatformGetCursorPos(NULL, GL_FALSE, &mouse_pos);
menu->X = mouse_pos.X;
menu->Y = mouse_pos.Y;
( window->Menu[ button ] ) &&
pressed )
{
- /* XXX Posting a requisite Redisplay seems bogus. */
- window->State.Redisplay = GL_TRUE;
- fghActivateMenu( window, button );
- return GL_TRUE;
+ /* If mouseclick was outside the parent window, ignore. This can
+ * happen when another mouse button is already depressed and the
+ * window thus has mouse capture
+ */
+ if (window->State.MouseX>0 && window->State.MouseY>0 &&
+ window->State.MouseX<window->State.Width && window->State.MouseY<window->State.Height)
+ {
+ /* XXX Posting a requisite Redisplay seems bogus. */
+ window->State.Redisplay = GL_TRUE;
+ fghActivateMenu( window, button );
+ return GL_TRUE;
+ }
}
return GL_FALSE;
fgState.MenuStateCallback(GLUT_MENU_NOT_IN_USE);
if (fgState.MenuStatusCallback)
{
- /* Get cursor position on screen and convert to relative to parent_window's client area */
+ /* Get cursor position relative to parent_window's client area */
SFG_XYUse mouse_pos;
- fghPlatformGetCursorPos(&mouse_pos);
-
- mouse_pos.X -= glutGet( GLUT_WINDOW_X );
- mouse_pos.Y -= glutGet( GLUT_WINDOW_Y );
+ fghPlatformGetCursorPos(parent_window, GL_TRUE, &mouse_pos);
fgState.MenuStatusCallback(GLUT_MENU_NOT_IN_USE, mouse_pos.X, mouse_pos.Y);
}