Mesen2/Windows/WindowsMouseManager.cpp

71 lines
2 KiB
C++

#include "Common.h"
#include "WindowsMouseManager.h"
WindowsMouseManager::WindowsMouseManager()
{
_arrowCursor = LoadCursor(nullptr, IDC_ARROW);
_crossCursor = LoadCursor(nullptr, IDC_CROSS);
}
WindowsMouseManager::~WindowsMouseManager() {}
SystemMouseState WindowsMouseManager::GetSystemMouseState(void* rendererHandle)
{
SystemMouseState state = {};
POINT point;
GetCursorPos(&point);
if(rendererHandle != nullptr && WindowFromPoint(point) != (HWND) rendererHandle) {
//Mouse is over another window
state.XPosition = -1;
state.YPosition = -1;
} else {
state.XPosition = point.x;
state.YPosition = point.y;
}
state.LeftButton = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0;
state.RightButton = (GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0;
state.MiddleButton = (GetAsyncKeyState(VK_MBUTTON) & 0x8000) != 0;
state.Button4 = (GetAsyncKeyState(VK_XBUTTON1) & 0x8000) != 0;
state.Button5 = (GetAsyncKeyState(VK_XBUTTON2) & 0x8000) != 0;
return state;
}
bool WindowsMouseManager::CaptureMouse(int32_t x, int32_t y, int32_t width, int32_t height, void* rendererHandle)
{
if(rendererHandle == nullptr) {
//TODO Attempting to capture the cursor when using the sofware renderer behaves really erratically
//cursor is not actually locked but clicks outside the window do nothing, and movement is really odd (not usable)
return false;
}
RECT rect;
rect.left = x;
rect.top = y;
rect.right = x + width;
rect.bottom = y + height;
ClipCursor(&rect);
return true;
}
void WindowsMouseManager::ReleaseMouse()
{
ClipCursor(nullptr);
}
void WindowsMouseManager::SetSystemMousePosition(int32_t x, int32_t y)
{
SetCursorPos(x, y);
}
void WindowsMouseManager::SetCursorImage(CursorImage cursor)
{
switch(cursor) {
case CursorImage::Hidden: SetCursor(nullptr); break;
case CursorImage::Arrow: SetCursor((HCURSOR) _arrowCursor); break;
case CursorImage::Cross: SetCursor((HCURSOR) _crossCursor); break;
}
}
double WindowsMouseManager::GetPixelScale()
{
return 1.0;
}