diff options
| author | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-04-14 13:32:55 +1000 |
|---|---|---|
| committer | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-04-14 13:32:55 +1000 |
| commit | 1249653b654bca6caaecc407a2128c4f1ccabd52 (patch) | |
| tree | 444622eb6c90217c54a2beb6044db1a68a38f495 /fastmouse.patch | |
| parent | 12ad6ebd615f57b7b1032953ab9ea9b29ca1bc87 (diff) | |
Move impl to header single file, fix linking etc
Diffstat (limited to 'fastmouse.patch')
| -rw-r--r-- | fastmouse.patch | 263 |
1 files changed, 158 insertions, 105 deletions
diff --git a/fastmouse.patch b/fastmouse.patch index d525668..7eb8e3b 100644 --- a/fastmouse.patch +++ b/fastmouse.patch @@ -1,57 +1,46 @@ -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 4497b50799db..5a64a10b06da 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -1680,6 +1680,8 @@ static void hid_process_report(struct hid_device *hid, - unsigned int a; - struct hid_field_entry *entry; - struct hid_field *field; -+ struct input_dev *fastmouse_dev = NULL; +diff --git a/drivers/hid/fastmouse.h b/drivers/hid/fastmouse.h +new file mode 100644 +index 000000000000..2383de88932f +--- /dev/null ++++ b/drivers/hid/fastmouse.h +@@ -0,0 +1,189 @@ ++#ifndef FASTMOUSE_H_ ++#define FASTMOUSE_H_ + - - /* first retrieve all incoming values in data */ - for (a = 0; a < report->maxfield; a++) -@@ -1692,6 +1694,10 @@ static void hid_process_report(struct hid_device *hid, - list) { - field = entry->field; - -+ if (hid->type == HID_TYPE_USBMOUSE && field->hidinput) { -+ fastmouse_dev = field->hidinput->input; -+ } ++// Mock functionality and structs for user space unit tests. ++#ifndef __KERNEL__ ++#include <climits> + - if (field->flags & HID_MAIN_ITEM_VARIABLE) - hid_process_event(hid, - field, -@@ -1721,6 +1727,13 @@ static void hid_process_report(struct hid_device *hid, - hid_input_array_field(hid, field, interrupt); - } - } ++typedef int __s32; ++struct input_dev {}; ++enum event_type { ++ EV_REL, ++}; ++enum movement_type { ++ REL_X, ++ REL_Y, ++}; ++struct mouse_movement { ++ int x = 0; ++ int y = 0; ++}; ++static struct mouse_movement movement = { ++ .x = 0, ++ .y = 0, ++}; ++static void input_event(input_dev*, event_type, movement_type code, int value) { ++ movement.x += (code == REL_X) * value; ++ movement.y += (code == REL_Y) * value; ++} ++#endif + -+ -+ if (fastmouse_dev) { -+ fastmouse_input_emit(fastmouse_dev); -+ } ++extern void input_event_fastmouse_log( ++ struct input_dev*, ++ const unsigned int, ++ const unsigned int code, ++ __s32 value); ++extern void fastmouse_input_emit(struct input_dev *input); + -+ - } - - /* -diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c -index 9d80635a91eb..56e1bb7b7023 100644 ---- a/drivers/hid/hid-input.c -+++ b/drivers/hid/hid-input.c -@@ -14,6 +14,7 @@ - */ - - #include <linux/module.h> -+#include <linux/moduleparam.h> - #include <linux/slab.h> - #include <linux/kernel.h> - -@@ -1505,6 +1506,150 @@ static void hid_report_set_tool(struct hid_report *report, struct input_dev *inp - report->tool = new_tool; - } - +struct fastmouse_state { + int division; + long frame_x, frame_y; @@ -62,6 +51,26 @@ index 9d80635a91eb..56e1bb7b7023 100644 + long accel; + */ +}; ++ ++/* TODO (for accel) ++static unsigned __int128 i128_sqrt(const unsigned __int128 v) { ++ unsigned __int128 left = 0; ++ unsigned __int128 right = v; ++ while (left < right) { ++ const unsigned __int128 mid = left + ((right - left) / 2); ++ if (mid >= ~(u64)0 || mid * mid > v) { ++ right = mid; ++ } else if (mid * mid == v) { ++ return mid; ++ } else { ++ left = mid + 1; ++ } ++ } ++ return left != 0 ? left - 1 : 0; ++} ++*/ ++ ++#ifdef FASTMOUSE_IMPL +static struct fastmouse_state fastmouse = { + .division = 1, + .frame_x = 0, @@ -76,6 +85,39 @@ index 9d80635a91eb..56e1bb7b7023 100644 + */ +}; + ++void input_event_fastmouse_log( ++ struct input_dev*, ++ const unsigned int, ++ const unsigned int code, ++ __s32 value) { ++ fastmouse.frame_x += (code == REL_X) * value; ++ fastmouse.frame_y += (code == REL_Y) * value; ++} ++ ++void fastmouse_input_emit(struct input_dev *input) { ++ const long rise = fastmouse.rise / fastmouse.division; ++ const long run = fastmouse.run / fastmouse.division; ++ ++ fastmouse.accum_x += fastmouse.frame_x * run - fastmouse.frame_y * rise; ++ fastmouse.accum_y += fastmouse.frame_x * rise + fastmouse.frame_y * run; ++ ++ const long emit_x = fastmouse.accum_x / INT_MAX; ++ if (emit_x != 0) { ++ input_event(input, EV_REL, REL_X, (__s32)emit_x); ++ } ++ const long emit_y = fastmouse.accum_y / INT_MAX; ++ if (emit_y != 0) { ++ input_event(input, EV_REL, REL_Y, (__s32)emit_y); ++ } ++ fastmouse.accum_x %= INT_MAX; ++ fastmouse.accum_y %= INT_MAX; ++ ++ fastmouse.frame_x = fastmouse.frame_y = 0; ++} ++ ++#ifdef __KERNEL__ ++#include <linux/moduleparam.h> ++ +static int set_division(const char *val, const struct kernel_param *kp) { + const int ret = kstrtoint(val, 0, &fastmouse.division); + if (ret != 0 || fastmouse.division <= 0) { @@ -147,59 +189,82 @@ index 9d80635a91eb..56e1bb7b7023 100644 +module_param_cb(acceleration, &accel_ops, &fastmouse.accel, 0664); +MODULE_PARM_DESC(acceleration, "Mouse acceleration (default: 1)"); +*/ ++#endif ++#endif + -+static void input_event_fastmouse_log( -+ struct input_dev *input, -+ const unsigned int type, -+ const unsigned int code, -+ __s32 value) { -+ fastmouse.frame_x += (code == REL_X) * value; -+ fastmouse.frame_y += (code == REL_Y) * value; -+} ++#endif +\ No newline at end of file +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 4497b50799db..9dc84229abe3 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -35,6 +35,8 @@ + + #include "hid-ids.h" + ++#include "fastmouse.h" + -+/* TODO (for accel) -+static unsigned __int128 i128_sqrt(const unsigned __int128 v) { -+ unsigned __int128 left = 0; -+ unsigned __int128 right = v; -+ while (left < right) { -+ const unsigned __int128 mid = left + ((right - left) / 2); -+ if (mid >= ~(u64)0 || mid * mid > v) { -+ right = mid; -+ } else if (mid * mid == v) { -+ return mid; -+ } else { -+ left = mid + 1; -+ } -+ } -+ return left != 0 ? left - 1 : 0; -+} -+*/ + /* + * Version Information + */ +@@ -1680,6 +1682,8 @@ static void hid_process_report(struct hid_device *hid, + unsigned int a; + struct hid_field_entry *entry; + struct hid_field *field; ++ struct input_dev *fastmouse_dev = NULL; ++ + + /* first retrieve all incoming values in data */ + for (a = 0; a < report->maxfield; a++) +@@ -1692,6 +1696,10 @@ static void hid_process_report(struct hid_device *hid, + list) { + field = entry->field; + ++ if (hid->type == HID_TYPE_USBMOUSE && field->hidinput) { ++ fastmouse_dev = field->hidinput->input; ++ } ++ + if (field->flags & HID_MAIN_ITEM_VARIABLE) + hid_process_event(hid, + field, +@@ -1721,6 +1729,13 @@ static void hid_process_report(struct hid_device *hid, + hid_input_array_field(hid, field, interrupt); + } + } + -+void fastmouse_input_emit(struct input_dev *input) { -+ const long rise = fastmouse.rise / fastmouse.division; -+ const long run = fastmouse.run / fastmouse.division; -+ -+ fastmouse.accum_x += fastmouse.frame_x * run - fastmouse.frame_y * rise; -+ fastmouse.accum_y += fastmouse.frame_x * rise + fastmouse.frame_y * run; + -+ const long emit_x = fastmouse.accum_x / INT_MAX; -+ if (emit_x != 0) { -+ input_event(input, EV_REL, REL_X, emit_x); -+ } -+ const long emit_y = fastmouse.accum_y / INT_MAX; -+ if (emit_y != 0) { -+ input_event(input, EV_REL, REL_Y, emit_y); ++ if (fastmouse_dev) { ++ fastmouse_input_emit(fastmouse_dev); + } -+ fastmouse.accum_x %= INT_MAX; -+ fastmouse.accum_y %= INT_MAX; ++ + -+ fastmouse.frame_x = fastmouse.frame_y = 0; -+} + } + + /* +diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c +index 9d80635a91eb..552bb63b9906 100644 +--- a/drivers/hid/hid-input.c ++++ b/drivers/hid/hid-input.c +@@ -22,6 +22,10 @@ + + #include "hid-ids.h" + ++#define FASTMOUSE_IMPL ++#include "fastmouse.h" ++#undef FASTMOUSE_IMPL ++ + #define unk KEY_UNKNOWN + + static const unsigned char hid_keyboard[256] = { +@@ -1505,6 +1509,7 @@ static void hid_report_set_tool(struct hid_report *report, struct input_dev *inp + report->tool = new_tool; + } + + void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) { struct input_dev *input; -@@ -1713,7 +1858,12 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct +@@ -1713,7 +1718,12 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct (!test_bit(usage->code, input->key)) == value) input_event(input, EV_MSC, MSC_SCAN, usage->hid); @@ -213,15 +278,3 @@ index 9d80635a91eb..56e1bb7b7023 100644 if ((field->flags & HID_MAIN_ITEM_RELATIVE) && usage->type == EV_KEY && value) { -diff --git a/include/linux/hid.h b/include/linux/hid.h -index cdc0dc13c87f..8321d637b112 100644 ---- a/include/linux/hid.h -+++ b/include/linux/hid.h -@@ -940,6 +940,7 @@ extern void hid_unregister_driver(struct hid_driver *); - module_driver(__hid_driver, hid_register_driver, \ - hid_unregister_driver) - -+extern void fastmouse_input_emit(struct input_dev *input); - extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); - extern void hidinput_report_event(struct hid_device *hid, struct hid_report *report); - extern int hidinput_connect(struct hid_device *hid, unsigned int force); |
