[PATCH v2 1/2] user32/edit: In EM_POSFROMCHAR return correct position for empty lines

Fabian Maurer dark.shadow4 at web.de
Wed Jun 12 16:30:36 CDT 2019


Fix with permission from ROS Jira

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47305
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 dlls/user32/edit.c       |  2 +-
 dlls/user32/tests/edit.c | 17 +++++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index 3c5331f9dc..6c758c3911 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -1102,7 +1102,7 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap)
 			x -= es->x_offset;
 		}
 		else
-			x = es->x_offset;
+			x = (lw > 0 ? es->x_offset : -es->x_offset);

 		if (es->style & ES_RIGHT)
 			x = w - (lw - x);
diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c
index d0374c02a3..b9ca2617c6 100644
--- a/dlls/user32/tests/edit.c
+++ b/dlls/user32/tests/edit.c
@@ -1142,6 +1142,8 @@ static void test_edit_control_4(void)
     int lo, hi, mid;
     int ret;
     int i;
+    HDC dc;
+    SIZE size;

     trace("EDIT: Test EM_CHARFROMPOS and EM_POSFROMCHAR\n");
     hwEdit = create_editcontrol(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
@@ -1251,6 +1253,21 @@ static void test_edit_control_4(void)
     ret = SendMessageA(hwEdit, EM_POSFROMCHAR, 2, 0);
     ok(-1 == ret, "expected -1 got %d\n", ret);
     DestroyWindow(hwEdit);
+
+    /* Test newline when the edit control is scrolled to the right */
+
+    hwEdit = create_editcontrol(ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
+    SendMessageA(hwEdit, WM_SETTEXT, 0, (LPARAM)"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\r\n\r\n");
+    SendMessageA(hwEdit, EM_SETSEL, 40, 40);
+
+    dc = GetDC(hwEdit);
+    GetTextExtentPoint32A(dc, "w", 1, &size);
+    ReleaseDC(hwEdit, dc);
+    lo = (short)LOWORD(SendMessageA(hwEdit, EM_POSFROMCHAR, 42, 0));
+    ret = (short)LOWORD(SendMessageA(hwEdit, EM_POSFROMCHAR, 40, 0));
+    ret += size.cx  * (-40); /* Calculate expected position, 40 characters to the left */
+    ok(ret == lo, "expected %d got %d\n", ret, lo);
+    DestroyWindow(hwEdit);
 }

 /* Test if creating edit control without ES_AUTOHSCROLL and ES_AUTOVSCROLL
--
2.22.0




More information about the wine-devel mailing list