diff options
Diffstat (limited to 'proto-mouse/ftnoir_protocol_mouse.cpp')
-rw-r--r-- | proto-mouse/ftnoir_protocol_mouse.cpp | 73 |
1 files changed, 45 insertions, 28 deletions
diff --git a/proto-mouse/ftnoir_protocol_mouse.cpp b/proto-mouse/ftnoir_protocol_mouse.cpp index 3afee411..d57d8809 100644 --- a/proto-mouse/ftnoir_protocol_mouse.cpp +++ b/proto-mouse/ftnoir_protocol_mouse.cpp @@ -9,8 +9,10 @@ #include "api/plugin-api.hpp" #include "compat/math.hpp" + #include <cmath> #include <algorithm> + #include <windows.h> #ifndef MOUSEEVENTF_MOVE_NOCOALESCE @@ -24,38 +26,56 @@ static const double invert[] = { void mouse::pose(const double* headpose) { - const int axis_x = s.Mouse_X - 1; - const int axis_y = s.Mouse_Y - 1; + const int axis_x = s.mouse_x - 1; + const int axis_y = s.mouse_y - 1; int mouse_x = 0, mouse_y = 0; - if (axis_x >= 0 && axis_x < 6) - { + if (axis_x == clamp(axis_x, Axis_MIN, Axis_MAX)) mouse_x = get_value(headpose[axis_x] * invert[axis_x], - s.sensitivity_x(), + *s.sensitivity_x, axis_x >= 3); - } - if (axis_y >= 0 && axis_y < 6) + if (axis_y == clamp(axis_y, Axis_MIN, Axis_MAX)) mouse_y = get_value(headpose[axis_y] * invert[axis_y], - s.sensitivity_y(), + *s.sensitivity_y, axis_y >= 3); - MOUSEINPUT mi; - mi.dx = get_delta(mouse_x, last_x); - mi.dy = get_delta(mouse_y, last_y); - mi.mouseData = 0; - mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_MOVE_NOCOALESCE; - mi.time = 0; - mi.dwExtraInfo = 0; - INPUT input; - input.type = INPUT_MOUSE; - input.mi = mi; - if (mi.dx || mi.dy) + const int dx = get_delta(mouse_x, last_x), + dy = get_delta(mouse_y, last_y); + + last_x = mouse_x; last_y = mouse_y; + + if (dx || dy) { - (void) SendInput(1, &input, sizeof(INPUT)); - last_x = mouse_x; - last_y = mouse_y; + switch (s.input_method) + { + default: + eval_once(qDebug() << "proto/mouse: invalid input method"); + [[fallthrough]]; + case input_direct: + { + INPUT input; + input.type = INPUT_MOUSE; + MOUSEINPUT& mi = input.mi; + mi = {}; + mi.dx = dx; + mi.dy = dy; + mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_MOVE_NOCOALESCE; + + (void)SendInput(1, &input, sizeof(input)); + + break; + } + case input_legacy: + { + POINT pt{}; + (void)GetCursorPos(&pt); + (void)SetCursorPos(pt.x + dx, pt.y + dy); + + break; + } + } } } @@ -66,9 +86,7 @@ QString mouse::game_name() int mouse::get_delta(int val, int prev) { - using std::abs; - - const int a = abs(val - prev), b = abs(val + prev); + const int a = std::abs(val - prev), b = std::abs(val + prev); if (b < a) return val + prev; else @@ -77,10 +95,9 @@ int mouse::get_delta(int val, int prev) int mouse::get_value(double val, double sensitivity, bool is_rotation) { - constexpr double sgn[] = { 1e-2, 1 }; - constexpr double c = 1e-1; + constexpr double c[] = { 1e-3, 1e-1 }; - return iround(val * c * sensitivity * sgn[unsigned(is_rotation)]); + return iround(val * sensitivity * c[unsigned(is_rotation)]); } OPENTRACK_DECLARE_PROTOCOL(mouse, MOUSEControls, mouseDll) |