riched20: Handle EM_GETLINE's unicode conversion in the host.
Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1cd678d6a0
commit
e4c38944d8
|
@ -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:
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue