Implemented support for horizontal mouse wheel scrolling as well as high-precision scrolling on Windows and OS X.

This commit is contained in:
binary1248 2015-02-27 21:27:55 +01:00 committed by Lukas Dürrenberger
parent 81a8e4e4ca
commit e17cc520d6
6 changed files with 139 additions and 45 deletions

View file

@ -474,7 +474,7 @@ BOOL isValidTextUnicode(NSEvent* event);
if (m_requester != 0)
{
NSPoint loc = [self cursorPositionFromEvent:theEvent];
m_requester->mouseWheelScrolledAt([theEvent deltaY], loc.x, loc.y);
m_requester->mouseWheelScrolledAt([theEvent deltaX], [theEvent deltaY], loc.x, loc.y);
}
// Transmit to non-SFML responder

View file

@ -164,12 +164,13 @@ public:
///
/// Send the event to SFML WindowImpl class.
///
/// \param delta scrolling delta
/// \param deltaX horizontal scrolling delta
/// \param deltaY vertical scrolling delta
/// \param x mouse x position
/// \param y mouse y position
///
////////////////////////////////////////////////////////////
void mouseWheelScrolledAt(float delta, int x, int y);
void mouseWheelScrolledAt(float deltaX, float deltaY, int x, int y);
////////////////////////////////////////////////////////////
/// \brief Mouse In Event - called by the cocoa view object

View file

@ -370,15 +370,29 @@ void WindowImplCocoa::mouseMovedAt(int x, int y)
}
////////////////////////////////////////////////////////////
void WindowImplCocoa::mouseWheelScrolledAt(float delta, int x, int y)
void WindowImplCocoa::mouseWheelScrolledAt(float deltaX, float deltaY, int x, int y)
{
Event event;
event.type = Event::MouseWheelMoved;
event.mouseWheel.delta = delta;
event.mouseWheel.delta = deltaY;
event.mouseWheel.x = x;
event.mouseWheel.y = y;
scaleOutXY(event.mouseWheel, m_delegate);
pushEvent(event);
event.type = Event::MouseWheelVerticalMoved;
event.mouseWheelVertical.delta = deltaY;
event.mouseWheelVertical.x = x;
event.mouseWheelVertical.y = y;
scaleOutXY(event.mouseWheelVertical, m_delegate);
pushEvent(event);
event.type = Event::MouseWheelHorizontalMoved;
event.mouseWheelHorizontal.delta = deltaX;
event.mouseWheelHorizontal.x = x;
event.mouseWheelHorizontal.y = y;
scaleOutXY(event.mouseWheelHorizontal, m_delegate);
pushEvent(event);
}

View file

@ -1154,6 +1154,7 @@ bool WindowImplX11::processEvent(xcb_generic_event_t* windowEvent)
xcb_button_press_event_t* e = reinterpret_cast<xcb_button_press_event_t*>(windowEvent);
// XXX: Why button 8 and 9?
// Because 4 and 5 are the vertical wheel and 6 and 7 are horizontal wheel ;)
xcb_button_t button = e->detail;
if ((button == XCB_BUTTON_INDEX_1) ||
(button == XCB_BUTTON_INDEX_2) ||
@ -1207,11 +1208,27 @@ bool WindowImplX11::processEvent(xcb_generic_event_t* windowEvent)
else if ((button == XCB_BUTTON_INDEX_4) || (button == XCB_BUTTON_INDEX_5))
{
Event event;
event.type = Event::MouseWheelMoved;
event.mouseWheel.delta = button == XCB_BUTTON_INDEX_4 ? 1 : -1;
event.mouseWheel.x = e->event_x;
event.mouseWheel.y = e->event_y;
pushEvent(event);
event.type = Event::MouseWheelVerticalMoved;
event.mouseWheelVertical.delta = button == XCB_BUTTON_INDEX_4 ? 1 : -1;
event.mouseWheelVertical.x = e->event_x;
event.mouseWheelVertical.y = e->event_y;
pushEvent(event);
}
else if ((button == 6) || (button == 7))
{
Event event;
event.type = Event::MouseWheelHorizontalMoved;
event.mouseWheelHorizontal.delta = button == 6 ? 1 : -1;
event.mouseWheelHorizontal.x = e->event_x;
event.mouseWheelHorizontal.y = e->event_y;
pushEvent(event);
}
break;
}

View file

@ -48,6 +48,9 @@
#ifndef XBUTTON2
#define XBUTTON2 0x0002
#endif
#ifndef WM_MOUSEHWHEEL
#define WM_MOUSEHWHEEL 0x020E
#endif
#ifndef MAPVK_VK_TO_VSC
#define MAPVK_VK_TO_VSC (0)
#endif
@ -373,7 +376,7 @@ void WindowImplWin32::requestFocus()
// Allow focus stealing only within the same process; compare PIDs of current and foreground window
DWORD thisPid = GetWindowThreadProcessId(m_handle, NULL);
DWORD foregroundPid = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
if (thisPid == foregroundPid)
{
// The window requesting focus belongs to the same process as the current window: steal focus
@ -671,11 +674,41 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam)
position.y = static_cast<Int16>(HIWORD(lParam));
ScreenToClient(m_handle, &position);
Int16 delta = static_cast<Int16>(HIWORD(wParam));
Event event;
event.type = Event::MouseWheelMoved;
event.mouseWheel.delta = static_cast<Int16>(HIWORD(wParam)) / 120;
event.mouseWheel.x = position.x;
event.mouseWheel.y = position.y;
event.type = Event::MouseWheelMoved;
event.mouseWheel.delta = delta / 120;
event.mouseWheel.x = position.x;
event.mouseWheel.y = position.y;
pushEvent(event);
event.type = Event::MouseWheelVerticalMoved;
event.mouseWheelVertical.delta = static_cast<float>(delta) / 120.f;
event.mouseWheelVertical.x = position.x;
event.mouseWheelVertical.y = position.y;
pushEvent(event);
break;
}
// Mouse wheel event
case WM_MOUSEHWHEEL:
{
// Mouse position is in screen coordinates, convert it to window coordinates
POINT position;
position.x = static_cast<Int16>(LOWORD(lParam));
position.y = static_cast<Int16>(HIWORD(lParam));
ScreenToClient(m_handle, &position);
Int16 delta = static_cast<Int16>(HIWORD(wParam));
Event event;
event.type = Event::MouseWheelHorizontalMoved;
event.mouseWheelHorizontal.delta = -static_cast<float>(delta) / 120.f;
event.mouseWheelHorizontal.x = position.x;
event.mouseWheelHorizontal.y = position.y;
pushEvent(event);
break;
}