diff options
Diffstat (limited to 'drivers/ps2')
| -rw-r--r-- | drivers/ps2/ps2_mouse.c | 13 | 
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 | 
