Release 960902
Sun Sep 1 19:22:46 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [misc/commdlg.c] [if1632/commdlg.spec]
Fixed some SEGPTR problems.
* [windows/winproc.c]
Added message translation for WM_COMPAREITEM, WM_DELETEITEM
and WM_MEASUREITEM
Fixed 16-to-32 translation for WM_HSCROLL/WM_VSCROLL.
Fri Aug 30 13:39:00 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [files/drive.c]
GetDriveType16 should report CDROMs as DRIVE_REMOTE (ACME setup).
* [multimedia/audio.c]
The minimum audiobuffer size shrunk somewhere in linux 1.3.xx
below 4096 bytes.
* [multimedia/mcistring.c]
Segptr string handling fixed & enhanced.
* [if1632/crtdll.spec][misc/crtdll.c]
malloc,free,_strupr,_stricmp,_strcmpi added.
* [if1632/wsock32.spec][misc/winsock.c]
More direct thunks into unix libc and WsControl-stub added.
Thu Aug 29 23:54:25 1996 Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>
* [objects/metafile.c]
Bug fixes to both recording and playback of ExtTextOut().
Tue Aug 27 15:43:21 1996 Slaven Rezic <eserte@cs.tu-berlin.de>
* [multimedia/audio.c] [multimedia/mcianim.c]
[multimedia/mcicda.c] [multimedia/midi.c]
Made cdaudio, audio and midi work for FreeBSD.
Sun Aug 25 20:18:56 1996 Jukka Iivonen <iivonen@cc.helsinki.fi>
* [misc/crtdll.c] [if1632/crtdll.spec]
Added a lot of functions.
* [misc/ole2nls.c]
Added ID values for all languages in GetUserDefaultLCID().
Fri Aug 24 21:02:28 1996 Albrecht Kleine <kleine@ak.sax.de>
* [windows/event.c] [windows/message.c]
First attempt at hook WH_JOURNALPLAYBACK.
diff --git a/windows/defwnd.c b/windows/defwnd.c
index f67c44c..b79fa4b 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -186,7 +186,7 @@
{
if( wndPtr->flags & WIN_NCACTIVATED )
{
- FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
+ FillWindow( GetParent16(wndPtr->hwndSelf), wndPtr->hwndSelf,
(HDC)wParam, sysColorObjects.hbrushActiveCaption );
return 1;
}
@@ -199,11 +199,11 @@
{
HBRUSH hbrush = CreateSolidBrush(
GetSysColor(((DWORD)wndPtr->class->hbrBackground)-1));
- FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
+ FillWindow( GetParent16(wndPtr->hwndSelf), wndPtr->hwndSelf,
(HDC)wParam, hbrush);
DeleteObject (hbrush);
}
- else FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
+ else FillWindow( GetParent16(wndPtr->hwndSelf), wndPtr->hwndSelf,
(HDC)wParam, wndPtr->class->hbrBackground );
return 1;
}
diff --git a/windows/event.c b/windows/event.c
index c59b378..fb32363 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -174,15 +174,18 @@
{
case KeyPress:
case KeyRelease:
- EVENT_key( (XKeyEvent*)event );
+ if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
+ EVENT_key( (XKeyEvent*)event );
break;
case ButtonPress:
- EVENT_ButtonPress( (XButtonEvent*)event );
+ if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
+ EVENT_ButtonPress( (XButtonEvent*)event );
break;
case ButtonRelease:
- EVENT_ButtonRelease( (XButtonEvent*)event );
+ if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
+ EVENT_ButtonRelease( (XButtonEvent*)event );
break;
case MotionNotify:
@@ -194,9 +197,12 @@
problems if the event order is important. I'm not yet seen
of any problems. Jon 7/6/96.
*/
- while (XCheckTypedWindowEvent(display, ((XAnyEvent *)event)->window,
- MotionNotify, event));
- EVENT_MotionNotify( (XMotionEvent*)event );
+ if (!HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
+ {
+ while (XCheckTypedWindowEvent(display,((XAnyEvent *)event)->window,
+ MotionNotify, event));
+ EVENT_MotionNotify( (XMotionEvent*)event );
+ }
break;
case FocusIn:
diff --git a/windows/mdi.c b/windows/mdi.c
index 96307bf..9dc0890 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -227,7 +227,7 @@
if (!fRefresh)
{
- HWND hwndFrame = GetParent(hwnd);
+ HWND hwndFrame = GetParent16(hwnd);
HMENU oldFrameMenu = GetMenu(hwndFrame);
if( ci->hwndChildMaximized && hmenuFrame && hmenuFrame!=oldFrameMenu )
@@ -504,7 +504,7 @@
if (flagDestroy)
{
- MDI_PostUpdate(GetParent(child), ci, SB_BOTH+1);
+ MDI_PostUpdate(GetParent16(child), ci, SB_BOTH+1);
DestroyWindow(child);
}
}
@@ -1329,7 +1329,7 @@
MDICLIENTINFO *ci;
WND *clientWnd;
- clientWnd = WIN_FindWndPtr(GetParent(hwnd));
+ clientWnd = WIN_FindWndPtr(GetParent16(hwnd));
ci = (MDICLIENTINFO *) clientWnd->wExtra;
switch (message)
@@ -1471,7 +1471,7 @@
MDICLIENTINFO *ci;
WND *clientWnd;
- clientWnd = WIN_FindWndPtr(GetParent(hwnd));
+ clientWnd = WIN_FindWndPtr(GetParent16(hwnd));
ci = (MDICLIENTINFO *) clientWnd->wExtra;
switch (message)
@@ -1523,7 +1523,7 @@
MDICLIENTINFO *ci;
WND *clientWnd;
- clientWnd = WIN_FindWndPtr(GetParent(hwnd));
+ clientWnd = WIN_FindWndPtr(GetParent16(hwnd));
ci = (MDICLIENTINFO *) clientWnd->wExtra;
switch (message)
diff --git a/windows/message.c b/windows/message.c
index 4624478..b61ecb3 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -6,6 +6,7 @@
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#include <sys/time.h>
#include <sys/types.h>
@@ -31,8 +32,13 @@
#define HWND_BROADCAST16 ((HWND16)0xffff)
#define HWND_BROADCAST32 ((HWND32)0xffffffff)
-extern BYTE* KeyStateTable; /* event.c */
+#define ASCII_CHAR_HACK 0x0800
+
extern WPARAM lastEventChar; /* event.c */
+extern BOOL MouseButtonsStates[3];
+extern BOOL AsyncMouseButtonsStates[3];
+extern BYTE KeyStateTable[256];
+extern BYTE AsyncKeyStateTable[256];
DWORD MSG_WineStartTicks; /* Ticks at Wine startup */
@@ -263,8 +269,8 @@
HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0,
(LPARAM)SEGPTR_GET(event) );
}
- else if ((msg->message >= WM_NCMOUSEMOVE) &&
- (msg->message <= WM_NCMBUTTONDBLCLK))
+ else if ((msg->message >= WM_NCMOUSEFIRST) &&
+ (msg->message <= WM_NCMOUSELAST))
{
event->paramL = LOWORD(msg->lParam); /* X pos */
event->paramH = HIWORD(msg->lParam); /* Y pos */
@@ -275,6 +281,108 @@
SEGPTR_FREE(event);
}
+/*****************************************************************
+ * MSG_JournalPlayBackIsAscii
+ */
+static BOOL MSG_JournalPlayBackIsAscii(WPARAM wParam)
+{
+ return ((wParam>VK_HELP && wParam<VK_F1) ||
+ wParam == VK_SPACE ||
+ wParam == VK_ESCAPE ||
+ wParam == VK_RETURN ||
+ wParam == VK_TAB ||
+ wParam == VK_BACK);
+}
+
+
+/***********************************************************************
+ * MSG_JournalPlayBackMsg
+ *
+ * Get an EVENTMSG struct via call JOURNALPAYBACK hook function
+ */
+static int MSG_JournalPlayBackMsg(void)
+{
+ EVENTMSG16 *tmpMsg;
+ long wtime,lParam;
+ WORD keyDown,i,wParam,result=0;
+
+ if ( HOOK_GetHook(WH_JOURNALPLAYBACK, 0) )
+ {
+ tmpMsg = SEGPTR_NEW(EVENTMSG16);
+ wtime=HOOK_CallHooks( WH_JOURNALPLAYBACK, HC_GETNEXT, 0, (LPARAM)SEGPTR_GET(tmpMsg));
+ /* dprintf_msg(stddeb,"Playback wait time =%ld\n",wtime); */
+ if (wtime<=0)
+ {
+ wtime=0;
+ if ((tmpMsg->message>= WM_KEYFIRST) && (tmpMsg->message <= WM_KEYLAST))
+ {
+ wParam=tmpMsg->paramL & 0xFF;
+ lParam=MAKELONG(tmpMsg->paramH&0x7ffff,tmpMsg->paramL>>8);
+ if (tmpMsg->message == WM_KEYDOWN || tmpMsg->message == WM_SYSKEYDOWN)
+ {
+ for (keyDown=i=0; i<256 && !keyDown; i++)
+ if (KeyStateTable[i] & 0x80)
+ keyDown++;
+ if (!keyDown)
+ lParam |= 0x40000000;
+ AsyncKeyStateTable[wParam]=KeyStateTable[wParam] |= 0x80;
+ if (MSG_JournalPlayBackIsAscii(wParam))
+ {
+ lastEventChar= wParam; /* control TranslateMessage() */
+ lParam |= (LONG)((LONG)ASCII_CHAR_HACK*0x10000L);
+
+ if (!(KeyStateTable[VK_SHIFT] & 0x80) &&
+ !(KeyStateTable[VK_CAPITAL] & 0x80))
+ lastEventChar= tolower(lastEventChar);
+ if (KeyStateTable[VK_CONTROL] & 0x80)
+ lastEventChar&=0x1f;
+ }
+ }
+ else /* WM_KEYUP, WM_SYSKEYUP */
+ {
+ lParam |= 0xC0000000;
+ AsyncKeyStateTable[wParam]=KeyStateTable[wParam] &= ~0x80;
+ }
+ if (KeyStateTable[VK_MENU] & 0x80)
+ lParam |= 0x20000000;
+ if (tmpMsg->paramH & 0x8000) /*special_key bit*/
+ lParam |= 0x01000000;
+ hardware_event( tmpMsg->message, wParam, lParam,0, 0, tmpMsg->time, 0 );
+ }
+ else
+ {
+ if ((tmpMsg->message>= WM_MOUSEFIRST) && (tmpMsg->message <= WM_MOUSELAST))
+ {
+ switch (tmpMsg->message)
+ {
+ case WM_LBUTTONDOWN:MouseButtonsStates[0]=AsyncMouseButtonsStates[0]=1;break;
+ case WM_LBUTTONUP: MouseButtonsStates[0]=AsyncMouseButtonsStates[0]=0;break;
+ case WM_MBUTTONDOWN:MouseButtonsStates[1]=AsyncMouseButtonsStates[1]=1;break;
+ case WM_MBUTTONUP: MouseButtonsStates[1]=AsyncMouseButtonsStates[1]=0;break;
+ case WM_RBUTTONDOWN:MouseButtonsStates[2]=AsyncMouseButtonsStates[2]=1;break;
+ case WM_RBUTTONUP: MouseButtonsStates[2]=AsyncMouseButtonsStates[2]=0;break;
+ }
+ AsyncKeyStateTable[VK_LBUTTON]= KeyStateTable[VK_LBUTTON] = MouseButtonsStates[0] << 8;
+ AsyncKeyStateTable[VK_MBUTTON]= KeyStateTable[VK_MBUTTON] = MouseButtonsStates[1] << 8;
+ AsyncKeyStateTable[VK_RBUTTON]= KeyStateTable[VK_RBUTTON] = MouseButtonsStates[2] << 8;
+ SetCursorPos(tmpMsg->paramL,tmpMsg->paramH);
+ lParam=MAKELONG(tmpMsg->paramL,tmpMsg->paramH);
+ wParam=0;
+ if (MouseButtonsStates[0]) wParam |= MK_LBUTTON;
+ if (MouseButtonsStates[1]) wParam |= MK_MBUTTON;
+ if (MouseButtonsStates[2]) wParam |= MK_RBUTTON;
+ hardware_event( tmpMsg->message, wParam, lParam,
+ tmpMsg->paramL, tmpMsg->paramH, tmpMsg->time, 0 );
+ }
+ }
+ HOOK_CallHooks( WH_JOURNALPLAYBACK, HC_SKIP, 0, (LPARAM)SEGPTR_GET(tmpMsg));
+ }
+ else
+ result= QS_MOUSE | QS_KEY;
+ SEGPTR_FREE(tmpMsg);
+ }
+ return result;
+}
/***********************************************************************
* MSG_PeekHardwareMsg
@@ -490,6 +598,8 @@
break;
}
+ msgQueue->changeBits |= MSG_JournalPlayBackMsg();
+
/* Now find a hardware event */
if (((msgQueue->wakeBits & mask) & (QS_MOUSE | QS_KEY)) &&
@@ -909,7 +1019,6 @@
* This should call ToAscii but it is currently broken
*/
-#define ASCII_CHAR_HACK 0x0800
BOOL TranslateMessage( LPMSG16 msg )
{
diff --git a/windows/painting.c b/windows/painting.c
index 40f5dff..c1b3d09 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -219,7 +219,7 @@
*/
HBRUSH GetControlBrush( HWND hwnd, HDC hdc, WORD control )
{
- return (HBRUSH)SendMessage32A( GetParent(hwnd), WM_CTLCOLOR+control,
+ return (HBRUSH)SendMessage32A( GetParent32(hwnd), WM_CTLCOLOR+control,
(WPARAM)hdc, (LPARAM)hwnd );
}
diff --git a/windows/syscolor.c b/windows/syscolor.c
index 3c3ddee..11f1ccd 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -145,10 +145,10 @@
/*************************************************************************
- * GetSysColor (USER.180)
+ * GetSysColor (USER.180) (USER32.288)
*/
-COLORREF GetSysColor(short nIndex)
+COLORREF GetSysColor( INT32 nIndex )
{
dprintf_syscolor(stddeb,"System Color %d = %8lx\n",
nIndex, SysColors[nIndex]);
diff --git a/windows/win.c b/windows/win.c
index cbca5aa..626b35f 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -1473,9 +1473,18 @@
/*****************************************************************
- * GetParent (USER.46)
+ * GetParent16 (USER.46)
*/
-HWND GetParent(HWND hwnd)
+HWND16 GetParent16( HWND16 hwnd )
+{
+ return (HWND16)GetParent32( hwnd );
+}
+
+
+/*****************************************************************
+ * GetParent32 (USER32.277)
+ */
+HWND32 GetParent32( HWND32 hwnd )
{
WND *wndPtr = WIN_FindWndPtr(hwnd);
if (!wndPtr) return 0;
diff --git a/windows/winpos.c b/windows/winpos.c
index cfbb72e..ba64e4e 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -1832,7 +1832,7 @@
}
if ((winpos->hwnd == GetFocus()) || IsChild(winpos->hwnd, GetFocus()))
- SetFocus( GetParent(winpos->hwnd) ); /* Revert focus to parent */
+ SetFocus( GetParent32(winpos->hwnd) ); /* Revert focus to parent */
if (winpos->hwnd == hwndActive)
{
diff --git a/windows/winproc.c b/windows/winproc.c
index d1c89d7..8f2cc95 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -390,11 +390,8 @@
}
return 1;
case WM_ASKCBFORMATNAME:
- case WM_COMPAREITEM:
- case WM_DELETEITEM:
case WM_DEVMODECHANGE:
case WM_MDIACTIVATE:
- case WM_MEASUREITEM:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
case WM_WININICHANGE:
@@ -497,11 +494,8 @@
}
return 1;
case WM_ASKCBFORMATNAME:
- case WM_COMPAREITEM:
- case WM_DELETEITEM:
case WM_DEVMODECHANGE:
case WM_MDIACTIVATE:
- case WM_MEASUREITEM:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
case WM_WININICHANGE:
@@ -570,17 +564,67 @@
case WM_ACTIVATE:
case WM_CHARTOITEM:
case WM_COMMAND:
- case WM_HSCROLL:
case WM_VKEYTOITEM:
- case WM_VSCROLL:
*pwparam32 = MAKEWPARAM( wParam16, HIWORD(*plparam) );
*plparam = (LPARAM)(HWND32)LOWORD(*plparam);
return 0;
+ case WM_HSCROLL:
+ case WM_VSCROLL:
+ *pwparam32 = MAKEWPARAM( wParam16, LOWORD(*plparam) );
+ *plparam = (LPARAM)(HWND32)HIWORD(*plparam);
+ return 0;
case WM_CTLCOLOR:
*pmsg32 = WM_CTLCOLORMSGBOX + HIWORD(*plparam);
*pwparam32 = (WPARAM32)(HDC32)wParam16;
*plparam = (LPARAM)(HWND32)LOWORD(*plparam);
return 0;
+ case WM_COMPAREITEM:
+ {
+ COMPAREITEMSTRUCT16* cis16 = (COMPAREITEMSTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+ COMPAREITEMSTRUCT32 *cis = (COMPAREITEMSTRUCT32 *)
+ HeapAlloc(SystemHeap, 0, sizeof(*cis));
+ if (!cis) return -1;
+ cis->CtlType = cis16->CtlType;
+ cis->CtlID = cis16->CtlID;
+ cis->hwndItem = cis16->hwndItem;
+ cis->itemID1 = cis16->itemID1;
+ cis->itemData1 = cis16->itemData1;
+ cis->itemID2 = cis16->itemID2;
+ cis->itemData2 = cis16->itemData2;
+ cis->dwLocaleId = 0; /* FIXME */
+ *plparam = (LPARAM)cis;
+ }
+ return 1;
+ case WM_DELETEITEM:
+ {
+ DELETEITEMSTRUCT16* dis16 = (DELETEITEMSTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+ DELETEITEMSTRUCT32 *dis = (DELETEITEMSTRUCT32 *)
+ HeapAlloc(SystemHeap, 0, sizeof(*dis));
+ if (!dis) return -1;
+ dis->CtlType = dis16->CtlType;
+ dis->CtlID = dis16->CtlID;
+ dis->hwndItem = dis16->hwndItem;
+ dis->itemData = dis16->itemData;
+ *plparam = (LPARAM)dis;
+ }
+ return 1;
+ case WM_MEASUREITEM:
+ {
+ MEASUREITEMSTRUCT16* mis16 = (MEASUREITEMSTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+ MEASUREITEMSTRUCT32 *mis = (MEASUREITEMSTRUCT32 *)
+ HeapAlloc(SystemHeap, 0,
+ sizeof(*mis) + sizeof(LPARAM));
+ if (!mis) return -1;
+ mis->CtlType = mis16->CtlType;
+ mis->CtlID = mis16->CtlID;
+ mis->itemID = mis16->itemID;
+ mis->itemWidth = mis16->itemWidth;
+ mis->itemHeight = mis16->itemHeight;
+ mis->itemData = mis16->itemData;
+ *(LPARAM *)(mis + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)mis;
+ }
+ return 1;
case WM_DRAWITEM:
{
DRAWITEMSTRUCT16* dis16 = (DRAWITEMSTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
@@ -696,11 +740,8 @@
}
return 1;
case WM_ASKCBFORMATNAME:
- case WM_COMPAREITEM:
- case WM_DELETEITEM:
case WM_DEVMODECHANGE:
case WM_MDIACTIVATE:
- case WM_MEASUREITEM:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
case WM_WININICHANGE:
@@ -723,9 +764,22 @@
{
switch(msg)
{
+ case WM_COMPAREITEM:
+ case WM_DELETEITEM:
case WM_DRAWITEM:
HeapFree( SystemHeap, 0, (LPVOID)lParam );
break;
+ case WM_MEASUREITEM:
+ {
+ MEASUREITEMSTRUCT16 *mis16;
+ MEASUREITEMSTRUCT32 *mis = (MEASUREITEMSTRUCT32 *)lParam;
+ lParam = *(LPARAM *)(mis + 1);
+ mis16 = (MEASUREITEMSTRUCT16 *)PTR_SEG_TO_LIN(lParam);
+ mis16->itemWidth = (UINT16)mis->itemWidth;
+ mis16->itemHeight = (UINT16)mis->itemHeight;
+ HeapFree( SystemHeap, 0, mis );
+ }
+ break;
case WM_GETMINMAXINFO:
{
MINMAXINFO32 *mmi = (MINMAXINFO32 *)lParam;
@@ -931,6 +985,34 @@
*plparam = MAKELPARAM( (HWND16)*plparam,
(WORD)msg32 - WM_CTLCOLORMSGBOX );
return 0;
+ case WM_COMPAREITEM:
+ {
+ COMPAREITEMSTRUCT32 *cis32 = (COMPAREITEMSTRUCT32 *)*plparam;
+ COMPAREITEMSTRUCT16 *cis = SEGPTR_NEW(COMPAREITEMSTRUCT16);
+ if (!cis) return -1;
+ cis->CtlType = (UINT16)cis32->CtlType;
+ cis->CtlID = (UINT16)cis32->CtlID;
+ cis->hwndItem = (HWND16)cis32->hwndItem;
+ cis->itemID1 = (UINT16)cis32->itemID1;
+ cis->itemData1 = cis32->itemData1;
+ cis->itemID2 = (UINT16)cis32->itemID2;
+ cis->itemData2 = cis32->itemData2;
+ *plparam = (LPARAM)SEGPTR_GET(cis);
+ }
+ return 1;
+ case WM_DELETEITEM:
+ {
+ DELETEITEMSTRUCT32 *dis32 = (DELETEITEMSTRUCT32 *)*plparam;
+ DELETEITEMSTRUCT16 *dis = SEGPTR_NEW(DELETEITEMSTRUCT16);
+ if (!dis) return -1;
+ dis->CtlType = (UINT16)dis32->CtlType;
+ dis->CtlID = (UINT16)dis32->CtlID;
+ dis->itemID = (UINT16)dis32->itemID;
+ dis->hwndItem = (HWND16)dis32->hwndItem;
+ dis->itemData = dis32->itemData;
+ *plparam = (LPARAM)SEGPTR_GET(dis);
+ }
+ return 1;
case WM_DRAWITEM:
{
DRAWITEMSTRUCT32 *dis32 = (DRAWITEMSTRUCT32 *)*plparam;
@@ -948,6 +1030,22 @@
*plparam = (LPARAM)SEGPTR_GET(dis);
}
return 1;
+ case WM_MEASUREITEM:
+ {
+ MEASUREITEMSTRUCT32 *mis32 = (MEASUREITEMSTRUCT32 *)*plparam;
+ MEASUREITEMSTRUCT16 *mis = (MEASUREITEMSTRUCT16 *)
+ SEGPTR_ALLOC(sizeof(*mis)+sizeof(LPARAM));
+ if (!mis) return -1;
+ mis->CtlType = (UINT16)mis32->CtlType;
+ mis->CtlID = (UINT16)mis32->CtlID;
+ mis->itemID = (UINT16)mis32->itemID;
+ mis->itemWidth = (UINT16)mis32->itemWidth;
+ mis->itemHeight = (UINT16)mis32->itemHeight;
+ mis->itemData = mis32->itemData;
+ *(LPARAM *)(mis + 1) = *plparam; /* Store the previous lParam */
+ *plparam = (LPARAM)SEGPTR_GET(mis);
+ }
+ return 1;
case WM_GETMINMAXINFO:
{
MINMAXINFO16 *mmi = (MINMAXINFO16 *)SEGPTR_ALLOC( sizeof(*mmi) +
@@ -1055,11 +1153,8 @@
}
return 1;
case WM_ASKCBFORMATNAME:
- case WM_COMPAREITEM:
- case WM_DELETEITEM:
case WM_DEVMODECHANGE:
case WM_MDIACTIVATE:
- case WM_MEASUREITEM:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
case WM_WININICHANGE:
@@ -1082,9 +1177,20 @@
{
switch(msg)
{
+ case WM_COMPAREITEM:
+ case WM_DELETEITEM:
case WM_DRAWITEM:
SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) );
break;
+ case WM_MEASUREITEM:
+ {
+ MEASUREITEMSTRUCT16 *mis = (MEASUREITEMSTRUCT16 *)PTR_SEG_TO_LIN(lParam);
+ MEASUREITEMSTRUCT32 *mis32 = *(MEASUREITEMSTRUCT32 **)(mis + 1);
+ mis32->itemWidth = mis->itemWidth;
+ mis32->itemHeight = mis->itemHeight;
+ SEGPTR_FREE(mis);
+ }
+ break;
case WM_GETMINMAXINFO:
{
MINMAXINFO16 *mmi = (MINMAXINFO16 *)PTR_SEG_TO_LIN(lParam);