diff options
| author | Pietro Gagliardi <[email protected]> | 2014-11-29 18:29:50 -0500 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-11-29 18:29:50 -0500 |
| commit | d23cdd76827728a4f7eb6b0afa9b6e572aab964c (patch) | |
| tree | 71cb46d964c339d5a8f8b179ad0d8e2f102dcc72 /wintable/vscroll.h | |
| parent | 6cce68074a84e903b42032e2e972d551205c147f (diff) | |
Started splitting the new Windows Table code into more manageable chunks.
Diffstat (limited to 'wintable/vscroll.h')
| -rw-r--r-- | wintable/vscroll.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/wintable/vscroll.h b/wintable/vscroll.h new file mode 100644 index 0000000..7f2d912 --- /dev/null +++ b/wintable/vscroll.h @@ -0,0 +1,97 @@ +// 29 november 2014 + +static void vscrollto(struct table *t, intptr_t newpos) +{ + SCROLLINFO si; + RECT scrollArea; + + if (newpos < 0) + newpos = 0; + if (newpos > (t->count - t->pagesize)) + newpos = (t->count - t->pagesize); + + scrollArea = realClientRect(t); + + // negative because ScrollWindowEx() is "backwards" + if (ScrollWindowEx(t->hwnd, 0, (-(newpos - t->firstVisible)) * rowHeight(t), + &scrollArea, &scrollArea, NULL, NULL, + SW_ERASE | SW_INVALIDATE) == ERROR) + abort(); + t->firstVisible = newpos; + + ZeroMemory(&si, sizeof (SCROLLINFO)); + si.cbSize = sizeof (SCROLLINFO); + si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; + si.nPage = t->pagesize; + si.nMin = 0; + si.nMax = t->count - 1; // nMax is inclusive + si.nPos = t->firstVisible; + SetScrollInfo(t->hwnd, SB_VERT, &si, TRUE); +} + +static void vscrollby(struct table *t, intptr_t n) +{ + vscrollto(t, t->firstVisible + n); +} + +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); +} + +static void vscroll(struct table *t, WPARAM wParam) +{ + SCROLLINFO si; + intptr_t newpos; + + ZeroMemory(&si, sizeof (SCROLLINFO)); + si.cbSize = sizeof (SCROLLINFO); + si.fMask = SIF_POS | SIF_TRACKPOS; + if (GetScrollInfo(t->hwnd, SB_VERT, &si) == 0) + abort(); + + newpos = t->firstVisible; + switch (LOWORD(wParam)) { + case SB_TOP: + newpos = 0; + break; + case SB_BOTTOM: + newpos = t->count - t->pagesize; + break; + case SB_LINEUP: + newpos--; + break; + case SB_LINEDOWN: + newpos++; + break; + case SB_PAGEUP: + newpos -= t->pagesize; + break; + case SB_PAGEDOWN: + newpos += t->pagesize; + break; + case SB_THUMBPOSITION: + newpos = (intptr_t) (si.nPos); + break; + case SB_THUMBTRACK: + newpos = (intptr_t) (si.nTrackPos); + } + + vscrollto(t, newpos); +} |
