user: Added fast 16->32 mapping for WM_GETMINMAXINFO, WM_NCCALCSIZE and WM_WINDOWPOSCHANGING/CHANGED.

This commit is contained in:
Alexandre Julliard 2006-05-26 13:31:55 +02:00
parent b4d68ff9aa
commit 5940fb8c00
1 changed files with 60 additions and 94 deletions

View File

@ -287,6 +287,21 @@ static inline LRESULT WINPROC_wrapper( WNDPROC proc, HWND hwnd, UINT msg,
}
#endif /* __i386__ */
static void RECT16to32( const RECT16 *from, RECT *to )
{
to->left = from->left;
to->top = from->top;
to->right = from->right;
to->bottom = from->bottom;
}
static void RECT32to16( const RECT *from, RECT16 *to )
{
to->left = from->left;
to->top = from->top;
to->right = from->right;
to->bottom = from->bottom;
}
static void MINMAXINFO32to16( const MINMAXINFO *from, MINMAXINFO16 *to )
{
@ -755,15 +770,6 @@ static INT WINPROC_MapMsg16To32A( HWND hwnd, UINT16 msg16, WPARAM16 wParam16, UI
*plparam = (LPARAM)pcds;
}
return 1;
case WM_GETMINMAXINFO:
{
MINMAXINFO *mmi = HeapAlloc( GetProcessHeap(), 0, sizeof(*mmi) + sizeof(LPARAM));
if (!mmi) return -1;
MINMAXINFO16to32( MapSL(*plparam), mmi );
*(LPARAM *)(mmi + 1) = *plparam; /* Store the previous lParam */
*plparam = (LPARAM)mmi;
}
return 1;
case WM_GETTEXT:
case WM_SETTEXT:
case WM_WININICHANGE:
@ -804,35 +810,6 @@ static INT WINPROC_MapMsg16To32A( HWND hwnd, UINT16 msg16, WPARAM16 wParam16, UI
else /* message sent to MDI client */
*pwparam32 = wParam16;
return 0;
case WM_NCCALCSIZE:
{
NCCALCSIZE_PARAMS16 *nc16;
NCCALCSIZE_PARAMS *nc;
nc = HeapAlloc( GetProcessHeap(), 0, sizeof(*nc) + sizeof(LPARAM) );
if (!nc) return -1;
nc16 = MapSL(*plparam);
nc->rgrc[0].left = nc16->rgrc[0].left;
nc->rgrc[0].top = nc16->rgrc[0].top;
nc->rgrc[0].right = nc16->rgrc[0].right;
nc->rgrc[0].bottom = nc16->rgrc[0].bottom;
if (wParam16)
{
nc->lppos = HeapAlloc( GetProcessHeap(), 0, sizeof(*nc->lppos) );
nc->rgrc[1].left = nc16->rgrc[1].left;
nc->rgrc[1].top = nc16->rgrc[1].top;
nc->rgrc[1].right = nc16->rgrc[1].right;
nc->rgrc[1].bottom = nc16->rgrc[1].bottom;
nc->rgrc[2].left = nc16->rgrc[2].left;
nc->rgrc[2].top = nc16->rgrc[2].top;
nc->rgrc[2].right = nc16->rgrc[2].right;
nc->rgrc[2].bottom = nc16->rgrc[2].bottom;
if (nc->lppos) WINDOWPOS16to32( MapSL(nc16->lppos), nc->lppos );
}
*(LPARAM *)(nc + 1) = *plparam; /* Store the previous lParam */
*plparam = (LPARAM)nc;
}
return 1;
case WM_PARENTNOTIFY:
if ((wParam16 == WM_CREATE) || (wParam16 == WM_DESTROY))
{
@ -840,16 +817,6 @@ static INT WINPROC_MapMsg16To32A( HWND hwnd, UINT16 msg16, WPARAM16 wParam16, UI
*plparam = (LPARAM)WIN_Handle32( LOWORD(*plparam) );
}
return 0;
case WM_WINDOWPOSCHANGING:
case WM_WINDOWPOSCHANGED:
{
WINDOWPOS *wp = HeapAlloc( GetProcessHeap(), 0, sizeof(*wp) + sizeof(LPARAM) );
if (!wp) return -1;
WINDOWPOS16to32( MapSL(*plparam), wp );
*(LPARAM *)(wp + 1) = *plparam; /* Store the previous lParam */
*plparam = (LPARAM)wp;
}
return 1;
case WM_GETDLGCODE:
if (*plparam)
{
@ -969,56 +936,10 @@ static LRESULT WINPROC_UnmapMsg16To32A( HWND hwnd, UINT msg, WPARAM wParam, LPAR
case WM_COPYDATA:
HeapFree( GetProcessHeap(), 0, (LPVOID)lParam );
break;
case WM_GETMINMAXINFO:
{
MINMAXINFO *mmi = (MINMAXINFO *)lParam;
lParam = *(LPARAM *)(mmi + 1);
MINMAXINFO32to16( mmi, MapSL(lParam));
HeapFree( GetProcessHeap(), 0, mmi );
}
break;
case WM_MDIGETACTIVE:
result = MAKELONG( LOWORD(result), (BOOL16)(*(BOOL *)lParam) );
HeapFree( GetProcessHeap(), 0, (BOOL *)lParam );
break;
case WM_NCCALCSIZE:
{
NCCALCSIZE_PARAMS16 *nc16;
NCCALCSIZE_PARAMS *nc = (NCCALCSIZE_PARAMS *)lParam;
lParam = *(LPARAM *)(nc + 1);
nc16 = MapSL(lParam);
nc16->rgrc[0].left = nc->rgrc[0].left;
nc16->rgrc[0].top = nc->rgrc[0].top;
nc16->rgrc[0].right = nc->rgrc[0].right;
nc16->rgrc[0].bottom = nc->rgrc[0].bottom;
if (wParam)
{
nc16->rgrc[1].left = nc->rgrc[1].left;
nc16->rgrc[1].top = nc->rgrc[1].top;
nc16->rgrc[1].right = nc->rgrc[1].right;
nc16->rgrc[1].bottom = nc->rgrc[1].bottom;
nc16->rgrc[2].left = nc->rgrc[2].left;
nc16->rgrc[2].top = nc->rgrc[2].top;
nc16->rgrc[2].right = nc->rgrc[2].right;
nc16->rgrc[2].bottom = nc->rgrc[2].bottom;
if (nc->lppos)
{
WINDOWPOS32to16( nc->lppos, MapSL(nc16->lppos));
HeapFree( GetProcessHeap(), 0, nc->lppos );
}
}
HeapFree( GetProcessHeap(), 0, nc );
}
break;
case WM_WINDOWPOSCHANGING:
case WM_WINDOWPOSCHANGED:
{
WINDOWPOS *wp = (WINDOWPOS *)lParam;
lParam = *(LPARAM *)(wp + 1);
WINDOWPOS32to16(wp, MapSL(lParam));
HeapFree( GetProcessHeap(), 0, wp );
}
break;
case WM_GETDLGCODE:
if (lParam)
{
@ -2375,6 +2296,51 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1
MDICREATESTRUCT32Ato16( &cs, cs16 );
}
break;
case WM_GETMINMAXINFO:
{
MINMAXINFO16 *mmi16 = MapSL(lParam);
MINMAXINFO mmi;
MINMAXINFO16to32( mmi16, &mmi );
ret = callback( hwnd32, msg, wParam, (LPARAM)&mmi, result, arg );
MINMAXINFO32to16( &mmi, mmi16 );
}
break;
case WM_WINDOWPOSCHANGING:
case WM_WINDOWPOSCHANGED:
{
WINDOWPOS16 *winpos16 = MapSL(lParam);
WINDOWPOS winpos;
WINDOWPOS16to32( winpos16, &winpos );
ret = callback( hwnd32, msg, wParam, (LPARAM)&winpos, result, arg );
WINDOWPOS32to16( &winpos, winpos16 );
}
break;
case WM_NCCALCSIZE:
{
NCCALCSIZE_PARAMS16 *nc16 = MapSL(lParam);
NCCALCSIZE_PARAMS nc;
WINDOWPOS winpos;
RECT16to32( &nc16->rgrc[0], &nc.rgrc[0] );
if (wParam)
{
RECT16to32( &nc16->rgrc[1], &nc.rgrc[1] );
RECT16to32( &nc16->rgrc[2], &nc.rgrc[2] );
WINDOWPOS16to32( MapSL(nc16->lppos), &winpos );
nc.lppos = &winpos;
}
ret = callback( hwnd32, msg, wParam, (LPARAM)&nc, result, arg );
RECT32to16( &nc.rgrc[0], &nc16->rgrc[0] );
if (wParam)
{
RECT32to16( &nc.rgrc[1], &nc16->rgrc[1] );
RECT32to16( &nc.rgrc[2], &nc16->rgrc[2] );
WINDOWPOS32to16( &winpos, MapSL(nc16->lppos) );
}
}
break;
case WM_COMPAREITEM:
{
COMPAREITEMSTRUCT16* cis16 = MapSL(lParam);