Huw Davies : riched20: Handle EM_GETSELTEXT's unicode conversion in the host.

Alexandre Julliard julliard at winehq.org
Mon Mar 15 16:59:12 CDT 2021


Module: wine
Branch: master
Commit: dc6434959ea05d5dc715e0de01c630dff509717d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=dc6434959ea05d5dc715e0de01c630dff509717d

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Mar 15 10:03:18 2021 +0000

riched20: Handle EM_GETSELTEXT's unicode conversion in the host.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/riched20/editor.c       | 24 ++++++------------------
 dlls/riched20/tests/editor.c |  4 ++--
 dlls/riched20/txthost.c      | 14 ++++++++++++++
 dlls/riched32/tests/editor.c |  6 +++---
 4 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index c27a691de4f..994e91ce3d5 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2132,22 +2132,11 @@ static int ME_GetTextEx(ME_TextEditor *editor, GETTEXTEX *ex, LPARAM pText)
     }
 }
 
-static int ME_GetTextRange(ME_TextEditor *editor, WCHAR *strText,
-                           const ME_Cursor *start, int nLen, BOOL unicode)
+static int get_text_range( ME_TextEditor *editor, WCHAR *buffer,
+                           const ME_Cursor *start, int len )
 {
-    if (!strText) return 0;
-    if (unicode) {
-      return ME_GetTextW(editor, strText, INT_MAX, start, nLen, FALSE, FALSE);
-    } else {
-      int nChars;
-      WCHAR *p = heap_alloc((nLen+1) * sizeof(*p));
-      if (!p) return 0;
-      nChars = ME_GetTextW(editor, p, nLen, start, nLen, FALSE, FALSE);
-      WideCharToMultiByte(CP_ACP, 0, p, nChars+1, (char *)strText,
-                          nLen+1, NULL, NULL);
-      heap_free(p);
-      return nChars;
-    }
+    if (!buffer) return 0;
+    return ME_GetTextW( editor, buffer, INT_MAX, start, len, FALSE, FALSE );
 }
 
 int set_selection( ME_TextEditor *editor, int to, int from )
@@ -3991,8 +3980,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
   {
     int nFrom, nTo, nStartCur = ME_GetSelectionOfs(editor, &nFrom, &nTo);
     ME_Cursor *from = &editor->pCursors[nStartCur];
-    return ME_GetTextRange(editor, (WCHAR *)lParam, from,
-                           nTo - nFrom, unicode);
+    return get_text_range( editor, (WCHAR *)lParam, from, nTo - nFrom );
   }
   case EM_GETSCROLLPOS:
   {
@@ -4021,7 +4009,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
     if (nStart >= nEnd) return 0;
 
     cursor_from_char_ofs( editor, nStart, &start );
-    return ME_GetTextRange( editor, rng->lpstrText, &start, nEnd - nStart, TRUE );
+    return get_text_range( editor, rng->lpstrText, &start, nEnd - nStart );
   }
   case EM_GETLINE:
   {
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 170c29f186e..1ce94f8ae64 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -1828,8 +1828,8 @@ static void test_EM_GETSELTEXT(void)
         SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"abcdef\x8e\xf0ghijk");
         SendMessageA(hwndRichEdit, EM_SETSEL, 4, 8);
         result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, 0, (LPARAM)buffer);
-        todo_wine ok(result == 5, "EM_GETSELTEXT returned %ld\n", result);
-        todo_wine ok(!strcmp("ef\x8e\xf0g", buffer), "EM_GETSELTEXT filled %s\n", buffer);
+        ok(result == 5, "EM_GETSELTEXT returned %ld\n", result);
+        ok(!strcmp("ef\x8e\xf0g", buffer), "EM_GETSELTEXT filled %s\n", buffer);
     }
 
     DestroyWindow(hwndRichEdit);
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index a10b77e8ebb..1acf1d1e207 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -902,6 +902,20 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         else hr = get_lineA( host->text_srv, wparam, lparam, &res );
         break;
 
+    case EM_GETSELTEXT:
+    {
+        TEXTRANGEA range;
+
+        if (unicode) hr = ITextServices_TxSendMessage( host->text_srv, msg, wparam, lparam, &res );
+        else
+        {
+            ITextServices_TxSendMessage( host->text_srv, EM_EXGETSEL, 0, (LPARAM)&range.chrg, &res );
+            range.lpstrText = (char *)lparam;
+            range.lpstrText[0] = '\0';
+            hr = get_text_rangeA( host, &range, &res );
+        }
+        break;
+    }
     case WM_GETTEXT:
     {
         GETTEXTEX params;
diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c
index 0f5ca9f738b..5e3a70c5c7d 100644
--- a/dlls/riched32/tests/editor.c
+++ b/dlls/riched32/tests/editor.c
@@ -623,7 +623,7 @@ static void test_EM_GETSELTEXT(void)
         SendMessageA(hwndRichEdit, EM_SETSEL, 4, 8);
         result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, 0, (LPARAM)buffer);
         ok(result == 4, "EM_GETSELTEXT returned %ld\n", result);
-        todo_wine ok(!strcmp("ef\x8e\xf0", buffer), "EM_GETSELTEXT filled %s\n", buffer);
+        ok(!strcmp("ef\x8e\xf0", buffer), "EM_GETSELTEXT filled %s\n", buffer);
     }
 
     DestroyWindow(hwndRichEdit);
@@ -1362,7 +1362,7 @@ static void test_EM_EXSETSEL(void)
         result =  SendMessageA(hwndRichEdit, EM_EXSETSEL, 0, (LPARAM)&cr);
         todo_wine ok(result == 7, "EM_EXSETSEL return %ld expected 7\n", result);
         result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, sizeof(bufA), (LPARAM)bufA);
-        todo_wine ok(!strcmp(bufA, "ef\x8e\xf0"), "EM_GETSELTEXT return incorrect string\n");
+        ok(!strcmp(bufA, "ef\x8e\xf0"), "EM_GETSELTEXT return incorrect string\n");
         SendMessageA(hwndRichEdit, EM_EXGETSEL, 0, (LPARAM)&cr);
         ok(cr.cpMin == 4, "Selection start incorrectly: %d expected 4\n", cr.cpMin);
         ok(cr.cpMax == 8, "Selection end incorrectly: %d expected 8\n", cr.cpMax);
@@ -1421,7 +1421,7 @@ static void test_EM_SETSEL(void)
         result =  SendMessageA(hwndRichEdit, EM_SETSEL, 4, 8);
         todo_wine ok(result == 7, "EM_SETSEL return %ld expected 7\n", result);
         result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, sizeof(buffA), (LPARAM)buffA);
-        todo_wine ok(!strcmp(buffA, "ef\x8e\xf0"), "EM_GETSELTEXT return incorrect string\n");
+        ok(!strcmp(buffA, "ef\x8e\xf0"), "EM_GETSELTEXT return incorrect string\n");
         result = SendMessageA(hwndRichEdit, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
         ok(sel_start == 4, "Selection start incorrectly: %d expected 4\n", sel_start);
         ok(sel_end == 8, "Selection end incorrectly: %d expected 8\n", sel_end);




More information about the wine-cvs mailing list