summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Kao <daniel.m.kao@gmail.com>2023-09-24 19:49:31 -0700
committerGitHub <noreply@github.com>2023-09-25 12:49:31 +1000
commitf35dee5c05b02208716e4e76955ced71a67334eb (patch)
tree26c9442fc4b0e14e84e1c933f4874bc42a16f09c /drivers
parent960d6e0d7d8007ee826184967dc1edc5ab7b2755 (diff)
Take care of scroll divisor remainders for PS/2 drag scroll (#20732)
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ps2/ps2_mouse.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/ps2/ps2_mouse.c b/drivers/ps2/ps2_mouse.c
index ae594c94bc..88c9bdcebe 100644
--- a/drivers/ps2/ps2_mouse.c
+++ b/drivers/ps2/ps2_mouse.c
@@ -265,6 +265,7 @@ static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) {
SCROLL_SENT,
} scroll_state = SCROLL_NONE;
static uint16_t scroll_button_time = 0;
+ static int16_t scroll_x, scroll_y;
if (PS2_MOUSE_SCROLL_BTN_MASK == (mouse_report->buttons & (PS2_MOUSE_SCROLL_BTN_MASK))) {
// All scroll buttons are pressed
@@ -272,13 +273,19 @@ static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) {
if (scroll_state == SCROLL_NONE) {
scroll_button_time = timer_read();
scroll_state = SCROLL_BTN;
+ scroll_x = 0;
+ scroll_y = 0;
}
// If the mouse has moved, update the report to scroll instead of move the mouse
if (mouse_report->x || mouse_report->y) {
- scroll_state = SCROLL_SENT;
- mouse_report->v = -mouse_report->y / (PS2_MOUSE_SCROLL_DIVISOR_V);
- mouse_report->h = mouse_report->x / (PS2_MOUSE_SCROLL_DIVISOR_H);
+ scroll_state = SCROLL_SENT;
+ scroll_y += mouse_report->y;
+ scroll_x += mouse_report->x;
+ mouse_report->v = -scroll_y / (PS2_MOUSE_SCROLL_DIVISOR_V);
+ mouse_report->h = scroll_x / (PS2_MOUSE_SCROLL_DIVISOR_H);
+ scroll_y += (mouse_report->v * (PS2_MOUSE_SCROLL_DIVISOR_V));
+ scroll_x -= (mouse_report->h * (PS2_MOUSE_SCROLL_DIVISOR_H));
mouse_report->x = 0;
mouse_report->y = 0;
#ifdef PS2_MOUSE_INVERT_H