From: Jactry Zeng Subject: [PATCH v2 3/5] riched20: Allow to return text with OLE object mark. Message-Id: <20210525070603.99662-3-jzeng@codeweavers.com> Date: Tue, 25 May 2021 15:06:01 +0800 In-Reply-To: <20210525070603.99662-1-jzeng@codeweavers.com> References: <20210525070603.99662-1-jzeng@codeweavers.com> Signed-off-by: Jactry Zeng --- dlls/riched20/caret.c | 4 ++-- dlls/riched20/editor.c | 7 ++++++- dlls/riched20/tests/richole.c | 20 ++++++++++---------- dlls/riched20/tests/txtsrv.c | 2 +- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index 3104178082a..bd7f5dc0149 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -458,7 +458,7 @@ static struct re_object* create_re_object(const REOBJECT *reo) void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor) { ME_Run *run, *prev; - const WCHAR space = ' '; + const WCHAR ole_object_mark = 0xfffc; struct re_object *reobj_prev = NULL; ME_Cursor *cursor, cursor_from_ofs; ME_Style *style; @@ -475,7 +475,7 @@ void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCur if (ME_IsSelection(editor)) ME_DeleteSelection(editor); - run = run_insert( editor, cursor, style, &space, 1, MERF_GRAPHICS ); + run = run_insert( editor, cursor, style, &ole_object_mark, 1, MERF_GRAPHICS ); run->reobj = create_re_object( reo ); diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 87f4c7a4e32..960d1401082 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -2132,7 +2132,7 @@ static int get_text_range( ME_TextEditor *editor, WCHAR *buffer, const ME_Cursor *start, int len ) { if (!buffer) return 0; - return ME_GetTextW( editor, buffer, INT_MAX, start, len, MEGT_DEFAULT ); + return ME_GetTextW( editor, buffer, INT_MAX, start, len, MEGT_NOOLEOBJ ); } int set_selection( ME_TextEditor *editor, int to, int from ) @@ -4273,6 +4273,11 @@ int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen, nLen = 2; str = L"\r\n"; } + else if (flags & MEGT_NOOLEOBJ && run->nFlags & MERF_GRAPHICS) + { + srcChars--; + str = L" "; + } else { nLen = min(nLen, srcChars); diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index a50a4aff26b..702190c8259 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -3395,13 +3395,13 @@ static void test_InsertObject(void) gettextex.lpUsedDefChar = NULL; result = SendMessageW(hwnd, EM_GETTEXTEX, (WPARAM)&gettextex, (LPARAM)buffer); ok(result == lstrlenW(expected_string), "Got wrong length: %d.\n", result); - todo_wine ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); + ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); gettextex.flags = GT_RAWTEXT; memset(buffer, 0, sizeof(buffer)); result = SendMessageW(hwnd, EM_GETTEXTEX, (WPARAM)&gettextex, (LPARAM)buffer); ok(result == lstrlenW(expected_string), "Got wrong length: %d.\n", result); - todo_wine ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); + ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); expected_stringA = "abc d efg"; memset(bufferA, 0, sizeof(bufferA)); @@ -3424,26 +3424,26 @@ static void test_InsertObject(void) hr = ITextRange_GetText(range, &bstr); ok(hr == S_OK, "Got hr %#x.\n", hr); ok(lstrlenW(bstr) == lstrlenW(expected_string), "Got wrong length: %d.\n", lstrlenW(bstr)); - todo_wine ok(!lstrcmpW(bstr, expected_string), "Got text: %s.\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, expected_string), "Got text: %s.\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = ITextRange_SetRange(range, 3, 4); ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ITextRange_GetChar(range, &result); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(result == 0xfffc, "Got char: %c\n", result); + ok(result == 0xfffc, "Got char: %c\n", result); ITextRange_Release(range); SendMessageW(hwnd, EM_SETSEL, 0, -1); hr = ITextSelection_GetText(selection, &bstr); ok(hr == S_OK, "Got hr %#x.\n", hr); ok(lstrlenW(bstr) == lstrlenW(expected_string), "Got wrong length: %d.\n", lstrlenW(bstr)); - todo_wine ok(!lstrcmpW(bstr, expected_string), "Got text: %s.\n", wine_dbgstr_w(bstr)); + ok(!lstrcmpW(bstr, expected_string), "Got text: %s.\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); SendMessageW(hwnd, EM_SETSEL, 3, 4); result = 0; hr = ITextSelection_GetChar(selection, &result); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(result == 0xfffc, "Got char: %c\n", result); + ok(result == 0xfffc, "Got char: %c\n", result); SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)""); result = SendMessageW(hwnd, EM_SETTEXTMODE, (WPARAM)TM_PLAINTEXT, 0); @@ -3476,13 +3476,13 @@ static void test_InsertObject(void) gettextex.lpUsedDefChar = NULL; result = SendMessageW(hwnd, EM_GETTEXTEX, (WPARAM)&gettextex, (LPARAM)buffer); ok(result == lstrlenW(expected_string), "Got wrong length: %d.\n", result); - todo_wine ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); + ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); gettextex.flags = GT_RAWTEXT; memset(buffer, 0, sizeof(buffer)); result = SendMessageW(hwnd, EM_GETTEXTEX, (WPARAM)&gettextex, (LPARAM)buffer); ok(result == lstrlenW(expected_string), "Got wrong length: %d.\n", result); - todo_wine ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); + ok(!lstrcmpW(buffer, expected_string), "Got wrong content: %s.\n", debugstr_w(buffer)); expected_stringA = "abc d efg"; memset(bufferA, 0, sizeof(bufferA)); @@ -3511,7 +3511,7 @@ static void test_InsertObject(void) ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ITextRange_GetChar(range, &result); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(result == 0xfffc, "Got char: %c\n", result); + ok(result == 0xfffc, "Got char: %c\n", result); ITextRange_Release(range); SendMessageW(hwnd, EM_SETSEL, 0, -1); @@ -3524,7 +3524,7 @@ static void test_InsertObject(void) result = 0; hr = ITextSelection_GetChar(selection, &result); ok(hr == S_OK, "Got hr %#x.\n", hr); - todo_wine ok(result == 0xfffc, "Got char: %c\n", result); + ok(result == 0xfffc, "Got char: %c\n", result); release_interfaces(&hwnd, &reole, &doc, &selection); } diff --git a/dlls/riched20/tests/txtsrv.c b/dlls/riched20/tests/txtsrv.c index 1f789da8a37..0f6fc44cee6 100644 --- a/dlls/riched20/tests/txtsrv.c +++ b/dlls/riched20/tests/txtsrv.c @@ -698,7 +698,7 @@ static void test_TxGetText(void) hres = ITextServices_TxGetText(txtserv, &rettext); ok(hres == S_OK, "Got hres: %#x.\n", hres); ok(lstrlenW(rettext) == lstrlenW(expected_string), "Got wrong length: %d.\n", lstrlenW(rettext)); - todo_wine ok(!lstrcmpW(rettext, expected_string), "Got wrong content: %s.\n", debugstr_w(rettext)); + ok(!lstrcmpW(rettext, expected_string), "Got wrong content: %s.\n", debugstr_w(rettext)); SysFreeString(rettext); IOleClientSite_Release(clientsite); IRichEditOle_Release(reole); -- 2.30.2