Platform/Win32/Win32Mouse: skip Win32MsgBuffer and handle event directly in handleMessage()
This commit is contained in:
parent
2e9701a15b
commit
3c209ba01b
3 changed files with 63 additions and 73 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,14 +2,11 @@
|
|||
#include <Windows.h>
|
||||
#include <Spectre/System/Log.h>
|
||||
#include <Spectre/Input/InputModule.h>
|
||||
#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
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#define PLATFORM_WIN32_MOUSE_H
|
||||
|
||||
#include <Windows.h>
|
||||
#include <Spectre/System/Event.h>
|
||||
#include <Spectre/Input/Mouse.h>
|
||||
|
||||
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 :
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue