Send mouse leave updates for Windows and X11.

We now generate a final SDL_MOUSEMOTION before the cursor leaves the
window, followed by a SDL_WINDOWEVENT_LEAVE.
This commit is contained in:
Jørgen P. Tjernø 2013-04-22 18:14:55 -07:00
parent c7fb60a46b
commit f7032de060
9 changed files with 69 additions and 10 deletions

View file

@ -445,10 +445,16 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
}
#ifdef WM_MOUSELEAVE
/* FIXME: Do we need the SDL 1.2 hack to generate WM_MOUSELEAVE now? */
case WM_MOUSELEAVE:
if (SDL_GetMouseFocus() == data->window) {
SDL_SetMouseFocus(NULL);
if (!SDL_GetMouse()->relative_mode) {
POINT cursorPos;
GetCursorPos(&cursorPos);
ScreenToClient(hwnd, &cursorPos);
SDL_SendMouseMotion(data->window, 0, 0, cursorPos.x, cursorPos.y);
}
SDL_SetMouseFocus(NULL);
}
returnCode = 0;
break;

View file

@ -121,6 +121,7 @@ WIN_CreateDevice(int devindex)
device->CreateWindowFramebuffer = WIN_CreateWindowFramebuffer;
device->UpdateWindowFramebuffer = WIN_UpdateWindowFramebuffer;
device->DestroyWindowFramebuffer = WIN_DestroyWindowFramebuffer;
device->OnWindowEnter = WIN_OnWindowEnter;
device->shape_driver.CreateShaper = Win32_CreateShaper;
device->shape_driver.SetWindowShape = Win32_SetWindowShape;

View file

@ -678,6 +678,25 @@ SDL_HelperWindowDestroy(void)
}
}
void WIN_OnWindowEnter(_THIS, SDL_Window * window)
{
#ifdef WM_MOUSELEAVE
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
TRACKMOUSEEVENT trackMouseEvent;
if (!data || !data->hwnd) {
/* The window wasn't fully initialized */
return;
}
trackMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
trackMouseEvent.dwFlags = TME_LEAVE;
trackMouseEvent.hwndTrack = data->hwnd;
TrackMouseEvent(&trackMouseEvent);
#endif /* WM_MOUSELEAVE */
}
#endif /* SDL_VIDEO_DRIVER_WINDOWS */
/* vi: set ts=4 sw=4 expandtab: */

View file

@ -56,6 +56,7 @@ extern void WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
extern void WIN_DestroyWindow(_THIS, SDL_Window * window);
extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window,
struct SDL_SysWMinfo *info);
extern void WIN_OnWindowEnter(_THIS, SDL_Window * window);
#endif /* _SDL_windowswindow_h */