diff --git a/dlls/user32/tests/scroll.c b/dlls/user32/tests/scroll.c index 20bb0dc111b..95782a47a6e 100644 --- a/dlls/user32/tests/scroll.c +++ b/dlls/user32/tests/scroll.c @@ -671,6 +671,19 @@ static void test_SetScrollInfo(void) ret = IsWindowEnabled(hScroll); ok(ret, "Unexpected enabled state.\n"); + EnableScrollBar(mainwnd, SB_CTL, ESB_ENABLE_BOTH); + + si.fMask = SIF_POS; + si.nPos = 3; + ret = SetScrollInfo(mainwnd, SB_HORZ, &si, FALSE); + ok(ret == 3, "SetScrollInfo returned %d\n", ret); + + /* undocumented flag making SetScrollInfo return previous position */ + si.fMask = SIF_POS | 0x1000; + si.nPos = 4; + ret = SetScrollInfo(mainwnd, SB_HORZ, &si, FALSE); + ok(ret == 3, "SetScrollInfo returned %d\n", ret); + DestroyWindow(hScroll); DestroyWindow(mainwnd); } diff --git a/dlls/win32u/scroll.c b/dlls/win32u/scroll.c index a51c7d3cf93..d48755cec7c 100644 --- a/dlls/win32u/scroll.c +++ b/dlls/win32u/scroll.c @@ -824,7 +824,7 @@ void track_scroll_bar( HWND hwnd, int scrollbar, POINT pt ) */ static inline BOOL validate_scroll_info( const SCROLLINFO *info ) { - return !(info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL) || + return !(info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL | SIF_RETURNPREV) || (info->cbSize != sizeof(*info) && info->cbSize != sizeof(*info) - sizeof(info->nTrackPos))); } @@ -862,7 +862,7 @@ static int set_scroll_info( HWND hwnd, int bar, const SCROLLINFO *info, BOOL red { struct scroll_info *scroll; UINT new_flags; - int action = 0, ret; + int action = 0, ret = 0; /* handle invalid data structure */ if (!validate_scroll_info( info ) || @@ -878,6 +878,9 @@ static int set_scroll_info( HWND hwnd, int bar, const SCROLLINFO *info, BOOL red TRACE( "\n" ); } + /* undocumented flag, return previous position instead of modified */ + if (info->fMask & SIF_RETURNPREV) ret = scroll->curVal; + /* Set the page size */ if ((info->fMask & SIF_PAGE) && scroll->page != info->nPage) { @@ -970,7 +973,7 @@ static int set_scroll_info( HWND hwnd, int bar, const SCROLLINFO *info, BOOL red } done: - ret = scroll->curVal; + if (!(info->fMask & SIF_RETURNPREV)) ret = scroll->curVal; release_scroll_info_ptr( scroll ); if (action & SA_SSI_HIDE) show_scroll_bar( hwnd, bar, FALSE, FALSE ); diff --git a/include/ntuser.h b/include/ntuser.h index fecdbbbe253..34701d21533 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -269,6 +269,9 @@ struct send_message_callback_params /* NtUserScrollWindowEx flag */ #define SW_NODCCACHE 0x8000 +/* NtUserSetScrollInfo flag */ +#define SIF_RETURNPREV 0x1000 + /* NtUserInitializeClientPfnArrays parameter, not compatible with Windows */ struct user_client_procs {