Huw Davies : riched20: Handle EM_GETLINE'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: e4c38944d83191dc0de525cd212a7972aca862c9
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e4c38944d83191dc0de525cd212a7972aca862c9
Author: Huw Davies <huw at codeweavers.com>
Date: Mon Mar 15 10:03:17 2021 +0000
riched20: Handle EM_GETLINE'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/txthost.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+), 19 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index eb1ec78d962..c27a691de4f 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -4030,11 +4030,9 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
const unsigned int nMaxChars = *(WORD *) lParam;
unsigned int nCharsLeft = nMaxChars;
char *dest = (char *) lParam;
- BOOL wroteNull = FALSE;
ME_Cursor start, end;
- TRACE("EM_GETLINE: row=%d, nMaxChars=%d (%s)\n", (int) wParam, nMaxChars,
- unicode ? "Unicode" : "Ansi");
+ TRACE( "EM_GETLINE: row=%d, nMaxChars=%d\n", (int)wParam, nMaxChars );
row = row_from_row_number( editor, wParam );
if (row == NULL) return 0;
@@ -4052,30 +4050,18 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
str = get_text( run, ofs );
nCopy = min( nCharsLeft, len );
- if (unicode)
- memcpy(dest, str, nCopy * sizeof(WCHAR));
- else
- nCopy = WideCharToMultiByte(CP_ACP, 0, str, nCopy, dest,
- nCharsLeft, NULL, NULL);
- dest += nCopy * (unicode ? sizeof(WCHAR) : 1);
+ memcpy(dest, str, nCopy * sizeof(WCHAR));
+ dest += nCopy * sizeof(WCHAR);
nCharsLeft -= nCopy;
if (run == end.run) break;
run = row_next_run( row, run );
}
/* append line termination, space allowing */
- if (nCharsLeft > 0)
- {
- if (unicode)
- *((WCHAR *)dest) = '\0';
- else
- *dest = '\0';
- nCharsLeft--;
- wroteNull = TRUE;
- }
+ if (nCharsLeft > 0) *((WCHAR *)dest) = '\0';
TRACE("EM_GETLINE: got %u characters\n", nMaxChars - nCharsLeft);
- return nMaxChars - nCharsLeft - (wroteNull ? 1 : 0);
+ return nMaxChars - nCharsLeft;
}
case EM_GETLINECOUNT:
{
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index d249137d829..a10b77e8ebb 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -753,6 +753,32 @@ static BOOL create_windowed_editor( HWND hwnd, CREATESTRUCTW *create, BOOL emula
return TRUE;
}
+static HRESULT get_lineA( ITextServices *text_srv, WPARAM wparam, LPARAM lparam, LRESULT *res )
+{
+ LRESULT len = USHRT_MAX;
+ WORD sizeA;
+ HRESULT hr;
+ WCHAR *buf;
+
+ *res = 0;
+ sizeA = *(WORD *)lparam;
+ *(WORD *)lparam = 0;
+ if (!sizeA) return S_OK;
+ buf = heap_alloc( len * sizeof(WCHAR) );
+ if (!buf) return E_OUTOFMEMORY;
+ *(WORD *)buf = len;
+ hr = ITextServices_TxSendMessage( text_srv, EM_GETLINE, wparam, (LPARAM)buf, &len );
+ if (hr == S_OK && len)
+ {
+ len = WideCharToMultiByte( CP_ACP, 0, buf, len, (char *)lparam, sizeA, NULL, NULL );
+ if (!len && GetLastError() == ERROR_INSUFFICIENT_BUFFER) len = sizeA;
+ if (len < sizeA) ((char *)lparam)[len] = '\0';
+ *res = len;
+ }
+ heap_free( buf );
+ return hr;
+}
+
static HRESULT get_text_rangeA( struct host *host, TEXTRANGEA *rangeA, LRESULT *res )
{
TEXTRANGEW range;
@@ -871,6 +897,11 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
}
break;
}
+ case EM_GETLINE:
+ if (unicode) hr = ITextServices_TxSendMessage( host->text_srv, msg, wparam, lparam, &res );
+ else hr = get_lineA( host->text_srv, wparam, lparam, &res );
+ break;
+
case WM_GETTEXT:
{
GETTEXTEX params;
More information about the wine-cvs
mailing list