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

Nikolay Sivov nsivov at codeweavers.com
Thu Nov 7 06:06:10 CST 2019


From: Fabian Maurer <dark.shadow4 at web.de>

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47305
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/comctl32/edit.c       |  6 +-----
 dlls/comctl32/tests/edit.c | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c
index bdd3b72558..d02d7af7b9 100644
--- a/dlls/comctl32/edit.c
+++ b/dlls/comctl32/edit.c
@@ -1038,12 +1038,8 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap)
 		lw = line_def->width;
 		w = es->format_rect.right - es->format_rect.left;
 		if (line_def->ssa)
-		{
 			ScriptStringCPtoX(line_def->ssa, (index - 1) - li, TRUE, &x);
-			x -= es->x_offset;
-		}
-		else
-			x = es->x_offset;
+		x -= es->x_offset;
 
 		if (es->style & ES_RIGHT)
 			x = w - (lw - x);
diff --git a/dlls/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c
index 3fe208c321..cec6025077 100644
--- a/dlls/comctl32/tests/edit.c
+++ b/dlls/comctl32/tests/edit.c
@@ -1189,6 +1189,8 @@ static void test_char_from_pos(void)
 {
     int lo, hi, mid, ret, i;
     HWND hwEdit;
+    HDC dc;
+    SIZE size;
 
     hwEdit = create_editcontrol(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
     SendMessageA(hwEdit, WM_SETTEXT, 0, (LPARAM)"aa");
@@ -1321,6 +1323,24 @@ static void test_char_from_pos(void)
     ret = SendMessageA(hwEdit, EM_POSFROMCHAR, 2, 0);
     ok(-1 == ret, "expected -1 got %d\n", ret);
     DestroyWindow(hwEdit);
+
+    /* Scrolled to the right with partially visible line, position on next line. */
+    hwEdit = create_editcontrol(ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
+
+    dc = GetDC(hwEdit);
+    GetTextExtentPoint32A(dc, "w", 1, &size);
+    ReleaseDC(hwEdit, dc);
+
+    SetWindowPos(hwEdit, NULL, 0, 0, size.cx * 15, size.cy * 5, SWP_NOMOVE | SWP_NOZORDER);
+    SendMessageA(hwEdit, WM_SETTEXT, 0, (LPARAM)"wwwwwwwwwwwwwwwwwwww\r\n\r\n");
+    SendMessageA(hwEdit, EM_SETSEL, 40, 40);
+
+    lo = (short)SendMessageA(hwEdit, EM_POSFROMCHAR, 22, 0);
+    ret = (short)SendMessageA(hwEdit, EM_POSFROMCHAR, 20, 0);
+    ret -= 20 * size.cx; /* Calculate expected position, 20 characters back. */
+    ok(ret == lo, "Unexpected position %d vs %d.\n", lo, ret);
+
+    DestroyWindow(hwEdit);
 }
 
 /* Test if creating edit control without ES_AUTOHSCROLL and ES_AUTOVSCROLL
-- 
2.24.0.rc1




More information about the wine-devel mailing list