Scroll cleanup part 2
Andrew M. Johnston
johnstonam at logica.com
Tue Oct 8 05:03:34 CDT 2002
Changelog:
scrollbar.c - add a separate handler routine for each message type
The patch was developed without CVS access use patch -p1 from within
the top level wine directory to apply
License: X11
Andrew
--- wine-20020904/controls/scroll.c Tue Oct 8 17:06:43 2002
+++ wine/controls/scroll.c Tue Oct 8 17:52:48 2002
@@ -475,6 +475,7 @@
TOP_ARROW(infoPtr->flags, top_pressed)
: LEFT_ARROW(infoPtr->flags, top_pressed));
+ if (!hUpArrow) SCROLL_LoadBitmaps();
SetStretchBltMode( hdc, STRETCH_DELETESCANS );
StretchBlt( hdc, rect->left, rect->top,
vertical ? rect->right-rect->left : arrowSize,
@@ -904,24 +905,30 @@
* SCROLL_HandleKbdEvent
*
* Handle a keyboard event (only for SB_CTL scrollbars).
+ * if key event is received, the scrollbar has the focus
*/
-static void SCROLL_HandleKbdEvent( HWND hwnd, WPARAM wParam )
-{
- WPARAM msg;
-
- switch(wParam)
- {
- case VK_PRIOR: msg = SB_PAGEUP; break;
- case VK_NEXT: msg = SB_PAGEDOWN; break;
- case VK_HOME: msg = SB_TOP; break;
- case VK_END: msg = SB_BOTTOM; break;
- case VK_UP: msg = SB_LINEUP; break;
- case VK_DOWN: msg = SB_LINEDOWN; break;
- default: return;
- }
- SendMessageW( GetParent(hwnd),
- (GetWindowLongA( hwnd, GWL_STYLE ) & SBS_VERT) ? WM_VSCROLL : WM_HSCROLL,
- msg, (LPARAM)hwnd );
+static void SCROLL_HandleKbdEvent(
+HWND hwnd /* [in] Handle of window with scrollbar(s) */,
+WPARAM wParam /* [in] Variable input including enable state */,
+LPARAM lParam /* [in] Variable input including input point */)
+{
+ TRACE("hwnd=%04x wParam=%d lParam=%ld\n", hwnd, wParam, lParam);
+
+ /* hide caret on first KEYDOWN to prevent flicker */
+ if ((lParam & PFD_DOUBLEBUFFER_DONTCARE) == 0) HideCaret(hwnd);
+ switch(wParam)
+ {
+ case VK_PRIOR: wParam = SB_PAGEUP; break;
+ case VK_NEXT: wParam = SB_PAGEDOWN; break;
+ case VK_HOME: wParam = SB_TOP; break;
+ case VK_END: wParam = SB_BOTTOM; break;
+ case VK_UP: wParam = SB_LINEUP; break;
+ case VK_DOWN: wParam = SB_LINEDOWN; break;
+ default: return;
+ }
+ SendMessageW(GetParent(hwnd),
+ ((GetWindowLongA( hwnd, GWL_STYLE ) & SBS_VERT) ?
+ WM_VSCROLL : WM_HSCROLL), wParam, (LPARAM)hwnd);
}
@@ -1209,223 +1216,250 @@
}
-/***********************************************************************
- * ScrollBarWndProc
+/*************************************************************************
+ * SCROLL_SetFocus
+ *
+ * Add focus caret to a CTL scroll bar
*/
-static LRESULT WINAPI ScrollBarWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
+static void WINAPI SCROLL_SetFocus(
+HWND hwnd /* [in] Handle of window with scrollbar(s) */)
{
- if (!IsWindow( hwnd )) return 0;
-
- switch(message)
- {
- case WM_CREATE:
- {
- SCROLLBAR_INFO *infoPtr;
- CREATESTRUCTW *lpCreat = (CREATESTRUCTW *)lParam;
-
- if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, SB_CTL ))) return -1;
- if (lpCreat->style & WS_DISABLED)
- {
- TRACE("Created WS_DISABLED scrollbar\n");
- infoPtr->flags = ESB_DISABLE_BOTH;
- }
-
- if (lpCreat->style & SBS_SIZEBOX)
- {
- FIXME("Unimplemented style SBS_SIZEBOX.\n" );
- return 0;
- }
- if (lpCreat->style & SBS_VERT)
- {
- if (lpCreat->style & SBS_LEFTALIGN)
- MoveWindow( hwnd, lpCreat->x, lpCreat->y,
- GetSystemMetrics(SM_CXVSCROLL)+1, lpCreat->cy, FALSE );
- else if (lpCreat->style & SBS_RIGHTALIGN)
- MoveWindow( hwnd,
- lpCreat->x+lpCreat->cx-GetSystemMetrics(SM_CXVSCROLL)-1,
- lpCreat->y,
- GetSystemMetrics(SM_CXVSCROLL)+1, lpCreat->cy, FALSE );
- }
- else /* SBS_HORZ */
- {
- if (lpCreat->style & SBS_TOPALIGN)
- MoveWindow( hwnd, lpCreat->x, lpCreat->y,
- lpCreat->cx, GetSystemMetrics(SM_CYHSCROLL)+1, FALSE );
- else if (lpCreat->style & SBS_BOTTOMALIGN)
- MoveWindow( hwnd,
- lpCreat->x,
- lpCreat->y+lpCreat->cy-GetSystemMetrics(SM_CYHSCROLL)-1,
- lpCreat->cx, GetSystemMetrics(SM_CYHSCROLL)+1, FALSE );
- }
- }
- if (!hUpArrow) SCROLL_LoadBitmaps();
- TRACE("ScrollBar creation, hwnd=%04x\n", hwnd );
- return 0;
-
- case WM_ENABLE:
- {
- SCROLLBAR_INFO *infoPtr;
- if ((infoPtr = SCROLL_GetScrollInfo( hwnd, SB_CTL )))
- {
- infoPtr->flags = wParam ? ESB_ENABLE_BOTH : ESB_DISABLE_BOTH;
- SCROLL_RefreshScrollBar(hwnd, SB_CTL, TRUE, TRUE);
- }
+ /* Create a caret when a ScrollBar get focus */
+ RECT rect;
+ int arrowSize, thumbSize, thumbPos, vertical;
+ vertical = SCROLL_GetScrollBarRect( hwnd, SB_CTL, &rect,
+ &arrowSize, &thumbSize, &thumbPos );
+ if (!vertical)
+ {
+ CreateCaret(hwnd,1, thumbSize-2, rect.bottom-rect.top-2);
+ SetCaretPos(thumbPos+1, rect.top+1);
}
- return 0;
-
- case WM_LBUTTONDOWN:
- {
- POINT pt;
- pt.x = SLOWORD(lParam);
- pt.y = SHIWORD(lParam);
- SCROLL_TrackScrollBar( hwnd, SB_CTL, pt );
+ else
+ {
+ CreateCaret(hwnd,1, rect.right-rect.left-2,thumbSize-2);
+ SetCaretPos(rect.top+1, thumbPos+1);
}
- break;
- case WM_LBUTTONUP:
- case WM_MOUSEMOVE:
- case WM_SYSTIMER:
- {
- POINT pt;
- pt.x = SLOWORD(lParam);
- pt.y = SHIWORD(lParam);
- SCROLL_HandleScrollEvent( hwnd, SB_CTL, message, pt );
- }
- break;
-
- /* if key event is received, the scrollbar has the focus */
- case WM_KEYDOWN:
- /* hide caret on first KEYDOWN to prevent flicker */
- if ((lParam & 0x40000000)==0)
- HideCaret(hwnd);
- SCROLL_HandleKbdEvent( hwnd, wParam );
- break;
+ ShowCaret(hwnd);
+}
- case WM_KEYUP:
- ShowCaret(hwnd);
- break;
- case WM_SETFOCUS:
- {
- /* Create a caret when a ScrollBar get focus */
- RECT rect;
- int arrowSize, thumbSize, thumbPos, vertical;
- vertical = SCROLL_GetScrollBarRect( hwnd, SB_CTL, &rect,
- &arrowSize, &thumbSize, &thumbPos );
- if (!vertical)
- {
- CreateCaret(hwnd,1, thumbSize-2, rect.bottom-rect.top-2);
- SetCaretPos(thumbPos+1, rect.top+1);
- }
- else
- {
- CreateCaret(hwnd,1, rect.right-rect.left-2,thumbSize-2);
- SetCaretPos(rect.top+1, thumbPos+1);
- }
- ShowCaret(hwnd);
- }
- break;
+/*************************************************************************
+ * SCROLL_KillFocus
+ *
+ * Remove focus caret to a CTL scroll bar
+ */
+static void SCROLL_KillFocus(
+HWND hwnd /* [in] Handle of window with scrollbar(s) */)
+{
+ RECT rect;
+ int arrowSize, thumbSize, thumbPos, vertical;
+ vertical = SCROLL_GetScrollBarRect( hwnd, SB_CTL, &rect,&arrowSize, &thumbSize, &thumbPos );
+ if (!vertical)
+ {
+ rect.left=thumbPos+1;
+ rect.right=rect.left+thumbSize;
+ }
+ else
+ {
+ rect.top=thumbPos+1;
+ rect.bottom=rect.top+thumbSize;
+ }
+ HideCaret(hwnd);
+ InvalidateRect(hwnd,&rect,0);
+ DestroyCaret();
+}
- case WM_KILLFOCUS:
- {
- RECT rect;
- int arrowSize, thumbSize, thumbPos, vertical;
- vertical = SCROLL_GetScrollBarRect( hwnd, SB_CTL, &rect,&arrowSize, &thumbSize, &thumbPos );
- if (!vertical){
- rect.left=thumbPos+1;
- rect.right=rect.left+thumbSize;
- }
- else
- {
- rect.top=thumbPos+1;
- rect.bottom=rect.top+thumbSize;
- }
- HideCaret(hwnd);
- InvalidateRect(hwnd,&rect,0);
- DestroyCaret();
- }
- break;
- case WM_ERASEBKGND:
- return 1;
+/***********************************************************************
+ * SCROLL_CreateScrollBar
+ *
+ * Create a scroll bar
+ */
+static void SCROLL_CreateScrollBar(
+HWND hwnd /* [in] Handle of window with scrollbar(s) */,
+LPCREATESTRUCTW lpCreate /* [in] The style and place of the scroll bar */)
+{
+ POINT pos, size;
+ LPSCROLLBAR_INFO info = SCROLL_GetScrollInfo(hwnd, SB_CTL);
+ if (!info) return;
+
+ TRACE("hwnd=%04x lpCreate=%p\n", hwnd, lpCreate);
+
+ if (lpCreate->style & WS_DISABLED)
+ {
+ info->flags = ESB_DISABLE_BOTH;
+ TRACE("Created WS_DISABLED scrollbar\n");
+ }
+ if (lpCreate->style & SBS_SIZEBOX)
+ {
+ FIXME("Unimplemented style SBS_SIZEBOX.\n" );
+ return;
+ }
- case WM_GETDLGCODE:
- return DLGC_WANTARROWS; /* Windows returns this value */
+ /* copy the desired positions and size */
+ pos.x = lpCreate->x; pos.y = lpCreate->y;
+ size.x = lpCreate->cx; size.y = lpCreate->cy;
+
+ /* move position based on style */
+ if (lpCreate->style & SBS_RIGHTALIGN)
+ pos.x += size.x - GetSystemMetrics(SM_CXVSCROLL) - 1;
+ else if (lpCreate->style & SBS_BOTTOMALIGN)
+ pos.y += size.y - GetSystemMetrics(SM_CYHSCROLL) - 1;
+
+ /* change size based on style */
+ if (lpCreate->style & SBS_VERT)
+ size.x = GetSystemMetrics(SM_CXVSCROLL) + 1;
+ else
+ size.y = GetSystemMetrics(SM_CYHSCROLL) + 1;
+
+ MoveWindow(hwnd, pos.x, pos.y, size.x, size.y, FALSE);
+}
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- HDC hdc = BeginPaint( hwnd, &ps );
- SCROLL_DrawScrollBar( hwnd, hdc, SB_CTL, TRUE, TRUE );
- EndPaint( hwnd, &ps );
- }
- break;
- case SBM_SETPOS16:
- case SBM_SETPOS:
- return SetScrollPos( hwnd, SB_CTL, wParam, (BOOL)lParam );
-
- case SBM_GETPOS16:
- case SBM_GETPOS:
- return GetScrollPos( hwnd, SB_CTL );
-
- case SBM_SETRANGE16:
- SetScrollRange( hwnd, SB_CTL, LOWORD(lParam), HIWORD(lParam),
- wParam /* FIXME: Is this correct? */ );
- return 0;
-
- case SBM_SETRANGE:
- {
- INT oldPos = GetScrollPos( hwnd, SB_CTL );
- SetScrollRange( hwnd, SB_CTL, wParam, lParam, FALSE );
- if (oldPos != GetScrollPos( hwnd, SB_CTL )) return oldPos;
- }
- return 0;
-
- case SBM_GETRANGE16:
- FIXME("don't know how to handle SBM_GETRANGE16 (wp=%04x,lp=%08lx)\n", wParam, lParam );
- return 0;
-
- case SBM_GETRANGE:
- GetScrollRange( hwnd, SB_CTL, (LPINT)wParam, (LPINT)lParam );
- return 0;
-
- case SBM_ENABLE_ARROWS16:
- case SBM_ENABLE_ARROWS:
- return EnableScrollBar( hwnd, SB_CTL, wParam );
-
- case SBM_SETRANGEREDRAW:
- {
- INT oldPos = GetScrollPos( hwnd, SB_CTL );
- SetScrollRange( hwnd, SB_CTL, wParam, lParam, TRUE );
- if (oldPos != GetScrollPos( hwnd, SB_CTL )) return oldPos;
- }
- return 0;
-
- case SBM_SETSCROLLINFO:
- return SetScrollInfo( hwnd, SB_CTL, (SCROLLINFO *)lParam, wParam );
-
- case SBM_GETSCROLLINFO:
- return GetScrollInfo( hwnd, SB_CTL, (SCROLLINFO *)lParam );
-
- case 0x00e5:
- case 0x00e7:
- case 0x00e8:
- case 0x00eb:
- case 0x00ec:
- case 0x00ed:
- case 0x00ee:
- case 0x00ef:
- ERR("unknown Win32 msg %04x wp=%08x lp=%08lx\n",
- message, wParam, lParam );
- break;
+/*************************************************************************
+ * SCROLL_SetScrollRange (USER32.@)
+ *
+ * Set scroll range returning old value of position if it has changed
+ *
+ * RETURNS
+ *
+ * The old position if the position has changed
+ */
+static LRESULT SCROLL_SetScrollRange(
+HWND hwnd /* [in] Handle of window with scrollbar(s) */,
+INT minVal /* [in] New minimum value */,
+INT maxVal /* [in] New maximum value */,
+BOOL bRedraw /* [in] Should scrollbar be redrawn afterwards ? */)
+{
+ INT oldPos = GetScrollPos(hwnd, SB_CTL);
+
+ SetScrollRange(hwnd, SB_CTL, minVal, maxVal, bRedraw);
+ if (oldPos != GetScrollPos(hwnd, SB_CTL))
+ return oldPos;
+ else
+ return 0;
+}
- default:
- if (message >= WM_USER)
- WARN("unknown msg %04x wp=%04x lp=%08lx\n",
- message, wParam, lParam );
- return DefWindowProcW( hwnd, message, wParam, lParam );
- }
- return 0;
+/***********************************************************************
+ * ScrollBarWndProc
+ *
+ * The routine for handling window events
+ *
+ * RETURNS
+ * Zero
+*/
+static LRESULT WINAPI ScrollBarWndProc(
+HWND hwnd /* [in] Handle of window whose scrollbar(s) will be affected */,
+UINT message /* [in] The windows message to be actioned */,
+WPARAM wParam /* [in] Variable input including enable state */,
+LPARAM lParam /* [in] Variable input including input point */)
+{
+ TRACE("hwnd=%04x message=%s wParam=%d lParam=%ld\n",
+ hwnd, SPY_GetMsgName(message, hwnd), wParam, lParam);
+
+ /* handle the windows message */
+ if (IsWindow(hwnd)) switch (message)
+ {
+ case WM_CREATE:
+ SCROLL_CreateScrollBar(hwnd, (LPCREATESTRUCTW)lParam); break;
+
+ case WM_ENABLE:
+ return EnableScrollBar(hwnd, SB_CTL,
+ wParam ? ESB_ENABLE_BOTH : ESB_DISABLE_BOTH);
+
+ case WM_LBUTTONDOWN:
+ {
+ POINT pt; pt.x = SLOWORD(lParam); pt.y = SHIWORD(lParam);
+ SCROLL_TrackScrollBar( hwnd, SB_CTL, pt );
+ }
+ break;
+
+ case WM_LBUTTONUP:
+ case WM_MOUSEMOVE:
+ case WM_SYSTIMER:
+ {
+ POINT pt; pt.x = SLOWORD(lParam); pt.y = SHIWORD(lParam);
+ SCROLL_HandleScrollEvent( hwnd, SB_CTL, message, pt );
+ }
+ break;
+
+ case WM_KEYDOWN:
+ SCROLL_HandleKbdEvent(hwnd, wParam, lParam); break;
+
+ case WM_KEYUP:
+ ShowCaret(hwnd); break;
+
+ case WM_SETFOCUS:
+ SCROLL_SetFocus(hwnd); break;
+
+ case WM_KILLFOCUS:
+ SCROLL_KillFocus(hwnd); break;
+
+ case WM_ERASEBKGND:
+ return 1;
+
+ case WM_GETDLGCODE:
+ return DLGC_WANTARROWS; /* Windows returns this value */
+
+ case WM_PAINT:
+ /* FIXME: needs to handle all types of bars */
+ SCROLL_RefreshScrollBar(hwnd, SB_CTL, TRUE, TRUE); break;
+
+ case SBM_SETPOS16:
+ case SBM_SETPOS:
+ return SetScrollPos(hwnd, SB_CTL, wParam, (BOOL)lParam);
+
+ case SBM_GETPOS16:
+ case SBM_GETPOS:
+ return GetScrollPos(hwnd, SB_CTL);
+
+ case SBM_SETRANGE16:
+ return SetScrollRange(hwnd, SB_CTL, LOWORD(lParam), HIWORD(lParam), wParam);
+
+ case SBM_SETRANGE:
+ return SCROLL_SetScrollRange(hwnd, wParam, lParam, FALSE);
+
+ case SBM_GETRANGE16:
+ FIXME("don't know how to handle SBM_GETRANGE16 (wp=%04x, lp=%08lx)\n",
+ wParam, lParam);
+ break;
+
+ case SBM_GETRANGE:
+ GetScrollRange(hwnd, SB_CTL, (LPINT)wParam, (LPINT)lParam);
+ break;
+
+ case SBM_ENABLE_ARROWS16:
+ case SBM_ENABLE_ARROWS:
+ return EnableScrollBar(hwnd, SB_CTL, wParam);
+
+ case SBM_SETRANGEREDRAW:
+ return SCROLL_SetScrollRange(hwnd, wParam, lParam, TRUE);
+
+ case SBM_SETSCROLLINFO:
+ return SetScrollInfo(hwnd, SB_CTL, (SCROLLINFO *)lParam, wParam);
+
+ case SBM_GETSCROLLINFO:
+ return GetScrollInfo(hwnd, SB_CTL, (SCROLLINFO *)lParam);
+
+ case 0x00e5:
+ case 0x00e7:
+ case 0x00e8:
+ case 0x00eb:
+ case 0x00ec:
+ case 0x00ed:
+ case 0x00ee:
+ case 0x00ef:
+ ERR("unknown Win32 msg %04x wp=%08x lp=%08lx\n",
+ message, wParam, lParam);
+ return 0;
+
+ default:
+ if (message >= WM_USER)
+ WARN("unknown msg %04x wp=%04x lp=%08lx\n",
+ message, wParam, lParam);
+ return DefWindowProcW(hwnd, message, wParam, lParam);
+ }
+ return 0;
}
More information about the wine-patches
mailing list