From: Fabian Maurer Subject: [PATCH 2/2] comctl32/edit: In EM_POSFROMCHAR return correct position for empty lines Message-Id: <20190531151415.27002-2-dark.shadow4@web.de> Date: Fri, 31 May 2019 17:14:15 +0200 In-Reply-To: <20190531151415.27002-1-dark.shadow4@web.de> References: <20190531151415.27002-1-dark.shadow4@web.de> Fix with permission from ROS Jira Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47305 Signed-off-by: Fabian Maurer --- dlls/comctl32/edit.c | 2 +- dlls/comctl32/tests/edit.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c index e64e260bd7..6d8c07273c 100644 --- a/dlls/comctl32/edit.c +++ b/dlls/comctl32/edit.c @@ -1043,7 +1043,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/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c index f454434a0c..f1dc974eaa 100644 --- a/dlls/comctl32/tests/edit.c +++ b/dlls/comctl32/tests/edit.c @@ -1189,6 +1189,9 @@ static void test_char_from_pos(void) { int lo, hi, mid, ret, i; HWND hwEdit; + HDC dc; + SIZE size; + RECT rect; hwEdit = create_editcontrol(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0); SendMessageA(hwEdit, WM_SETTEXT, 0, (LPARAM)"aa"); @@ -1321,6 +1324,22 @@ 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); + + /* 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); + GetClientRect(hwEdit, &rect); + 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) + ret; + ok(ret == lo, "expected %d got %d\n", ret, lo); + DestroyWindow(hwEdit); } /* Test if creating edit control without ES_AUTOHSCROLL and ES_AUTOVSCROLL -- 2.21.0