#include <assert.h>
-static BOOL SCROLL_trackVertical;
-static enum SCROLL_HITTEST SCROLL_trackHitTest;
-/* Is the moving thumb being displayed? */
-static BOOL SCROLL_MovingThumb = FALSE;
-static HWND SCROLL_TrackingWin = 0;
-static INT SCROLL_TrackingBar = 0;
-static INT SCROLL_TrackingPos = 0;
-static INT SCROLL_TrackingVal = 0;
-
static void ScreenToWindow( HWND hWnd, POINT* pt)
{
RECT rcWnd;
{
RECT r, rcPart;
+ /* thumbPos is relative to the edge of the scrollbar */
+
r = psbi->rcScrollBar;
if (vertical)
{
+ thumbPos += pcontext->wi.rcClient.top - pcontext->wi.rcWindow.top;
r.top += psbi->dxyLineButton;
r.bottom -= (psbi->dxyLineButton);
}
else
{
+ thumbPos += pcontext->wi.rcClient.left - pcontext->wi.rcWindow.left;
r.left += psbi->dxyLineButton;
r.right -= psbi->dxyLineButton;
}
}
}
-static void SCROLL_DrawMovingThumb( PDRAW_CONTEXT pcontext, SCROLLBARINFO* psbi, BOOL vertical)
+static void SCROLL_DrawMovingThumb(PWND_DATA pwndData, PDRAW_CONTEXT pcontext, SCROLLBARINFO* psbi, BOOL vertical)
{
- INT pos = SCROLL_TrackingPos;
+ INT pos = pwndData->SCROLL_TrackingPos;
INT max_size;
if( vertical )
SCROLL_DrawInterior(pcontext, psbi, pos, vertical, SCROLL_THUMB, 0);
- SCROLL_MovingThumb = !SCROLL_MovingThumb;
+ pwndData->SCROLL_MovingThumb = !pwndData->SCROLL_MovingThumb;
}
SCROLLBARINFO sbi;
BOOL vertical;
enum SCROLL_HITTEST htHot = SCROLL_NOWHERE;
-
- if (SCROLL_TrackingWin)
- return;
+ PWND_DATA pwndData;
if (((nBar == SB_VERT) && !(pcontext->wi.dwStyle & WS_VSCROLL)) ||
((nBar == SB_HORZ) && !(pcontext->wi.dwStyle & WS_HSCROLL))) return;
+ if (!(pwndData = ThemeGetWndData(pcontext->hWnd)))
+ return;
+
+ if (pwndData->SCROLL_TrackingWin)
+ return;
+
/* Retrieve scrollbar info */
sbi.cbSize = sizeof(sbi);
si.cbSize = sizeof(si);
}
static void
-SCROLL_HandleScrollEvent( HWND hwnd, INT nBar, UINT msg, POINT pt)
+SCROLL_HandleScrollEvent(PWND_DATA pwndData, HWND hwnd, INT nBar, UINT msg, POINT pt)
{
/* Previous mouse position for timer events */
static POINT prevPt;
return;
}
- if ((SCROLL_trackHitTest == SCROLL_NOWHERE) && (msg != WM_LBUTTONDOWN))
+ if ((pwndData->SCROLL_trackHitTest == SCROLL_NOWHERE) && (msg != WM_LBUTTONDOWN))
return;
ThemeInitDrawContext(&context, hwnd, 0);
{
case WM_LBUTTONDOWN: /* Initialise mouse tracking */
HideCaret(hwnd); /* hide caret while holding down LBUTTON */
- SCROLL_trackVertical = vertical;
- SCROLL_trackHitTest = hittest = SCROLL_HitTest( hwnd, &sbi, vertical, pt, FALSE );
+ pwndData->SCROLL_trackVertical = vertical;
+ pwndData->SCROLL_trackHitTest = hittest = SCROLL_HitTest( hwnd, &sbi, vertical, pt, FALSE );
lastClickPos = vertical ? (pt.y - sbi.rcScrollBar.top) : (pt.x - sbi.rcScrollBar.left);
lastMousePos = lastClickPos;
trackThumbPos = sbi.xyThumbTop;
//TRACE("Event: hwnd=%p bar=%d msg=%s pt=%d,%d hit=%d\n",
// hwnd, nBar, SPY_GetMsgName(msg,hwnd), pt.x, pt.y, hittest );
- switch(SCROLL_trackHitTest)
+ switch(pwndData->SCROLL_trackHitTest)
{
case SCROLL_NOWHERE: /* No tracking in progress */
break;
case SCROLL_TOP_ARROW:
- if (hittest == SCROLL_trackHitTest)
+ if (hittest == pwndData->SCROLL_trackHitTest)
{
- SCROLL_DrawArrows( &context, &sbi, vertical, SCROLL_trackHitTest, 0 );
+ SCROLL_DrawArrows( &context, &sbi, vertical, pwndData->SCROLL_trackHitTest, 0 );
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
{
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
break;
case SCROLL_TOP_RECT:
- SCROLL_DrawInterior( &context, &sbi, sbi.xyThumbTop, vertical, SCROLL_trackHitTest, 0);
- if (hittest == SCROLL_trackHitTest)
+ SCROLL_DrawInterior( &context, &sbi, sbi.xyThumbTop, vertical, pwndData->SCROLL_trackHitTest, 0);
+ if (hittest == pwndData->SCROLL_trackHitTest)
{
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
{
case SCROLL_THUMB:
if (msg == WM_LBUTTONDOWN)
{
- SCROLL_TrackingWin = hwnd;
- SCROLL_TrackingBar = nBar;
- SCROLL_TrackingPos = trackThumbPos + lastMousePos - lastClickPos;
- SCROLL_TrackingVal = SCROLL_GetThumbVal( &si, &sbi.rcScrollBar,
- vertical, SCROLL_TrackingPos );
- if (!SCROLL_MovingThumb)
- SCROLL_DrawMovingThumb(&context, &sbi, vertical);
+ pwndData->SCROLL_TrackingWin = hwnd;
+ pwndData->SCROLL_TrackingBar = nBar;
+ pwndData->SCROLL_TrackingPos = trackThumbPos + lastMousePos - lastClickPos;
+ pwndData->SCROLL_TrackingVal = SCROLL_GetThumbVal( &si, &sbi.rcScrollBar,
+ vertical, pwndData->SCROLL_TrackingPos );
+ if (!pwndData->SCROLL_MovingThumb)
+ SCROLL_DrawMovingThumb(pwndData, &context, &sbi, vertical);
}
else if (msg == WM_LBUTTONUP)
{
- if (SCROLL_MovingThumb)
- SCROLL_DrawMovingThumb(&context, &sbi, vertical);
+ if (pwndData->SCROLL_MovingThumb)
+ SCROLL_DrawMovingThumb(pwndData, &context, &sbi, vertical);
- SCROLL_DrawInterior( &context, &sbi, sbi.xyThumbTop, vertical, 0, SCROLL_trackHitTest );
+ SCROLL_DrawInterior( &context, &sbi, sbi.xyThumbTop, vertical, 0, pwndData->SCROLL_trackHitTest );
}
else /* WM_MOUSEMOVE */
{
pt = SCROLL_ClipPos( &sbi.rcScrollBar, pt );
pos = vertical ? (pt.y - sbi.rcScrollBar.top) : (pt.x - sbi.rcScrollBar.left);
}
- if ( (pos != lastMousePos) || (!SCROLL_MovingThumb) )
+ if ( (pos != lastMousePos) || (!pwndData->SCROLL_MovingThumb) )
{
- if (SCROLL_MovingThumb)
- SCROLL_DrawMovingThumb( &context, &sbi, vertical);
+ if (pwndData->SCROLL_MovingThumb)
+ SCROLL_DrawMovingThumb(pwndData, &context, &sbi, vertical);
lastMousePos = pos;
- SCROLL_TrackingPos = trackThumbPos + pos - lastClickPos;
- SCROLL_TrackingVal = SCROLL_GetThumbVal( &si, &sbi.rcScrollBar,
+ pwndData->SCROLL_TrackingPos = trackThumbPos + pos - lastClickPos;
+ pwndData->SCROLL_TrackingVal = SCROLL_GetThumbVal( &si, &sbi.rcScrollBar,
vertical,
- SCROLL_TrackingPos );
+ pwndData->SCROLL_TrackingPos );
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
- MAKEWPARAM( SB_THUMBTRACK, SCROLL_TrackingVal),
+ MAKEWPARAM( SB_THUMBTRACK, pwndData->SCROLL_TrackingVal),
(LPARAM)hwndCtl );
- if (!SCROLL_MovingThumb)
- SCROLL_DrawMovingThumb( &context, &sbi, vertical);
+ if (!pwndData->SCROLL_MovingThumb)
+ SCROLL_DrawMovingThumb(pwndData, &context, &sbi, vertical);
}
}
break;
case SCROLL_BOTTOM_RECT:
- if (hittest == SCROLL_trackHitTest)
+ if (hittest == pwndData->SCROLL_trackHitTest)
{
- SCROLL_DrawInterior( &context, &sbi, sbi.xyThumbTop, vertical, SCROLL_trackHitTest, 0 );
+ SCROLL_DrawInterior( &context, &sbi, sbi.xyThumbTop, vertical, pwndData->SCROLL_trackHitTest, 0 );
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
{
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
break;
case SCROLL_BOTTOM_ARROW:
- if (hittest == SCROLL_trackHitTest)
+ if (hittest == pwndData->SCROLL_trackHitTest)
{
- SCROLL_DrawArrows( &context, &sbi, vertical, SCROLL_trackHitTest, 0 );
+ SCROLL_DrawArrows( &context, &sbi, vertical, pwndData->SCROLL_trackHitTest, 0 );
if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER))
{
SendMessageW( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
if (msg == WM_LBUTTONUP)
{
- hittest = SCROLL_trackHitTest;
- SCROLL_trackHitTest = SCROLL_NOWHERE; /* Terminate tracking */
+ hittest = pwndData->SCROLL_trackHitTest;
+ pwndData->SCROLL_trackHitTest = SCROLL_NOWHERE; /* Terminate tracking */
if (hittest == SCROLL_THUMB)
{
SB_ENDSCROLL, (LPARAM)hwndCtl );
/* Terminate tracking */
- SCROLL_TrackingWin = 0;
+ pwndData->SCROLL_TrackingWin = 0;
}
ThemeCleanupDrawContext(&context);
SCROLL_TrackScrollBar( HWND hwnd, INT scrollbar, POINT pt )
{
MSG msg;
+ PWND_DATA pwndData = ThemeGetWndData(hwnd);
+ if(!pwndData)
+ return;
ScreenToWindow(hwnd, &pt);
- SCROLL_HandleScrollEvent( hwnd, scrollbar, WM_LBUTTONDOWN, pt );
+ SCROLL_HandleScrollEvent(pwndData, hwnd, scrollbar, WM_LBUTTONDOWN, pt );
do
{
pt.y = GET_Y_LPARAM(msg.lParam);
ClientToScreen(hwnd, &pt);
ScreenToWindow(hwnd, &pt);
- SCROLL_HandleScrollEvent( hwnd, scrollbar, msg.message, pt );
+ SCROLL_HandleScrollEvent(pwndData, hwnd, scrollbar, msg.message, pt );
}
else
{