static void wheelscroll(struct table *t, WPARAM wParam) { int delta; int lines; UINT scrollAmount; delta = GET_WHEEL_DELTA_WPARAM(wParam); if (SystemParametersInfoW(SPI_GETWHEELSCROLLLINES, 0, &scrollAmount, 0) == 0) abort(); if (scrollAmount == WHEEL_PAGESCROLL) scrollAmount = t->pagesize; if (scrollAmount == 0) // no mouse wheel scrolling (or t->pagesize == 0) return; // the rest of this is basically http://blogs.msdn.com/b/oldnewthing/archive/2003/08/07/54615.aspx and http://blogs.msdn.com/b/oldnewthing/archive/2003/08/11/54624.aspx // see those pages for information on subtleties delta += t->wheelCarry; lines = delta * ((int) scrollAmount) / WHEEL_DELTA; t->wheelCarry = delta - lines * WHEEL_DELTA / ((int) scrollAmount); vscrollby(t, -lines); }
void areaUpdateScroll(uiArea *a) { // use a no-op scroll to simulate scrolling hscrollby(a, 0); vscrollby(a, 0); }