Skip to content

Commit

Permalink
WinRT: fixed two bugs regarding mouse events
Browse files Browse the repository at this point in the history
The first bug had mouse motion events not getting sent out on non-touch devices, if and when a mouse button wasn't pressed.

The second bug caused virtual mouse motion events to get sent out-of-order on touch devices: the motion event would get sent after the touch occurred, rather than before.
  • Loading branch information
DavidLudwig committed Oct 27, 2013
1 parent 62c781e commit e64e3d8
Showing 1 changed file with 26 additions and 22 deletions.
48 changes: 26 additions & 22 deletions src/video/winrt/SDL_winrtpointerinput.cpp
Expand Up @@ -209,20 +209,20 @@ void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::Po
}

Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position);
Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);

if (!WINRT_LeftFingerDown) {
Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
if (button) {
#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y);
#endif
SDL_SendMouseButton(window, 0, SDL_PRESSED, button);
}
if (!WINRT_IsTouchEvent(pointerPoint)) {
SDL_SendMouseButton(window, 0, SDL_PRESSED, button);
} else {
if (!WINRT_LeftFingerDown) {
if (button) {
SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y);
SDL_SendMouseButton(window, 0, SDL_PRESSED, button);
}

WINRT_LeftFingerDown = pointerPoint->PointerId;
}
WINRT_LeftFingerDown = pointerPoint->PointerId;
}

if (WINRT_IsTouchEvent(pointerPoint)) {
SDL_SendTouch(
WINRT_TouchID,
(SDL_FingerID) pointerPoint->PointerId,
Expand All @@ -242,11 +242,13 @@ WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPo

Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position);

if (pointerPoint->PointerId == WINRT_LeftFingerDown) {
if (!WINRT_IsTouchEvent(pointerPoint)) {
SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y);
}
} else if (pointerPoint->PointerId == WINRT_LeftFingerDown) {
if (pointerPoint->PointerId == WINRT_LeftFingerDown) {
SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y);
}

if (WINRT_IsTouchEvent(pointerPoint)) {
SDL_SendTouchMotion(
WINRT_TouchID,
(SDL_FingerID) pointerPoint->PointerId,
Expand All @@ -263,16 +265,18 @@ void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::P
}

Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position);
Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);

if (WINRT_LeftFingerDown == pointerPoint->PointerId) {
Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
if (button) {
SDL_SendMouseButton(window, 0, SDL_RELEASED, button);
if (!WINRT_IsTouchEvent(pointerPoint)) {
SDL_SendMouseButton(window, 0, SDL_RELEASED, button);
} else {
if (WINRT_LeftFingerDown == pointerPoint->PointerId) {
if (button) {
SDL_SendMouseButton(window, 0, SDL_RELEASED, button);
}
WINRT_LeftFingerDown = 0;
}
WINRT_LeftFingerDown = 0;
}

if (WINRT_IsTouchEvent(pointerPoint)) {

SDL_SendTouch(
WINRT_TouchID,
(SDL_FingerID) pointerPoint->PointerId,
Expand Down

0 comments on commit e64e3d8

Please sign in to comment.