Introduce a temporary variable, `other_para`, so that we don't end up returning incorrect para (with stale run) inside the output cursor.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54564
-- v3: riched20: Don't set para unless committing cursor move in ME_MoveCursorWords. riched20/tests: Test for word movement across paragraph boundary.
From: Jinoh Kang jinoh.kang.kr@gmail.com
--- dlls/riched20/tests/editor.c | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+)
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 7c959680e84..c6af2956a9e 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -7301,6 +7301,54 @@ static void test_word_movement(void) DestroyWindow(hwnd); }
+static void test_word_movement_multiline(void) +{ + DWORD sel_start, sel_end; + LRESULT result; + HWND hwnd; + + /* multi-line control inserts CR normally */ + hwnd = new_richedit(NULL); + + result = SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)"Lorem ipsum\rdolor sit\rnamet"); + ok(result == TRUE, "WM_SETTEXT returned %Iu.\n", result); + SendMessageA(hwnd, EM_SETSEL, 0, 0); + /* [|Lorem ipsum] [dolor sit] [amet] */ + + send_ctrl_key(hwnd, VK_RIGHT); + /* [Lorem |ipsum] [dolor sit] [amet] */ + sel_start = sel_end = 0xdeadbeefUL; + SendMessageA(hwnd, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); + ok(sel_start == sel_end, "expected sel length to be 0, got %lu.\n", sel_end - sel_start); + ok(sel_start == 6, "expected sel_start to be %u, got %lu.\n", 6, sel_start); + + send_ctrl_key(hwnd, VK_RIGHT); + /* [Lorem ipsum|] [dolor sit] [amet] */ + sel_start = sel_end = 0xdeadbeefUL; + SendMessageA(hwnd, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); + ok(sel_start == sel_end, "expected sel length to be 0, got %lu.\n", sel_end - sel_start); + todo_wine + ok(sel_start == 11, "expected sel_start to be %u, got %lu.\n", 11, sel_start); + + send_ctrl_key(hwnd, VK_RIGHT); + /* [Lorem ipsum] [|dolor sit] [amet] */ + sel_start = sel_end = 0xdeadbeefUL; + SendMessageA(hwnd, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); + ok(sel_start == sel_end, "expected sel length to be 0, got %lu.\n", sel_end - sel_start); + todo_wine + ok(sel_start == 12, "expected sel_start to be %u, got %lu.\n", 12, sel_start); + + send_ctrl_key(hwnd, VK_LEFT); + /* [Lorem ipsum|] [dolor sit] [amet] */ + sel_start = sel_end = 0xdeadbeefUL; + SendMessageA(hwnd, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); + ok(sel_start == sel_end, "expected sel length to be 0, got %lu.\n", sel_end - sel_start); + todo_wine + ok(sel_start == 11, "expected sel_start to be %u, got %lu.\n", 11, sel_start); + + DestroyWindow(hwnd); +} + static void test_EM_CHARFROMPOS(void) { HWND hwnd; @@ -9209,6 +9257,7 @@ START_TEST( editor ) test_eventMask(); test_undo_coalescing(); test_word_movement(); + test_word_movement_multiline(); test_EM_CHARFROMPOS(); test_SETPARAFORMAT(); test_word_wrap();
From: Jinoh Kang jinoh.kang.kr@gmail.com
Introduce a temporary variable, `other_para`, so that we don't end up returning incorrect para (with stale run) inside the output cursor.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54564 --- dlls/riched20/caret.c | 11 +++++++---- dlls/riched20/tests/editor.c | 3 --- 2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index c9fd327e87e..f89770ccc75 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -802,15 +802,18 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs) } else { - para = para_next( para ); - if (!para_next( para )) + ME_Paragraph *other_para = para_next( para ); + if (!para_next( other_para )) { if (cursor->run == run) return FALSE; nOffset = 0; break; } - if (para->nFlags & MEPF_ROWSTART) para = para_next( para ); - if (cursor->run == run) run = para_first_run( para ); + if (other_para->nFlags & MEPF_ROWSTART) other_para = para_next( other_para ); + if (cursor->run == run) { + para = other_para; + run = para_first_run( para ); + } nOffset = 0; break; } diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index c6af2956a9e..f5065696552 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -7327,7 +7327,6 @@ static void test_word_movement_multiline(void) sel_start = sel_end = 0xdeadbeefUL; SendMessageA(hwnd, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); ok(sel_start == sel_end, "expected sel length to be 0, got %lu.\n", sel_end - sel_start); - todo_wine ok(sel_start == 11, "expected sel_start to be %u, got %lu.\n", 11, sel_start);
send_ctrl_key(hwnd, VK_RIGHT); @@ -7335,7 +7334,6 @@ static void test_word_movement_multiline(void) sel_start = sel_end = 0xdeadbeefUL; SendMessageA(hwnd, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); ok(sel_start == sel_end, "expected sel length to be 0, got %lu.\n", sel_end - sel_start); - todo_wine ok(sel_start == 12, "expected sel_start to be %u, got %lu.\n", 12, sel_start);
send_ctrl_key(hwnd, VK_LEFT); @@ -7343,7 +7341,6 @@ static void test_word_movement_multiline(void) sel_start = sel_end = 0xdeadbeefUL; SendMessageA(hwnd, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); ok(sel_start == sel_end, "expected sel length to be 0, got %lu.\n", sel_end - sel_start); - todo_wine ok(sel_start == 11, "expected sel_start to be %u, got %lu.\n", 11, sel_start);
DestroyWindow(hwnd);
v3: - Remove debug code
This merge request was approved by Huw Davies.