--- ./xorg-server-1.12.1/dix/getevents.c 2012-03-31 09:45:56.000000000 +0700 +++ ./getevents.c 2012-04-27 07:52:56.824498248 +0700 @@ -1435,13 +1435,15 @@ if ((incr > 0 && delta < 0) || (incr < 0 && delta > 0)) b--; /* we're scrolling up or left → button 4 or 6 */ - while (fabs(delta) >= fabs(incr)) { + incr = fabs(incr); + + while (fabs(delta) >= incr) { int nev_tmp; if (delta > 0) - delta -= fabs(incr); + delta -= incr; else if (delta < 0) - delta += fabs(incr); + delta += incr; /* fill_pointer_events() generates four events: one normal and one raw * event for button press and button release. @@ -1462,6 +1464,14 @@ num_events += nev_tmp; } } + else + { + if (incr > 0) + delta = fmod(delta,incr); + else + delta = 0; + break; + } } /* We emulated, update last.scroll */