#include #include #include #include "Win32Input.h" #include "Win32Mouse.h" namespace sp { static Vector2f _normalizePos(int x, int y, RECT area) { Vector2f out; out.x = x / ((float) (area.right - area.left)); out.y = y / ((float) (area.bottom - area.top)); return out; } static RECT GetClientArea(HWND hwnd) { RECT rect; GetClientRect(hwnd, &rect); return rect; } void Win32Mouse::init() { memset(m_state, 0, Mouse::Button::NUM_MBUTTONS); m_tracked = false; } Vector2f Win32Mouse::getPosition() const { return m_position; } bool Win32Mouse::isButtonDown(Mouse::Button button) const { return m_state[button]; } void Win32Mouse::update(InputModule *input) { } bool Win32Mouse::handleMessage(MSG msg, Event& event) { switch(msg.message) { case WM_LBUTTONUP : case WM_LBUTTONDOWN : case WM_RBUTTONUP : case WM_RBUTTONDOWN : case WM_MBUTTONUP : case WM_MBUTTONDOWN : case WM_XBUTTONUP : case WM_XBUTTONDOWN : event.type = Event::MouseButton; break; } switch(msg.message) { case WM_LBUTTONUP : case WM_LBUTTONDOWN : event.mouseButton.button = Mouse::Button::Left; event.mouseButton.pressed = msg.message == WM_LBUTTONDOWN; return true; case WM_RBUTTONUP : case WM_RBUTTONDOWN : event.mouseButton.button = Mouse::Button::Right; event.mouseButton.pressed = msg.message == WM_RBUTTONDOWN; return true; case WM_MBUTTONUP : case WM_MBUTTONDOWN : event.mouseButton.button = Mouse::Button::Right; event.mouseButton.pressed = msg.message == WM_MBUTTONDOWN; return true; case WM_XBUTTONUP : case WM_XBUTTONDOWN : event.mouseButton.button = GET_XBUTTON_WPARAM(msg.wParam) == XBUTTON1 ? Mouse::Button::Button1 : Mouse::Button::Button2; event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; return true; case WM_MOUSEMOVE : RECT area = GetClientArea(msg.hwnd); int x = LOWORD(msg.lParam); int y = HIWORD(msg.lParam); // Do not forward the message if mouse is outside client area. if ( (x < area.left) || (x > area.right) || (y < area.top) || (y > area.bottom) ) { return false; } event.type = Event::MouseMove; event.mouseMove.x = x; event.mouseMove.y = y; return true; } return false; } } // namespace sp