108 lines
2.2 KiB
C++
108 lines
2.2 KiB
C++
|
|
#include <Windows.h>
|
|
#include <Spectre/System/Log.h>
|
|
#include <Spectre/Input/InputModule.h>
|
|
#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
|