David Hedberg : user32: Fix case where EM_SCROLL with page down results in trying to scroll up past the beginning .
Alexandre Julliard
julliard at winehq.org
Wed Mar 3 11:15:46 CST 2010
Module: wine
Branch: master
Commit: 5a1f8c57a819286f3885d9e05a456d5da522a9e0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a1f8c57a819286f3885d9e05a456d5da522a9e0
Author: David Hedberg <david.hedberg at 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)
More information about the wine-cvs
mailing list