#include #include #include #include "Win32MsgBuffer.h" #include "Win32Input.h" #include "Win32Mouse.h" namespace sp { static Win32MsgBuffer msg_buf; 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) { // TODO: Clean this. for(int i = 0; i < msg_buf.index; i++) { MSG msg = msg_buf.messages[i]; if (msg.message == WM_LBUTTONDOWN || msg.message == WM_LBUTTONUP) { InputEvent event(InputEvent::MouseButton); event.mouseButton.button = Mouse::Button::Left; event.mouseButton.pressed = msg.message == WM_LBUTTONDOWN; m_state[Mouse::Button::Left] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_RBUTTONDOWN || msg.message == WM_RBUTTONUP) { InputEvent event(InputEvent::MouseButton); event.mouseButton.button = Mouse::Button::Right; event.mouseButton.pressed = msg.message == WM_RBUTTONDOWN; m_state[Mouse::Button::Right] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_MBUTTONDOWN || msg.message == WM_MBUTTONUP) { InputEvent event(InputEvent::MouseButton); event.mouseButton.button = Mouse::Button::Middle; event.mouseButton.pressed = msg.message == WM_MBUTTONDOWN; m_state[Mouse::Button::Middle] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_XBUTTONDOWN || msg.message == WM_XBUTTONUP) { int btn = GET_XBUTTON_WPARAM(msg.wParam); InputEvent event(InputEvent::MouseButton); event.mouseButton.button = btn == XBUTTON1 ? Mouse::Button::Button1 : Mouse::Button::Button2; event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; m_state[Mouse::Button::Button1] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_MOUSEMOVE) { InputEvent event(InputEvent::MousePosition); 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)) { continue; } event.mouse.x = x; event.mouse.y = y; input->postInputEvent(event); m_position = _normalizePos(x, y, area); } } msg_buf.index = 0; } bool Win32Mouse::handleMessage(MSG message) { return msg_buf.postMessage(message); } } // namespace sp