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