On 01/17/2012 09:32 AM, Aric Stewart wrote:
>
> The problem is that there is no XK keycode for just Shift, Control or Menu
> so X11DRV_MapVirtualKeyEx maps them to Shift_L, etc. As a result the string
> XKeysymToString returns is a string with a _L or _R at the end, even if the
> "don't care" bit is set.
> + char *new_name;
> + INT rc = 0;
> + new_name = HeapAlloc(GetProcessHeap(),0,(idx-name)+1);
> + lstrcpynA(new_name,name,(idx-name)+1);
> + new_name[idx-name] = 0;
> + TRACE("found scan=%04x keyc=%u keysym=%04x new_string=%s\n",
> + scanCode, keyc, (int)keys, new_name);
> + if (lpBuffer && nSize)
> + rc = MultiByteToWideChar(CP_UNIXCP, 0, new_name, -1, lpBuffer, nSize);
> + HeapFree(GetProcessHeap(),0,new_name);
> + return rc;
I don't think you need an extra buffer. Just do something like:
if (lpBuffer && nSize)
{
rc = MultiByteToWideChar(CP_UNIXCP, 0, new_name, idx - name, lpBuffer, nSize);
if (nSize > idx - name)
lpBuffer[idx - name] = 0;
}
Of course need to account for rc.
Vitaliy