implemented a couple of scrollbar functions and fixed GetDoubleClickTime()

svn path=/trunk/; revision=6051
This commit is contained in:
Thomas Bluemel 2003-09-12 12:54:26 +00:00
parent fd08241470
commit a9160ac5fd
6 changed files with 288 additions and 160 deletions

View file

@ -156,7 +156,6 @@ NtUserCallNextHookEx(
DWORD Unknown2,
DWORD Unknown3);
#define NOPARAM_ROUTINE_GETDOUBLECLICKTIME 0x01
DWORD
STDCALL
NtUserCallNoParam(
@ -675,7 +674,7 @@ NtUserGetDC(HWND hWnd);
HDC STDCALL NtUserGetDCEx(HWND hWnd, HANDLE hRegion, ULONG Flags);
DWORD
UINT
STDCALL
NtUserGetDoubleClickTime(VOID);
@ -1453,7 +1452,7 @@ STDCALL
NtUserSetScrollInfo(
HWND hwnd,
int fnBar,
LPCSCROLLINFO lpsi,
LPSCROLLINFO lpsi,
WINBOOL fRedraw);
DWORD

View file

@ -1,10 +1,11 @@
/* $Id: scrollbar.c,v 1.14 2003/09/08 15:08:56 weiden Exp $
/* $Id: scrollbar.c,v 1.15 2003/09/12 12:54:26 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Windows
* FILE: subsys/win32k/ntuser/window.c
* PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* Thomas Weidenmueller (w3seek@users.sourceforge.net)
* REVISION HISTORY:
* 06-06-2001 CSH Created
*/
@ -41,7 +42,6 @@ static HBITMAP hRgArrowI;
#define RIGHT_ARROW(flags,pressed) \
(((flags)&ESB_DISABLE_RIGHT) ? hRgArrowI : ((pressed) ? hRgArrowD:hRgArrow))
#define SCROLL_ARROW_THUMB_OVERLAP 0 /* Overlap between arrows and thumb */
#define SCROLL_MIN_THUMB 6 /* Minimum size of the thumb in pixels */
#define SCROLL_FIRST_DELAY 200 /* Delay (in ms) before first repetition when holding the button down */
#define SCROLL_REPEAT_DELAY 50 /* Delay (in ms) between scroll repetitions */
@ -82,6 +82,7 @@ SCROLL_DrawInterior (HWND hwnd, HDC hdc, INT nBar, BOOL vertical, INT
arrowSize, PSCROLLBARINFO psbi)
{
INT thumbSize = psbi->xyThumbBottom - psbi->xyThumbTop;
RECT rc;
HPEN hSavePen;
HBRUSH hSaveBrush, hBrush;
BOOLEAN top_selected = FALSE, bottom_selected = FALSE;
@ -118,23 +119,27 @@ DbgPrint("[SCROLL_DrawInterior:%d]\n", nBar);
/* Calculate the scroll rectangle */
if (vertical)
{
psbi->rcScrollBar.top += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;
psbi->rcScrollBar.bottom -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
rc.top = psbi->rcScrollBar.top + arrowSize;
rc.bottom = psbi->rcScrollBar.bottom - arrowSize;
rc.left = psbi->rcScrollBar.left;
rc.right = psbi->rcScrollBar.right;
}
else
{
psbi->rcScrollBar.left += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;
psbi->rcScrollBar.right -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
rc.top = psbi->rcScrollBar.top;
rc.bottom = psbi->rcScrollBar.bottom;
rc.left = psbi->rcScrollBar.left + arrowSize;
rc.right = psbi->rcScrollBar.right - arrowSize;
}
/* Draw the scroll rectangles and thumb */
if (!psbi->dxyLineButton) /* No thumb to draw */
if (!psbi->xyThumbBottom) /* No thumb to draw */
{
PatBlt (hdc,
psbi->rcScrollBar.left,
psbi->rcScrollBar.top,
psbi->rcScrollBar.right - psbi->rcScrollBar.left,
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top,
rc.left,
rc.top,
rc.right - rc.left,
rc.bottom - rc.top,
PATCOPY);
/* cleanup and return */
@ -142,44 +147,46 @@ DbgPrint("[SCROLL_DrawInterior:%d]\n", nBar);
SelectObject (hdc, hSaveBrush);
return;
}
psbi->xyThumbTop -= arrowSize;
if (vertical)
{
PatBlt (hdc,
psbi->rcScrollBar.left,
psbi->rcScrollBar.top,
psbi->rcScrollBar.right - psbi->rcScrollBar.left,
psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),
rc.left,
rc.top,
rc.right - rc.left,
psbi->dxyLineButton,
top_selected ? 0x0f0000 : PATCOPY);
psbi->rcScrollBar.top += psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
rc.top += psbi->xyThumbTop;
PatBlt (hdc,
psbi->rcScrollBar.left,
psbi->rcScrollBar.top + thumbSize,
psbi->rcScrollBar.right - psbi->rcScrollBar.left,
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top - thumbSize,
rc.left,
rc.top + thumbSize,
rc.right - rc.left,
rc.bottom - rc.top - thumbSize,
bottom_selected ? 0x0f0000 : PATCOPY);
psbi->rcScrollBar.bottom = psbi->rcScrollBar.top + thumbSize;
rc.bottom = rc.top + thumbSize;
}
else
{
PatBlt (hdc,
psbi->rcScrollBar.left,
psbi->rcScrollBar.top,
psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top,
rc.left,
rc.top,
psbi->xyThumbTop,
rc.bottom - rc.top,
top_selected ? 0x0f0000 : PATCOPY);
psbi->rcScrollBar.left += psbi->dxyLineButton - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
rc.left += psbi->xyThumbTop;
PatBlt (hdc,
psbi->rcScrollBar.left + thumbSize,
psbi->rcScrollBar.top,
psbi->rcScrollBar.right - psbi->rcScrollBar.left - thumbSize,
psbi->rcScrollBar.bottom - psbi->rcScrollBar.top,
rc.left + thumbSize,
rc.top,
rc.right - rc.left - thumbSize,
rc.bottom - rc.top,
bottom_selected ? 0x0f0000 : PATCOPY);
psbi->rcScrollBar.right = psbi->rcScrollBar.left + thumbSize;
rc.right = rc.left + thumbSize;
}
/* Draw the thumb */
DrawEdge (hdc, &psbi->rcScrollBar, EDGE_RAISED, BF_RECT | BF_MIDDLE);
DrawEdge (hdc, &rc, EDGE_RAISED, BF_RECT | BF_MIDDLE);
/* cleanup */
SelectObject (hdc, hSavePen);
@ -198,10 +205,10 @@ SCROLL_DrawMovingThumb (HDC hdc, RECT * rect, BOOL vertical, int arrowSize, int
else
max_size = psbi->rcScrollBar.right - psbi->rcScrollBar.left;
max_size -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) + thumbSize;
max_size -= arrowSize + thumbSize;
if (pos < (arrowSize - SCROLL_ARROW_THUMB_OVERLAP))
pos = (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);
if (pos < arrowSize)
pos = arrowSize;
else if (pos > max_size)
pos = max_size;
@ -365,7 +372,7 @@ SCROLL_HitTest( HWND hwnd, INT nBar, POINT pt, BOOL bDragging )
sbi.cbSize = sizeof(SCROLLBARINFO);
NtUserGetScrollBarInfo(hwnd, vertical ? OBJID_VSCROLL : OBJID_HSCROLL, &sbi);
OffsetRect(&sbi.rcScrollBar, wndrect.left, wndrect.top);
if ( (bDragging && !SCROLL_PtInRectEx( &sbi.rcScrollBar, pt, vertical )) ||
@ -437,35 +444,80 @@ GetScrollBarInfo(HWND hwnd, LONG idObject, PSCROLLBARINFO psbi)
/*
* @unimplemented
* @implemented
*/
WINBOOL STDCALL
GetScrollInfo (HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
{
UNIMPLEMENTED;
return FALSE;
WINBOOL res;
SCROLLINFO si;
if(!lpsi ||
((lpsi->cbSize != sizeof(SCROLLINFO)) && (lpsi->cbSize != sizeof(SCROLLINFO))))
{
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
RtlZeroMemory(&si, sizeof(SCROLLINFO));
si.cbSize = lpsi->cbSize;
si.fMask = lpsi->fMask;
res = (WINBOOL)NtUserGetScrollInfo(hwnd, fnBar, &si);
if(res)
{
RtlCopyMemory(lpsi, &si, lpsi->cbSize);
}
return res;
}
/*
* @unimplemented
* @implemented
*/
int STDCALL
GetScrollPos (HWND hWnd, int nBar)
{
UNIMPLEMENTED;
return 0;
SCROLLINFO si;
BOOL ret;
int res = 0;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_POS;
ret = NtUserGetScrollInfo(hWnd, nBar, &si);
if(ret)
res = si.nPos;
return res;
}
/*
* @unimplemented
* @implemented
*/
WINBOOL STDCALL
GetScrollRange (HWND hWnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos)
{
UNIMPLEMENTED;
return FALSE;
WINBOOL ret;
SCROLLINFO si;
if(!lpMinPos || !lpMaxPos)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE;
ret = NtUserGetScrollInfo(hWnd, nBar, &si);
if(ret)
{
*lpMinPos = si.nMin;
*lpMaxPos = si.nMax;
}
return ret;
}
@ -488,25 +540,55 @@ SetScrollInfo (HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, WINBOOL fRedraw)
/*
* @unimplemented
* @implemented
*/
int STDCALL
SetScrollPos (HWND hWnd, int nBar, int nPos, WINBOOL bRedraw)
{
UNIMPLEMENTED;
return 0;
int Res = 0;
BOOL ret;
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_POS;
/* call NtUserGetScrollInfo() because we need to return the previous position */
ret = NtUserGetScrollInfo(hWnd, nBar, &si);
if(ret)
{
Res = si.nPos;
if(Res != nPos)
{
si.nPos = nPos;
/* finally set the new position */
NtUserSetScrollInfo(hWnd, nBar, &si, bRedraw);
}
}
return Res;
}
/*
* @unimplemented
* @implemented
*/
WINBOOL STDCALL
SetScrollRange (HWND hWnd,
int nBar, int nMinPos, int nMaxPos, WINBOOL bRedraw)
{
UNIMPLEMENTED;
return FALSE;
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE;
si.nMin = nMinPos;
si.nMax = nMaxPos;
NtUserSetScrollInfo(hWnd, nBar, &si, bRedraw);
/* FIXME - check if called successfully */
return TRUE;
}

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: input.c,v 1.17 2003/08/28 18:04:59 weiden Exp $
/* $Id: input.c,v 1.18 2003/09/12 12:54:26 weiden Exp $
*
* PROJECT: ReactOS user32.dll
* FILE: lib/user32/windows/input.c
@ -107,7 +107,7 @@ UINT
STDCALL
GetDoubleClickTime(VOID)
{
return (UINT)NtUserCallNoParam(NOPARAM_ROUTINE_GETDOUBLECLICKTIME);
return NtUserGetDoubleClickTime();
}

View file

@ -1,4 +1,4 @@
/* $Id: misc.c,v 1.15 2003/08/29 09:29:11 gvg Exp $
/* $Id: misc.c,v 1.16 2003/09/12 12:54:26 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -24,32 +24,20 @@
/*
* @implemented
* @unimplemented
*/
DWORD
STDCALL
NtUserCallNoParam(
DWORD Routine)
{
NTSTATUS Status;
DWORD Result = 0;
PWINSTATION_OBJECT WinStaObject;
/*
switch(Routine)
{
case NOPARAM_ROUTINE_GETDOUBLECLICKTIME:
Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
KernelMode,
0,
&WinStaObject);
if (!NT_SUCCESS(Status))
return (DWORD)FALSE;
Result = WinStaObject->SystemCursor.DblClickSpeed;
ObDereferenceObject(WinStaObject);
return Result;
case 0:
break;
}
*/
DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam()\n", Routine);
SetLastWin32Error(ERROR_INVALID_PARAMETER);
return 0;
@ -328,3 +316,25 @@ NtUserSystemParametersInfo(
}
return FALSE;
}
UINT
STDCALL
NtUserGetDoubleClickTime(VOID)
{
UINT Result;
NTSTATUS Status;
PWINSTATION_OBJECT WinStaObject;
Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
KernelMode,
0,
&WinStaObject);
if (!NT_SUCCESS(Status))
return (DWORD)FALSE;
Result = WinStaObject->SystemCursor.DblClickSpeed;
ObDereferenceObject(WinStaObject);
return Result;
}

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: scrollbar.c,v 1.13 2003/09/08 18:50:00 weiden Exp $
/* $Id: scrollbar.c,v 1.14 2003/09/12 12:54:26 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -120,17 +120,15 @@ IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect)
switch (nBar)
{
case SB_HORZ:
lprect->left = ClientRect.left - WindowRect.left;
lprect->left = ClientRect.left - WindowRect.left + 1;
lprect->top = ClientRect.bottom - WindowRect.top;
lprect->right = ClientRect.right - WindowRect.left;
lprect->right = ClientRect.right - WindowRect.left - 1;
lprect->bottom = lprect->top + NtUserGetSystemMetrics (SM_CYHSCROLL);
if (Window->Style & WS_BORDER)
{
lprect->left--;
lprect->right++;
}
else if (Window->Style & WS_VSCROLL)
lprect->right++;
vertical = FALSE;
break;
@ -166,76 +164,63 @@ IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, PRECT lprect)
BOOL FASTCALL
IntCalculateThumb(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi, LPSCROLLINFO psi)
{
INT xThumb, yThumb, ThumbBox, cxy;
INT Thumb, ThumbBox, ThumbPos, cxy, mx;
switch(idObject)
{
case SB_HORZ:
xThumb = NtUserGetSystemMetrics(SM_CXHSCROLL);
Thumb = NtUserGetSystemMetrics(SM_CXHSCROLL);
cxy = psbi->rcScrollBar.right - psbi->rcScrollBar.left;
if(cxy < (2 * xThumb))
{
xThumb = cxy / 2;
psbi->xyThumbTop = 0;
psbi->xyThumbBottom = 0;
}
else
{
ThumbBox = psi->nPage ? MINTRACKTHUMB : NtUserGetSystemMetrics(SM_CXHTHUMB);
cxy -= (2 * xThumb);
if(cxy >= ThumbBox)
{
if(psi->nPage)
{
ThumbBox = max(IntMulDiv(cxy, psi->nPage, psi->nMax - psi->nMin + 1), ThumbBox);
}
psbi->xyThumbTop = xThumb;
psbi->xyThumbBottom = xThumb + ThumbBox;
}
else
{
psbi->xyThumbTop = 0;
psbi->xyThumbBottom = 0;
}
}
psbi->dxyLineButton = xThumb;
return TRUE;
break;
case SB_VERT:
yThumb = NtUserGetSystemMetrics(SM_CYVSCROLL);
Thumb = NtUserGetSystemMetrics(SM_CYVSCROLL);
cxy = psbi->rcScrollBar.bottom - psbi->rcScrollBar.top;
if(cxy < (2 * yThumb))
{
yThumb = cxy / 2;
psbi->xyThumbTop = 0;
psbi->xyThumbBottom = 0;
}
else
{
ThumbBox = psi->nPage ? MINTRACKTHUMB : NtUserGetSystemMetrics(SM_CYVTHUMB);
cxy -= (2 * yThumb);
if(cxy >= ThumbBox)
{
if(psi->nPage)
{
ThumbBox = max(IntMulDiv(cxy, psi->nPage, psi->nMax - psi->nMin + 1), ThumbBox);
}
psbi->xyThumbTop = yThumb;
psbi->xyThumbBottom = yThumb + ThumbBox;
}
else
{
psbi->xyThumbTop = 0;
psbi->xyThumbBottom = 0;
}
}
psbi->dxyLineButton = yThumb;
return TRUE;
break;
case SB_CTL:
/* FIXME */
return FALSE;
default:
return FALSE;
}
return FALSE;
ThumbPos = Thumb;
/* calculate Thumb */
if(cxy <= (2 * Thumb))
{
Thumb = cxy / 2;
psbi->xyThumbTop = 0;
psbi->xyThumbBottom = 0;
ThumbPos = Thumb;
}
else
{
ThumbBox = psi->nPage ? MINTRACKTHUMB : NtUserGetSystemMetrics(SM_CXHTHUMB);
cxy -= (2 * Thumb);
if(cxy >= ThumbBox)
{
if(psi->nPage)
{
ThumbBox = max(IntMulDiv(cxy, psi->nPage, psi->nMax - psi->nMin + 1), ThumbBox);
}
if(cxy > ThumbBox)
{
mx = psi->nMax - max(psi->nPage - 1, 0);
if(psi->nMin < mx)
ThumbPos = Thumb + IntMulDiv(cxy, psi->nPos - psi->nMin, psi->nMax - psi->nMin + 1);
}
psbi->xyThumbTop = ThumbPos;
psbi->xyThumbBottom = ThumbPos + ThumbBox;
}
else
{
psbi->xyThumbTop = 0;
psbi->xyThumbBottom = 0;
}
}
psbi->dxyLineButton = Thumb;
return TRUE;
}
DWORD FASTCALL
@ -443,8 +428,17 @@ STDCALL
NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
{
PWINDOW_OBJECT Window;
LPSCROLLINFO psi;
UINT Mask;
PSCROLLBARINFO Info = NULL;
if(!lpsi || ((lpsi->cbSize != sizeof(SCROLLINFO)) &&
(lpsi->cbSize != sizeof(SCROLLINFO) - sizeof(lpsi->nTrackPos))))
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
return 0;
}
Window = IntGetWindowObject(hwnd);
if(!Window)
@ -457,20 +451,49 @@ NtUserGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi)
{
case SB_HORZ:
Info = Window->pHScroll;
break;
if(Info)
break;
/* fall through */
case SB_VERT:
Info = Window->pVScroll;
break;
if(Info)
break;
/* fall through */
case SB_CTL:
Info = Window->wExtra;
break;
if(Info)
break;
/* fall through */
default:
IntReleaseWindowObject(Window);
return FALSE;
}
psi = (LPSCROLLINFO)((PSCROLLBARINFO)(Info + 1));
if(lpsi->fMask == SIF_ALL)
Mask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
else
Mask = lpsi->fMask;
if(Mask & SIF_PAGE)
{
lpsi->nPage = psi->nPage;
}
if(Mask & SIF_POS)
{
lpsi->nPos = psi->nPos;
}
if(Mask & SIF_RANGE)
{
lpsi->nMin = psi->nMin;
lpsi->nMax = psi->nMax;
}
IntReleaseWindowObject(Window);
return FALSE;
return TRUE;
}
@ -547,7 +570,7 @@ STDCALL
NtUserSetScrollInfo(
HWND hwnd,
int fnBar,
LPCSCROLLINFO lpsi,
LPSCROLLINFO lpsi,
WINBOOL fRedraw)
{
PWINDOW_OBJECT Window;
@ -605,24 +628,47 @@ NtUserSetScrollInfo(
{
/* FIXME */
}
if((Mask & SIF_RANGE) && ((psi->nMin != lpsi->nMin) || (psi->nMax != lpsi->nMax)))
{
/* Invalid range -> range is set to (0,0) */
if((lpsi->nMin > lpsi->nMax) ||
((UINT)(lpsi->nMax - lpsi->nMin) >= 0x80000000))
{
psi->nMin = 0;
psi->nMax = 0;
Chg = TRUE;
}
else
{
if(psi->nMin != lpsi->nMin ||
psi->nMax != lpsi->nMax )
{
//*action |= SA_SSI_REFRESH;
psi->nMin = lpsi->nMin;
psi->nMax = lpsi->nMax;
Chg = TRUE;
}
}
}
if((Mask & SIF_PAGE) && (psi->nPage != lpsi->nPage))
{
psi->nPage = lpsi->nPage;
Chg = TRUE;
if(psi->nPage < 0) psi->nPage = 0;
else if(psi->nPage > psi->nMax - psi->nMin + 1)
psi->nPage = psi->nMax - psi->nMin + 1;
}
if((Mask & SIF_POS) && (psi->nPos != lpsi->nPos))
{
psi->nPos = lpsi->nPos;
Chg = TRUE;
}
if((Mask & SIF_RANGE) && ((psi->nMin != lpsi->nMin) || (psi->nMax != lpsi->nMax)))
{
psi->nMin = lpsi->nMin;
psi->nMax = lpsi->nMax;
Chg = TRUE;
if(psi->nPos < psi->nMin)
psi->nPos = psi->nMin;
else if(psi->nPos > psi->nMax - max(psi->nPage - 1, 0))
psi->nPos = psi->nMax - max(psi->nPage - 1, 0);
}
/* FIXME check assigned values */

View file

@ -1,4 +1,4 @@
/* $Id: stubs.c,v 1.27 2003/08/28 18:04:59 weiden Exp $
/* $Id: stubs.c,v 1.28 2003/09/12 12:54:26 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -587,15 +587,6 @@ NtUserGetCPD(
return 0;
}
DWORD
STDCALL
NtUserGetDoubleClickTime(VOID)
{
UNIMPLEMENTED
return 0;
}
DWORD
STDCALL
NtUserGetGuiResources(