user: Get rid of the WINPROC_Map/UnmapMsg32ATo32W functions.

This commit is contained in:
Alexandre Julliard 2006-05-20 20:02:10 +02:00
parent 3d92de45c4
commit fcce047f61

View File

@ -500,31 +500,6 @@ static LRESULT call_dialog_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, LRES
return ret; return ret;
} }
/**********************************************************************
* WINPROC_CallWndProc32
*
* Call a 32-bit WndProc.
*/
static LRESULT WINPROC_CallWndProc( WNDPROC proc, HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam )
{
LRESULT retvalue;
USER_CheckNotLock();
hwnd = WIN_GetFullHandle( hwnd );
if (TRACE_ON(relay))
DPRINTF( "%04lx:Call window proc %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
GetCurrentThreadId(), proc, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam );
retvalue = WINPROC_wrapper( proc, hwnd, msg, wParam, lParam );
if (TRACE_ON(relay))
DPRINTF( "%04lx:Ret window proc %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx) retval=%08lx\n",
GetCurrentThreadId(), proc, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam, retvalue );
return retvalue;
}
/* call a 16-bit window procedure */ /* call a 16-bit window procedure */
static LRESULT call_window_proc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam, static LRESULT call_window_proc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam,
LRESULT *result, void *arg ) LRESULT *result, void *arg )
@ -728,120 +703,6 @@ inline static BOOL WINPROC_TestLBForStr( HWND hwnd, UINT msg )
return (!(style & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) || (style & LBS_HASSTRINGS)); return (!(style & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) || (style & LBS_HASSTRINGS));
} }
/**********************************************************************
* WINPROC_MapMsg32ATo32W
*
* Map a message from Ansi to Unicode.
* Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
*
* FIXME:
* WM_GETTEXT/WM_SETTEXT and static control with SS_ICON style:
* the first four bytes are the handle of the icon
* when the WM_SETTEXT message has been used to set the icon
*/
static INT WINPROC_MapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM *pwparam, LPARAM *plparam )
{
switch(msg)
{
case WM_GETTEXT:
case WM_ASKCBFORMATNAME:
{
LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0,
*pwparam * sizeof(WCHAR) + sizeof(LPARAM) );
if (!ptr) return -1;
*ptr++ = *plparam; /* Store previous lParam */
*plparam = (LPARAM)ptr;
}
return 1;
/* lparam is string (0-terminated) */
case WM_SETTEXT:
case WM_WININICHANGE:
case WM_DEVMODECHANGE:
case CB_DIR:
case LB_DIR:
case LB_ADDFILE:
case EM_REPLACESEL:
if (!*plparam) return 0;
else
{
DWORD len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*plparam, -1, NULL, 0);
WCHAR *buf = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*plparam, -1, buf, len);
*plparam = (LPARAM)buf;
return (*plparam ? 1 : -1);
}
default: /* No translation needed */
return 0;
}
}
/**********************************************************************
* WINPROC_UnmapMsg32ATo32W
*
* Unmap a message that was mapped from Ansi to Unicode.
*/
static LRESULT WINPROC_UnmapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
LRESULT result, WNDPROC dispatch )
{
switch(msg)
{
case WM_GETTEXT:
case WM_ASKCBFORMATNAME:
{
LPARAM *ptr = (LPARAM *)lParam - 1;
if (!wParam) result = 0;
else if (!(result = WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1,
(LPSTR)*ptr, wParam, NULL, NULL )))
{
((LPSTR)*ptr)[wParam-1] = 0;
result = wParam - 1;
}
else result--; /* do not count terminating null */
HeapFree( GetProcessHeap(), 0, ptr );
}
break;
case WM_GETTEXTLENGTH:
case CB_GETLBTEXTLEN:
case LB_GETTEXTLEN:
if (result >= 0)
{
/* 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) ? (WPARAM)(result + 1) : wParam;
WCHAR* p = HeapAlloc (GetProcessHeap(), 0, (result + 1) * sizeof(WCHAR));
if (p)
{
LRESULT n;
if (dispatch)
n = WINPROC_CallWndProc(dispatch, hwnd, msgGetText, wp, (LPARAM)p);
else
n = SendMessageW (hwnd, msgGetText, wp, (LPARAM)p);
result = WideCharToMultiByte( CP_ACP, 0, p, n, NULL, 0, 0, NULL );
HeapFree (GetProcessHeap(), 0, p);
}
}
break;
case WM_SETTEXT:
case WM_WININICHANGE:
case WM_DEVMODECHANGE:
case CB_DIR:
case LB_DIR:
case LB_ADDFILE:
case EM_REPLACESEL:
HeapFree( GetProcessHeap(), 0, (void *)lParam );
break;
}
return result;
}
static UINT convert_handle_16_to_32(HANDLE16 src, unsigned int flags) static UINT convert_handle_16_to_32(HANDLE16 src, unsigned int flags)
@ -1340,17 +1201,6 @@ static INT WINPROC_MapMsg16To32W( HWND hwnd, UINT16 msg16, WPARAM16 wParam16, UI
*pwparam32 = (WPARAM)wParam16; *pwparam32 = (WPARAM)wParam16;
switch(msg16) switch(msg16)
{ {
case WM_GETTEXT:
case WM_SETTEXT:
case WM_WININICHANGE:
case WM_DEVMODECHANGE:
case WM_ASKCBFORMATNAME:
*plparam = (LPARAM)MapSL(*plparam);
return WINPROC_MapMsg32ATo32W( hwnd, *pmsg32, pwparam32, plparam );
case WM_GETTEXTLENGTH:
case CB_GETLBTEXTLEN:
case LB_GETTEXTLEN:
return 1; /* need to map result */
case WM_NCCREATE: case WM_NCCREATE:
case WM_CREATE: case WM_CREATE:
{ {
@ -1452,17 +1302,10 @@ static INT WINPROC_MapMsg16To32W( HWND hwnd, UINT16 msg16, WPARAM16 wParam16, UI
* Unmap a message that was mapped from 16- to 32-bit Unicode. * Unmap a message that was mapped from 16- to 32-bit Unicode.
*/ */
static LRESULT WINPROC_UnmapMsg16To32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, static LRESULT WINPROC_UnmapMsg16To32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
LRESULT result, WNDPROC dispatch ) LRESULT result )
{ {
switch(msg) switch(msg)
{ {
case WM_GETTEXT:
case WM_SETTEXT:
case WM_GETTEXTLENGTH:
case CB_GETLBTEXTLEN:
case LB_GETTEXTLEN:
case WM_ASKCBFORMATNAME:
return WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam, result, dispatch );
case WM_NCCREATE: case WM_NCCREATE:
case WM_CREATE: case WM_CREATE:
{ {
@ -2996,12 +2839,32 @@ static LRESULT WINPROC_CallProc16To32W( winproc_callback_t callback, HWND16 hwnd
TRACE_(msg)("(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n", TRACE_(msg)("(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
hwnd32, SPY_GetMsgName(msg, hwnd32), wParam, lParam); hwnd32, SPY_GetMsgName(msg, hwnd32), wParam, lParam);
if (WINPROC_MapMsg16To32W( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1) switch(msg)
return 0; {
case WM_GETTEXT:
case WM_ASKCBFORMATNAME:
case WM_SETTEXT:
case WM_WININICHANGE:
case WM_DEVMODECHANGE:
case CB_DIR:
case LB_DIR:
case LB_ADDFILE:
case EM_REPLACESEL:
ret = WINPROC_CallProcAtoW( callback, hwnd32, msg, wParam, (LPARAM)MapSL(lParam), result, arg );
break;
ret = callback( hwnd32, msg32, wParam32, lParam, result, arg ); case WM_GETTEXTLENGTH:
*result = WINPROC_UnmapMsg16To32W( hwnd32, msg32, wParam32, lParam, *result, case CB_GETLBTEXTLEN:
(callback == call_window_proc) ? arg : NULL /*FIXME: hack*/ ); case LB_GETTEXTLEN:
ret = WINPROC_CallProcAtoW( callback, hwnd32, msg, wParam, lParam, result, arg );
break;
default:
if (WINPROC_MapMsg16To32W( hwnd32, msg, wParam, &msg32, &wParam32, &lParam ) == -1)
return 0;
ret = callback( hwnd32, msg32, wParam32, lParam, result, arg );
*result = WINPROC_UnmapMsg16To32W( hwnd32, msg32, wParam32, lParam, *result );
}
return ret; return ret;
} }