Files
MesenCE/Windows/WindowsMouseManager.cpp
SourMesen e391fd8f9a Code: Add auto-formatting rules for C++ (clang-format) and enforce in CI via "clang-format" and "dotnet format" (#78)
* Code: Add auto-formatting rules for C++ projects (clang-format) and enforce code style via "clang-format" and "dotnet format"

* fix ui format warnings
2026-04-30 06:03:55 -07:00

74 lines
2.0 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;
}