user: Added fast A->W mapping for WM_GETTEXTLENGTH and related messages.
diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index ae5b864..3dca3e9 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -770,11 +770,6 @@
*plparam = (LPARAM)buf;
return (*plparam ? 1 : -1);
}
- case WM_GETTEXTLENGTH:
- case CB_GETLBTEXTLEN:
- case LB_GETTEXTLEN:
- return 1; /* need to map result */
-
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
FIXME_(msg)("message %s (0x%x) needs translation, please report\n", SPY_GetMsgName(msg, hwnd), msg );
@@ -2704,6 +2699,33 @@
ret = callback( hwnd, msg, map_wparam_char_AtoW(wParam,2), lParam, result, arg );
break;
+ case WM_GETTEXTLENGTH:
+ case CB_GETLBTEXTLEN:
+ case LB_GETTEXTLEN:
+ ret = callback( hwnd, msg, wParam, lParam, result, arg );
+ if (*result >= 0)
+ {
+ WCHAR *ptr, buffer[512];
+ LRESULT tmp;
+ DWORD len = *result + 1;
+ /* Determine respective GETTEXT message */
+ UINT msgGetText = (msg == WM_GETTEXTLENGTH) ? WM_GETTEXT :
+ ((msg == CB_GETLBTEXTLEN) ? CB_GETLBTEXT : LB_GETTEXT);
+ /* wParam differs between the messages */
+ WPARAM wp = (msg == WM_GETTEXTLENGTH) ? len : wParam;
+
+ if (!(ptr = get_buffer( buffer, sizeof(buffer), len * sizeof(WCHAR) ))) break;
+
+ if (callback == call_window_proc) /* FIXME: hack */
+ callback( hwnd, msgGetText, wp, (LPARAM)ptr, &tmp, arg );
+ else
+ tmp = SendMessageW( hwnd, msgGetText, wp, (LPARAM)ptr );
+ RtlUnicodeToMultiByteSize( &len, ptr, tmp * sizeof(WCHAR) );
+ *result = len;
+ free_buffer( buffer, ptr );
+ }
+ break;
+
default:
if( (unmap = WINPROC_MapMsg32ATo32W( hwnd, msg, &wParam, &lParam )) == -1) {
ERR_(msg)("Message translation failed. (msg=%s,wp=%08x,lp=%08lx)\n",