Alexandre Julliard : user: Added fast W->
A mapping for LB_GETTEXT and CB_GETLBTEXT.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 18 09:43:54 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: b34521c43d364410c52b01c40986662936937c1e
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b34521c43d364410c52b01c40986662936937c1e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu May 18 12:17:44 2006 +0200
user: Added fast W->A mapping for LB_GETTEXT and CB_GETLBTEXT.
---
dlls/user/winproc.c | 88 +++++++++++++++++++++++----------------------------
1 files changed, 40 insertions(+), 48 deletions(-)
diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index fe9905b..d4b0db5 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -992,28 +992,6 @@ static INT WINPROC_MapMsg32WTo32A( HWND
{
switch(msg)
{
-/* Listbox */
- case LB_GETTEXT: /* FIXME: fixed sized buffer */
- { if ( WINPROC_TestLBForStr( hwnd ))
- { LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0, 512 + sizeof(LPARAM) );
- if (!ptr) return -1;
- *ptr++ = *plparam; /* Store previous lParam */
- *plparam = (LPARAM)ptr;
- }
- }
- return 1;
-
-/* Combobox */
- case CB_GETLBTEXT: /* FIXME: fixed sized buffer */
- { if ( WINPROC_TestCBForStr( hwnd ))
- { LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0, 512 + sizeof(LPARAM) );
- if (!ptr) return -1;
- *ptr++ = *plparam; /* Store previous lParam */
- *plparam = (LPARAM)ptr;
- }
- }
- return 1;
-
/* Multiline edit */
case EM_GETLINE:
{ WORD len = (WORD)*plparam;
@@ -1071,32 +1049,6 @@ static LRESULT WINPROC_UnmapMsg32WTo32A(
{
switch(msg)
{
-/* Listbox */
- case LB_GETTEXT:
- if ( WINPROC_TestLBForStr( hwnd ))
- {
- LPARAM *ptr = (LPARAM *)lParam - 1;
- if (result >= 0)
- result = MultiByteToWideChar( CP_ACP, 0, (LPSTR)lParam, -1, (LPWSTR)*ptr, 0x7fffffff ) - 1;
- HeapFree( GetProcessHeap(), 0, ptr );
- }
- break;
-
-/* Combobox */
- case CB_GETLBTEXT:
- if ( result < 0) /* CB_ERR and CB_ERRSPACE */
- {
- LPARAM *ptr = (LPARAM *)lParam - 1;
- HeapFree( GetProcessHeap(), 0, ptr );
- }
- else if ( WINPROC_TestCBForStr( hwnd ))
- {
- LPARAM *ptr = (LPARAM *)lParam - 1;
- result = MultiByteToWideChar( CP_ACP, 0, (LPSTR)lParam, -1, (LPWSTR)*ptr, 0x7fffffff ) - 1;
- HeapFree( GetProcessHeap(), 0, ptr );
- }
- break;
-
/* Multiline edit */
case EM_GETLINE:
{
@@ -3019,6 +2971,26 @@ static LRESULT WINPROC_CallProc32WTo32A(
ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
break;
+ case LB_GETTEXT:
+ if (lParam && WINPROC_TestLBForStr( hwnd ))
+ {
+ char buffer[512]; /* FIXME: fixed sized buffer */
+ LRESULT result;
+
+ ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, (LPARAM)buffer );
+ result = dialog ? GetWindowLongPtrW( hwnd, DWLP_MSGRESULT ) : ret;
+ if (result >= 0)
+ {
+ DWORD len;
+ RtlMultiByteToUnicodeN( (LPWSTR)lParam, ~0u, &len, buffer, strlen(buffer) + 1 );
+ result = len / sizeof(WCHAR) - 1;
+ if (dialog) SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
+ else ret = result;
+ }
+ }
+ else ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
+ break;
+
/* Combobox */
case CB_ADDSTRING:
case CB_INSERTSTRING:
@@ -3029,6 +3001,26 @@ static LRESULT WINPROC_CallProc32WTo32A(
ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
break;
+ case CB_GETLBTEXT:
+ if (lParam && WINPROC_TestCBForStr( hwnd ))
+ {
+ char buffer[512]; /* FIXME: fixed sized buffer */
+ LRESULT result;
+
+ ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, (LPARAM)buffer );
+ result = dialog ? GetWindowLongPtrW( hwnd, DWLP_MSGRESULT ) : ret;
+ if (result >= 0)
+ {
+ DWORD len;
+ RtlMultiByteToUnicodeN( (LPWSTR)lParam, ~0u, &len, buffer, strlen(buffer) + 1 );
+ result = len / sizeof(WCHAR) - 1;
+ if (dialog) SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
+ else ret = result;
+ }
+ }
+ else ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
+ break;
+
default:
if ((unmap = WINPROC_MapMsg32WTo32A( hwnd, msg, &wParam, &lParam )) == -1) {
ERR_(msg)("Message translation failed. (msg=%s,wp=%08x,lp=%08lx)\n",
More information about the wine-cvs
mailing list