summaryrefslogtreecommitdiffhomepage
path: root/proto-mouse/ftnoir_protocol_mouse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'proto-mouse/ftnoir_protocol_mouse.cpp')
-rw-r--r--proto-mouse/ftnoir_protocol_mouse.cpp106
1 files changed, 59 insertions, 47 deletions
diff --git a/proto-mouse/ftnoir_protocol_mouse.cpp b/proto-mouse/ftnoir_protocol_mouse.cpp
index 5e8a7bc1..e5b2192b 100644
--- a/proto-mouse/ftnoir_protocol_mouse.cpp
+++ b/proto-mouse/ftnoir_protocol_mouse.cpp
@@ -4,87 +4,99 @@
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*/
+
#include "ftnoir_protocol_mouse.h"
+
#include "api/plugin-api.hpp"
+#include "compat/math.hpp"
+
#include <cmath>
#include <algorithm>
+
#include <windows.h>
#ifndef MOUSEEVENTF_MOVE_NOCOALESCE
# define MOUSEEVENTF_MOVE_NOCOALESCE 0x2000
#endif
-void mouse::pose(const double *headpose)
+static const double invert[] = {
+ 1., 1., 1.,
+ 1., -1., 1.
+};
+
+void mouse::pose(const double* headpose, const double*)
{
- 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;
- static constexpr double invert[] =
- {
- 1., 1., 1.,
- 1., -1., 1.
- };
-
- if (axis_x >= 0 && axis_x < 6)
- {
+ if (axis_x == std::clamp(axis_x, (int)Axis_MIN, (int)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 == std::clamp(axis_y, (int)Axis_MIN, (int)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;
- (void) SendInput(1, &input, sizeof(INPUT));
-
- last_x = mouse_x;
- last_y = mouse_y;
+ int dx = get_delta(mouse_x, last_x), dy = mouse_y - last_y;
+
+ last_x = mouse_x; last_y = mouse_y;
+
+ if (dx || dy)
+ {
+ 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;
+ }
+ }
+ }
}
QString mouse::game_name()
{
- return "Mouse tracker";
+ return tr("Mouse tracker");
}
int mouse::get_delta(int val, int prev)
{
- using std::abs;
-
- const int a = abs(val - prev), b = abs(val + prev), c = abs(val);
- if (c < a && c < b)
- return val;
- if (b < a && b < c)
+ const int a = std::abs(val - prev), b = std::abs(val + prev);
+ if (b < a)
return val + prev;
- return val - prev;
+ else
+ return val - prev;
}
int mouse::get_value(double val, double sensitivity, bool is_rotation)
{
- static constexpr double c = 1e-1;
- static constexpr double sgn[] = { 1e-2, 1 };
+ constexpr double c[] = { 1e-3, 1e-1 };
- return iround(val * c * sensitivity * sgn[unsigned(is_rotation)]);
-}
-
-mouse::mouse() : last_x(0), last_y(0) {}
-
-bool mouse::correct()
-{
- return true;
+ return iround(val * sensitivity * c[unsigned(is_rotation)]);
}
OPENTRACK_DECLARE_PROTOCOL(mouse, MOUSEControls, mouseDll)