diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp index bf7a77e..38ab96d 100644 --- a/source/Platform/Win32/Win32EventQueue.cpp +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -39,7 +39,7 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) case WM_MOUSEMOVE : case WM_MOUSELEAVE : - if (Win32Mouse::handleMessage(msg)) { + if (Win32Mouse::handleMessage(msg, event)) { // Mouse did handle the message. return 0; } @@ -51,7 +51,7 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) SetCapture(msg.hwnd); - if (Win32Mouse::handleMessage(msg)) { + if (Win32Mouse::handleMessage(msg, event)) { // Mouse did handle the message. return 0; } @@ -63,7 +63,7 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) ReleaseCapture(); - if (Win32Mouse::handleMessage(msg)) { + if (Win32Mouse::handleMessage(msg, event)) { // Mouse did handle the message. return 0; } diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index d1aba97..da586ae 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -2,14 +2,11 @@ #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; @@ -45,75 +42,67 @@ bool Win32Mouse::isButtonDown(Mouse::Button button) const 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) +bool Win32Mouse::handleMessage(MSG msg, Event& event) { - return msg_buf.postMessage(message); + 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 diff --git a/source/Platform/Win32/Win32Mouse.h b/source/Platform/Win32/Win32Mouse.h index dfccf59..33994c4 100644 --- a/source/Platform/Win32/Win32Mouse.h +++ b/source/Platform/Win32/Win32Mouse.h @@ -3,6 +3,7 @@ #define PLATFORM_WIN32_MOUSE_H #include +#include #include namespace sp { @@ -19,7 +20,7 @@ public : virtual bool isButtonDown(Mouse::Button button) const; - static bool handleMessage(MSG message); + static bool handleMessage(MSG msg, Event& event); protected :