Module: wine Branch: master Commit: 5a1f8c57a819286f3885d9e05a456d5da522a9e0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a1f8c57a819286f3885d9e05a...
Author: David Hedberg david.hedberg@gmail.com Date: Wed Mar 3 13:19:47 2010 +0100
user32: Fix case where EM_SCROLL with page down results in trying to scroll up past the beginning.
---
dlls/user32/edit.c | 2 +- dlls/user32/tests/edit.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c index 35f8285..9898bc4 100644 --- a/dlls/user32/edit.c +++ b/dlls/user32/edit.c @@ -1632,7 +1632,7 @@ static LRESULT EDIT_EM_Scroll(EDITSTATE *es, INT action) INT vlc = get_vertical_line_count(es); /* check if we are going to move too far */ if(es->y_offset + dy > es->line_count - vlc) - dy = es->line_count - vlc - es->y_offset; + dy = max(es->line_count - vlc, 0) - es->y_offset;
/* Notification is done in EDIT_EM_LineScroll */ if(dy) { diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c index 6d3afb8..ee181f2 100644 --- a/dlls/user32/tests/edit.c +++ b/dlls/user32/tests/edit.c @@ -1320,6 +1320,7 @@ static void test_edit_control_limittext(void) static void test_edit_control_scroll(void) { static const char *single_line_str = "a"; + static const char *multiline_str = "Test\r\nText"; HWND hwEdit; LONG ret;
@@ -1348,6 +1349,22 @@ static void test_edit_control_scroll(void) ok(!ret, "Returned %x, expected 0.\n", ret);
DestroyWindow (hwEdit); + + /* SB_PAGEDOWN while at the beginning of a buffer with few lines + should not cause EM_SCROLL to return a negative value of + scrolled lines that would put us "before" the beginning. */ + hwEdit = CreateWindow( + "EDIT", + multiline_str, + WS_VSCROLL | ES_MULTILINE, + 0, 0, 100, 100, + NULL, NULL, hinst, NULL); + assert(hwEdit); + + ret = SendMessage(hwEdit, EM_SCROLL, SB_PAGEDOWN, 0); + ok(!ret, "Returned %x, expected 0.\n", ret); + + DestroyWindow (hwEdit); }
static void test_margins(void)