mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-05 19:08:12 +00:00
inline WIN_UpdateMouseCapture
This commit is contained in:
@@ -321,41 +321,6 @@ static void WIN_CheckAsyncMouseRelease(Uint64 timestamp, SDL_WindowData *data)
|
||||
data->mouse_button_flags = (WPARAM)-1;
|
||||
}
|
||||
|
||||
static void WIN_UpdateMouseCapture(void)
|
||||
{
|
||||
SDL_Window *focusWindow = SDL_GetKeyboardFocus();
|
||||
|
||||
if (focusWindow && (focusWindow->flags & SDL_WINDOW_MOUSE_CAPTURE)) {
|
||||
SDL_WindowData *data = focusWindow->internal;
|
||||
|
||||
if (!data->mouse_tracked) {
|
||||
POINT cursorPos;
|
||||
|
||||
if (GetCursorPos(&cursorPos) && ScreenToClient(data->hwnd, &cursorPos)) {
|
||||
bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0;
|
||||
SDL_MouseID mouseID = SDL_GLOBAL_MOUSE_ID;
|
||||
|
||||
SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, mouseID, false, (float)cursorPos.x, (float)cursorPos.y);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
!swapButtons ? SDL_BUTTON_LEFT : SDL_BUTTON_RIGHT,
|
||||
(GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
!swapButtons ? SDL_BUTTON_RIGHT : SDL_BUTTON_LEFT,
|
||||
(GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
SDL_BUTTON_MIDDLE,
|
||||
(GetAsyncKeyState(VK_MBUTTON) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
SDL_BUTTON_X1,
|
||||
(GetAsyncKeyState(VK_XBUTTON1) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
SDL_BUTTON_X2,
|
||||
(GetAsyncKeyState(VK_XBUTTON2) & 0x8000) != 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void WIN_UpdateFocus(SDL_Window *window, bool expect_focus, DWORD pos)
|
||||
{
|
||||
SDL_WindowData *data = window->internal;
|
||||
@@ -2521,10 +2486,6 @@ void WIN_PumpEvents(SDL_VideoDevice *_this)
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
int new_messages = 0;
|
||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||
const bool *keystate;
|
||||
SDL_Window *focusWindow;
|
||||
#endif
|
||||
|
||||
if (_this->internal->gameinput_context) {
|
||||
WIN_UpdateGameInput(_this);
|
||||
@@ -2580,7 +2541,7 @@ void WIN_PumpEvents(SDL_VideoDevice *_this)
|
||||
You won't get a KEYUP until both are released, and that keyup will only be for the second
|
||||
key you released. Take heroic measures and check the keystate as of the last handled event,
|
||||
and if we think a key is pressed when Windows doesn't, unstick it in SDL's state. */
|
||||
keystate = SDL_GetKeyboardState(NULL);
|
||||
const bool *keystate = SDL_GetKeyboardState(NULL);
|
||||
if (keystate[SDL_SCANCODE_LSHIFT] && !(GetKeyState(VK_LSHIFT) & 0x8000)) {
|
||||
SDL_SendKeyboardKey(0, SDL_GLOBAL_KEYBOARD_ID, 0, SDL_SCANCODE_LSHIFT, false);
|
||||
}
|
||||
@@ -2591,7 +2552,7 @@ void WIN_PumpEvents(SDL_VideoDevice *_this)
|
||||
/* The Windows key state gets lost when using Windows+Space or Windows+G shortcuts and
|
||||
not grabbing the keyboard. Note: If we *are* grabbing the keyboard, GetKeyState()
|
||||
will return inaccurate results for VK_LWIN and VK_RWIN but we don't need it anyway. */
|
||||
focusWindow = SDL_GetKeyboardFocus();
|
||||
SDL_Window *focusWindow = SDL_GetKeyboardFocus();
|
||||
if (!focusWindow || !(focusWindow->flags & SDL_WINDOW_KEYBOARD_GRABBED)) {
|
||||
if (keystate[SDL_SCANCODE_LGUI] && !(GetKeyState(VK_LWIN) & 0x8000)) {
|
||||
SDL_SendKeyboardKey(0, SDL_GLOBAL_KEYBOARD_ID, 0, SDL_SCANCODE_LGUI, false);
|
||||
@@ -2628,8 +2589,41 @@ void WIN_PumpEvents(SDL_VideoDevice *_this)
|
||||
}
|
||||
}
|
||||
|
||||
// Update mouse capture
|
||||
WIN_UpdateMouseCapture();
|
||||
// Synchronize internal mouse capture state to the most current cursor state
|
||||
// since for whatever reason we are not depending exclusively on SetCapture/
|
||||
// ReleaseCapture to pipe in out-of-window mouse events.
|
||||
// Formerly WIN_UpdateMouseCapture().
|
||||
// TODO: can this go before clipcursor?
|
||||
focusWindow = SDL_GetKeyboardFocus();
|
||||
if (focusWindow && (focusWindow->flags & SDL_WINDOW_MOUSE_CAPTURE)) {
|
||||
SDL_WindowData *data = focusWindow->internal;
|
||||
|
||||
if (!data->mouse_tracked) {
|
||||
POINT cursorPos;
|
||||
|
||||
if (GetCursorPos(&cursorPos) && ScreenToClient(data->hwnd, &cursorPos)) {
|
||||
bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0;
|
||||
SDL_MouseID mouseID = SDL_GLOBAL_MOUSE_ID;
|
||||
|
||||
SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, mouseID, false, (float)cursorPos.x, (float)cursorPos.y);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
!swapButtons ? SDL_BUTTON_LEFT : SDL_BUTTON_RIGHT,
|
||||
(GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
!swapButtons ? SDL_BUTTON_RIGHT : SDL_BUTTON_LEFT,
|
||||
(GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
SDL_BUTTON_MIDDLE,
|
||||
(GetAsyncKeyState(VK_MBUTTON) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
SDL_BUTTON_X1,
|
||||
(GetAsyncKeyState(VK_XBUTTON1) & 0x8000) != 0);
|
||||
SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID,
|
||||
SDL_BUTTON_X2,
|
||||
(GetAsyncKeyState(VK_XBUTTON2) & 0x8000) != 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!_this->internal->gameinput_context) {
|
||||
WIN_CheckKeyboardAndMouseHotplug(_this, false);
|
||||
|
Reference in New Issue
Block a user