winex11: Use ntdll_umbstowcs and ntdll_wcstoumbs for Unicode conversion.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
03e8991735
commit
c0a8b2dbd5
|
@ -358,9 +358,9 @@ static void register_win32_formats( const UINT *ids, UINT size )
|
|||
if (find_win32_format( *ids )) continue; /* it already exists */
|
||||
if (!NtUserGetClipboardFormatName( *ids, buffer, ARRAYSIZE(buffer) ))
|
||||
continue; /* not a named format */
|
||||
if (!(len = WideCharToMultiByte( CP_UNIXCP, 0, buffer, -1, NULL, 0, NULL, NULL ))) continue;
|
||||
if (!(names[count] = malloc( len ))) continue;
|
||||
WideCharToMultiByte( CP_UNIXCP, 0, buffer, -1, names[count], len, NULL, NULL );
|
||||
len = lstrlenW( buffer );
|
||||
if (!(names[count] = malloc( len * 3 + 1 ))) continue;
|
||||
ntdll_wcstoumbs( buffer, len + 1, names[count], len * 3 + 1, FALSE );
|
||||
new_ids[count++] = *ids;
|
||||
}
|
||||
if (!count) return;
|
||||
|
@ -405,7 +405,7 @@ static void register_x11_formats( const Atom *atoms, UINT size )
|
|||
|
||||
for (i = pos = 0; i < count; i++)
|
||||
{
|
||||
if (MultiByteToWideChar( CP_UNIXCP, 0, names[i], -1, buffer, 256 ) &&
|
||||
if (ntdll_umbstowcs( names[i], strlen( names[i] ) + 1, buffer, ARRAYSIZE(buffer) ) &&
|
||||
(ids[pos] = register_clipboard_format( buffer )))
|
||||
new_atoms[pos++] = new_atoms[i];
|
||||
XFree( names[i] );
|
||||
|
@ -759,7 +759,8 @@ static void *import_compound_text( Atom type, const void *data, size_t size, siz
|
|||
|
||||
len = strlen(srcstr[0]) + 1;
|
||||
if (!(ret = malloc( (len * 2 + 1) * sizeof(WCHAR) ))) return NULL;
|
||||
count = MultiByteToWideChar( CP_UNIXCP, 0, srcstr[0], len, ret + len, len );
|
||||
|
||||
count = ntdll_umbstowcs( srcstr[0], len, ret + len, len );
|
||||
ret = unicode_text_from_string( ret, ret + len, count, ret_size );
|
||||
|
||||
XFreeStringList(srcstr);
|
||||
|
@ -1282,8 +1283,7 @@ static BOOL export_compound_text( Display *display, Window win, Atom prop, Atom
|
|||
|
||||
|
||||
if (!(text = malloc( size / sizeof(WCHAR) * 3 ))) return FALSE;
|
||||
len = WideCharToMultiByte( CP_UNIXCP, 0, data, size / sizeof(WCHAR),
|
||||
text, size / sizeof(WCHAR) * 3, NULL, NULL );
|
||||
len = ntdll_wcstoumbs( data, size / sizeof(WCHAR), text, size / sizeof(WCHAR) * 3, FALSE );
|
||||
string_from_unicode_text( text, len, &len );
|
||||
|
||||
if (target == x11drv_atom(COMPOUND_TEXT))
|
||||
|
|
|
@ -1904,7 +1904,7 @@ SHORT X11DRV_VkKeyScanEx( WCHAR wChar, HKL hkl )
|
|||
/* FIXME: what happens if wChar is not a Latin1 character and CP_UNIXCP
|
||||
* is UTF-8 (multibyte encoding)?
|
||||
*/
|
||||
if (!WideCharToMultiByte(CP_UNIXCP, 0, &wChar, 1, &cChar, 1, NULL, NULL))
|
||||
if (!ntdll_wcstoumbs( &wChar, 1, &cChar, 1, FALSE ))
|
||||
{
|
||||
WARN("no translation from unicode to CP_UNIXCP for 0x%02x\n", wChar);
|
||||
return -1;
|
||||
|
@ -2100,7 +2100,7 @@ UINT X11DRV_MapVirtualKeyEx( UINT wCode, UINT wMapType, HKL hkl )
|
|||
if (len)
|
||||
{
|
||||
WCHAR wch;
|
||||
if (MultiByteToWideChar(CP_UNIXCP, 0, s, len, &wch, 1)) ret = toupperW(wch);
|
||||
if (ntdll_umbstowcs( s, len, &wch, 1 )) ret = toupperW(wch);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -2208,7 +2208,7 @@ INT X11DRV_GetKeyNameText( LONG lParam, LPWSTR lpBuffer, INT nSize )
|
|||
pthread_mutex_unlock( &kbd_mutex );
|
||||
TRACE("found scan=%04x keyc=%u keysym=%lx modified_string=%s\n",
|
||||
scanCode, keyc, keys, debugstr_an(name,idx-name));
|
||||
rc = MultiByteToWideChar(CP_UNIXCP, 0, name, idx-name+1, lpBuffer, nSize);
|
||||
rc = ntdll_umbstowcs( name, idx - name + 1, lpBuffer, nSize );
|
||||
if (!rc) rc = nSize;
|
||||
lpBuffer[--rc] = 0;
|
||||
return rc;
|
||||
|
@ -2220,7 +2220,7 @@ INT X11DRV_GetKeyNameText( LONG lParam, LPWSTR lpBuffer, INT nSize )
|
|||
pthread_mutex_unlock( &kbd_mutex );
|
||||
TRACE("found scan=%04x keyc=%u keysym=%04x vkey=%04x string=%s\n",
|
||||
scanCode, keyc, (int)keys, vkey, debugstr_a(name));
|
||||
rc = MultiByteToWideChar(CP_UNIXCP, 0, name, -1, lpBuffer, nSize);
|
||||
rc = ntdll_umbstowcs( name, strlen(name) + 1, lpBuffer, nSize );
|
||||
if (!rc) rc = nSize;
|
||||
lpBuffer[--rc] = 0;
|
||||
return rc;
|
||||
|
@ -2515,7 +2515,7 @@ INT X11DRV_ToUnicodeEx( UINT virtKey, UINT scanCode, const BYTE *lpKeyState,
|
|||
dead_char = KEYBOARD_MapDeadKeysym(keysym);
|
||||
if (dead_char)
|
||||
{
|
||||
MultiByteToWideChar(CP_UNIXCP, 0, &dead_char, 1, bufW, bufW_size);
|
||||
ntdll_umbstowcs( &dead_char, 1, bufW, bufW_size );
|
||||
ret = -1;
|
||||
goto found;
|
||||
}
|
||||
|
@ -2611,7 +2611,7 @@ INT X11DRV_ToUnicodeEx( UINT virtKey, UINT scanCode, const BYTE *lpKeyState,
|
|||
if(ret)
|
||||
{
|
||||
TRACE_(key)("Translating char 0x%02x to unicode\n", *(BYTE *)lpChar);
|
||||
ret = MultiByteToWideChar(CP_UNIXCP, 0, lpChar, ret, bufW, bufW_size);
|
||||
ret = ntdll_umbstowcs( lpChar, ret, bufW, bufW_size );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1084,7 +1084,7 @@ static Cursor create_xcursor_system_cursor( const ICONINFOEXW *info )
|
|||
{
|
||||
const WCHAR *valueW = (const WCHAR *)value->Data;
|
||||
if (!valueW[0]) return 0; /* force standard cursor */
|
||||
if (!WideCharToMultiByte( CP_UNIXCP, 0, valueW, -1, valueA, sizeof(valueA), NULL, NULL ))
|
||||
if (!ntdll_wcstoumbs( valueW, lstrlenW(valueW) + 1, valueA, sizeof(valueA), FALSE ))
|
||||
valueA[0] = 0;
|
||||
goto done;
|
||||
}
|
||||
|
|
|
@ -443,9 +443,9 @@ static void sync_window_text( Display *display, Window win, const WCHAR *text )
|
|||
|
||||
/* allocate new buffer for window text */
|
||||
len = lstrlenW( text );
|
||||
count = WideCharToMultiByte(CP_UNIXCP, 0, text, -1, NULL, 0, NULL, NULL);
|
||||
count = len * 3 + 1;
|
||||
if (!(buffer = malloc( count ))) return;
|
||||
WideCharToMultiByte(CP_UNIXCP, 0, text, -1, buffer, count, NULL, NULL);
|
||||
ntdll_wcstoumbs( text, len + 1, buffer, count, FALSE );
|
||||
|
||||
RtlUnicodeToUTF8N( NULL, 0, &count, text, len * sizeof(WCHAR) );
|
||||
if (!(utf8_buffer = malloc( count )))
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winnls.h"
|
||||
#include "x11drv.h"
|
||||
#include "wine/unicode.h"
|
||||
#include "wine/debug.h"
|
||||
|
@ -616,7 +615,7 @@ BOOL CDECL X11DRV_LoadTabletInfo(HWND hwnddefault)
|
|||
WARN("Unable to open device %s\n",target->name);
|
||||
break;
|
||||
}
|
||||
MultiByteToWideChar(CP_UNIXCP, 0, target->name, -1, cursor.NAME, WT_MAX_NAME_LEN);
|
||||
ntdll_umbstowcs(target->name, strlen(target->name) + 1, cursor.NAME, WT_MAX_NAME_LEN);
|
||||
|
||||
if (! is_tablet_cursor(target->name, device_type))
|
||||
{
|
||||
|
@ -1031,7 +1030,8 @@ int CDECL X11DRV_AttachEventQueueToTablet(HWND hOwner)
|
|||
if (!gSysCursor[cur_loop].ACTIVE) continue;
|
||||
|
||||
/* the cursor name fits in the buffer because too long names are skipped */
|
||||
WideCharToMultiByte(CP_UNIXCP, 0, gSysCursor[cur_loop].NAME, -1, cursorNameA, WT_MAX_NAME_LEN, NULL, NULL);
|
||||
ntdll_wcstoumbs(gSysCursor[cur_loop].NAME, lstrlenW(gSysCursor[cur_loop].NAME) + 1,
|
||||
cursorNameA, WT_MAX_NAME_LEN, FALSE);
|
||||
for (loop=0; loop < num_devices; loop ++)
|
||||
if (strcmp(devices[loop].name, cursorNameA) == 0)
|
||||
target = &devices[loop];
|
||||
|
|
|
@ -62,6 +62,7 @@ typedef int Status;
|
|||
#include "ntgdi.h"
|
||||
#include "wine/gdi_driver.h"
|
||||
#include "unixlib.h"
|
||||
#include "winnls.h"
|
||||
#include "wine/list.h"
|
||||
|
||||
#define MAX_DASHLEN 16
|
||||
|
@ -916,4 +917,16 @@ static inline UINT asciiz_to_unicode( WCHAR *dst, const char *src )
|
|||
return (p - dst) * sizeof(WCHAR);
|
||||
}
|
||||
|
||||
/* FIXME: remove once we may use ntdll.so version */
|
||||
|
||||
static inline DWORD ntdll_umbstowcs( const char *src, DWORD srclen, WCHAR *dst, DWORD dstlen )
|
||||
{
|
||||
return MultiByteToWideChar( CP_UNIXCP, 0, src, srclen, dst, dstlen );
|
||||
}
|
||||
|
||||
static inline int ntdll_wcstoumbs( const WCHAR *src, DWORD srclen, char *dst, DWORD dstlen, BOOL strict )
|
||||
{
|
||||
return WideCharToMultiByte( CP_UNIXCP, 0, src, srclen, dst, dstlen, NULL, NULL );
|
||||
}
|
||||
|
||||
#endif /* __WINE_X11DRV_H */
|
||||
|
|
|
@ -101,23 +101,20 @@ static void X11DRV_ImmSetInternalString(DWORD dwOffset,
|
|||
|
||||
void X11DRV_XIMLookupChars( const char *str, DWORD count )
|
||||
{
|
||||
DWORD dwOutput;
|
||||
WCHAR *wcOutput;
|
||||
WCHAR *output;
|
||||
DWORD len;
|
||||
HWND focus;
|
||||
|
||||
TRACE("%p %u\n", str, count);
|
||||
|
||||
dwOutput = MultiByteToWideChar(CP_UNIXCP, 0, str, count, NULL, 0);
|
||||
wcOutput = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * dwOutput);
|
||||
if (wcOutput == NULL)
|
||||
return;
|
||||
MultiByteToWideChar(CP_UNIXCP, 0, str, count, wcOutput, dwOutput);
|
||||
if (!(output = malloc( count * sizeof(WCHAR) ))) return;
|
||||
len = ntdll_umbstowcs( str, count, output, count );
|
||||
|
||||
if ((focus = GetFocus()))
|
||||
IME_UpdateAssociation(focus);
|
||||
|
||||
IME_SetResultString(wcOutput, dwOutput);
|
||||
HeapFree(GetProcessHeap(), 0, wcOutput);
|
||||
IME_SetResultString( output, len );
|
||||
free( output );
|
||||
}
|
||||
|
||||
static BOOL XIMPreEditStateNotifyCallback(XIC xic, XPointer p, XPointer data)
|
||||
|
@ -173,24 +170,18 @@ static void XIMPreEditDrawCallback(XIM ic, XPointer client_data,
|
|||
{
|
||||
if (! P_DR->text->encoding_is_wchar)
|
||||
{
|
||||
DWORD dwOutput;
|
||||
WCHAR *wcOutput;
|
||||
size_t text_len;
|
||||
WCHAR *output;
|
||||
|
||||
TRACE("multibyte\n");
|
||||
dwOutput = MultiByteToWideChar(CP_UNIXCP, 0,
|
||||
P_DR->text->string.multi_byte, -1,
|
||||
NULL, 0);
|
||||
wcOutput = HeapAlloc(GetProcessHeap(), 0, sizeof (WCHAR) * dwOutput);
|
||||
if (wcOutput)
|
||||
text_len = strlen( P_DR->text->string.multi_byte );
|
||||
if ((output = malloc( text_len * sizeof(WCHAR) )))
|
||||
{
|
||||
dwOutput = MultiByteToWideChar(CP_UNIXCP, 0,
|
||||
P_DR->text->string.multi_byte, -1,
|
||||
wcOutput, dwOutput);
|
||||
text_len = ntdll_umbstowcs( P_DR->text->string.multi_byte, text_len,
|
||||
output, text_len );
|
||||
|
||||
/* ignore null */
|
||||
dwOutput --;
|
||||
X11DRV_ImmSetInternalString (sel, len, wcOutput, dwOutput);
|
||||
HeapFree(GetProcessHeap(), 0, wcOutput);
|
||||
X11DRV_ImmSetInternalString( sel, len, output, text_len );
|
||||
free( output );
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue