Alexandre Julliard : wineandroid: Implement ToUnicodeEx.

Dmitry Timoshkov dmitry at baikal.ru
Thu Jun 8 22:12:34 CDT 2017


Alexandre Julliard <julliard at winehq.org> wrote:

> +INT CDECL ANDROID_ToUnicodeEx( UINT virt, UINT scan, const BYTE *state,
> +                               LPWSTR buf, int size, UINT flags, HKL hkl )
> +{
> +    WCHAR buffer[2];
> +    BOOL shift = (state[VK_SHIFT] & 0x80) || (state[VK_CAPITAL] & 0x01);

Treating Shift and CapsLock states same way leads to not correct results
for the not letter keys.

> +    BOOL ctrl = state[VK_CONTROL] & 0x80;
> +    BOOL numlock = state[VK_NUMLOCK] & 0x01;
> +
> +    buffer[0] = buffer[1] = 0;
> +
> +    if (scan & 0x8000) return 0;  /* key up */
> +
> +    /* FIXME: hardcoded layout */
> +
> +    if (!ctrl)
> +    {
> +        switch (virt)
> +        {
> +        case VK_BACK:       buffer[0] = '\b'; break;
> +        case VK_OEM_1:      buffer[0] = shift ? ':' : ';'; break;
> +        case VK_OEM_2:      buffer[0] = shift ? '?' : '/'; break;
> +        case VK_OEM_3:      buffer[0] = shift ? '~' : '`'; break;
> +        case VK_OEM_4:      buffer[0] = shift ? '{' : '['; break;
> +        case VK_OEM_5:      buffer[0] = shift ? '|' : '\\'; break;
> +        case VK_OEM_6:      buffer[0] = shift ? '}' : ']'; break;
> +        case VK_OEM_7:      buffer[0] = shift ? '"' : '\''; break;
> +        case VK_OEM_COMMA:  buffer[0] = shift ? '<' : ','; break;
> +        case VK_OEM_MINUS:  buffer[0] = shift ? '_' : '-'; break;
> +        case VK_OEM_PERIOD: buffer[0] = shift ? '>' : '.'; break;
> +        case VK_OEM_PLUS:   buffer[0] = shift ? '+' : '='; break;
> +        case VK_RETURN:     buffer[0] = '\r'; break;
> +        case VK_SPACE:      buffer[0] = ' '; break;
> +        case VK_TAB:        buffer[0] = '\t'; break;
> +        case VK_MULTIPLY:   buffer[0] = '*'; break;
> +        case VK_ADD:        buffer[0] = '+'; break;
> +        case VK_SUBTRACT:   buffer[0] = '-'; break;
> +        case VK_DIVIDE:     buffer[0] = '/'; break;
> +        default:
> +            if (virt >= '0' && virt <= '9')
> +            {
> +                buffer[0] = shift ? ")!@#$%^&*("[virt - '0'] : virt;

While this compiles even with MSVC there are certainly more readable ways
to do the same thing.

-- 
Dmitry.



More information about the wine-devel mailing list