( 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.MouseX<window->State.Height)
+ {
+ /* XXX Posting a requisite Redisplay seems bogus. */
+ window->State.Redisplay = GL_TRUE;
+ fghActivateMenu( window, button );
+ return GL_TRUE;
+ }
}
return GL_FALSE;
{
SFG_Window *window;
LRESULT lRet = 1;
+ static int setCaptureActive = 0;
FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ;
*/
return 0;
+ case WM_CANCELMODE:
+ /*
+ * The window manager sends this message when it detects a change
+ * that requires that an application cancel any modal state it has
+ * entered. If we've called SetCapture in the mouse button handler,
+ * call ReleaseCapture.
+ */
+ if (setCaptureActive)
+ ReleaseCapture();
+ break;
+
case WM_MOUSEMOVE:
{
#if defined(_WIN32_WCE)
* This is consistent with the behavior on X11.
*/
if ( pressed == GL_TRUE )
- SetCapture ( window->Window.Handle ) ;
+ {
+ if (!setCaptureActive)
+ SetCapture ( window->Window.Handle ) ;
+ setCaptureActive = 1; /* Set to false in WM_CAPTURECHANGED handler */
+ }
else if (!GetAsyncKeyState(VK_LBUTTON) && !GetAsyncKeyState(VK_MBUTTON) && !GetAsyncKeyState(VK_RBUTTON))
/* Make sure all mouse buttons are released before releasing capture */
ReleaseCapture () ;
break;
case WM_CAPTURECHANGED:
+ if (!lParam || !fgWindowByHandle((HWND)lParam))
+ /* Capture released or capture taken by non-FreeGLUT window */
+ setCaptureActive = 0;
/* User has finished resizing the window, force a redraw */
INVOKE_WCB( *window, Display, ( ) );
lRet = 0; /* Per docs, should return zero */