limit mouse coordinates in relative mode

Issue #138
This commit is contained in:
flyinghead 2021-03-15 17:55:44 +01:00
parent 5e619a70d4
commit 901e58573e
1 changed files with 39 additions and 16 deletions

View File

@ -1126,6 +1126,9 @@ s32 mo_y_prev[4] = { -1, -1, -1, -1 };
// physical mouse coordinates (relative to window/screen)
s32 mo_x_phy;
s32 mo_y_phy;
// last known screen/window size
static s32 mo_width;
static s32 mo_height;
struct maple_mouse : maple_base
{
@ -1379,21 +1382,8 @@ maple_device* maple_Create(MapleDeviceType type)
return rv;
}
void SetMousePosition(int x, int y, int width, int height, u32 mouseId)
static void screenToNative(int& x, int& y, int width, int height)
{
if (mouseId == 0)
{
mo_x_phy = x;
mo_y_phy = y;
}
if (config::Rotate90)
{
int t = y;
y = x;
x = height - t;
std::swap(width, height);
}
float fx, fy;
if ((float)width / height >= 640.f / 480.f)
{
@ -1409,8 +1399,30 @@ void SetMousePosition(int x, int y, int width, int height, u32 mouseId)
scale /= config::ScreenStretching / 100.f;
fy = (y - (height - 480.f / scale) / 2.f) * scale;
}
mo_x_abs[mouseId] = (int)std::round(fx);
mo_y_abs[mouseId] = (int)std::round(fy);
x = (int)std::round(fx);
y = (int)std::round(fy);
}
void SetMousePosition(int x, int y, int width, int height, u32 mouseId)
{
if (mouseId == 0)
{
mo_x_phy = x;
mo_y_phy = y;
}
mo_width = width;
mo_height = height;
if (config::Rotate90)
{
int t = y;
y = x;
x = height - t;
std::swap(width, height);
}
screenToNative(x, y, width, height);
mo_x_abs[mouseId] = x;
mo_y_abs[mouseId] = y;
if (mo_x_prev[mouseId] != -1)
{
@ -1423,15 +1435,26 @@ void SetMousePosition(int x, int y, int width, int height, u32 mouseId)
void SetRelativeMousePosition(int xrel, int yrel, u32 mouseId)
{
int width = mo_width;
int height = mo_height;
if (config::Rotate90)
{
std::swap(xrel, yrel);
xrel = -xrel;
std::swap(width, height);
}
float dx = (float)xrel * config::MouseSensitivity / 100.f;
float dy = (float)yrel * config::MouseSensitivity / 100.f;
mo_x_delta[mouseId] += dx;
mo_y_delta[mouseId] += dy;
int minX = -width / 32;
int minY = -height / 32;
int maxX = width + width / 32;
int maxY = height + height / 32;
screenToNative(minX, minY, width, height);
screenToNative(maxX, maxY, width, height);
mo_x_abs[mouseId] += (int)std::round(dx);
mo_y_abs[mouseId] += (int)std::round(dy);
mo_x_abs[mouseId] = std::min(std::max(mo_x_abs[mouseId], minX), maxX);
mo_y_abs[mouseId] = std::min(std::max(mo_y_abs[mouseId], minY), maxY);
}