Release 970215

Sat Feb 15 11:59:17 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [*/*]
	Converted a lot of functions to Win32 types.
	Removed HWND type.

Fri Feb 14 15:09:19 1997  Onno Hovers <onno@stack.nl>

	* [memory/global.c]
	Implemented GMEM_MOVEABLE blocks for Win32.

Fri Feb 14 00:24:39 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [loader/task.c] [windows/queue.c]
	Do not read X events while in the intertask SendMessage().

	* [misc/lstr.c]
	Fixed CharPrev32A().

	* [windows/hook.c] [include/hook.h]
	Restored broken WH_CALLWNDPROC functionality for dialogs, etc...

	* [windows/win.c] [windows/defwnd.c] [windows/mdi.c]
	  [windows/event.c] [controls/edit.c] 
	Added WIN_ISWIN32 flag to windows created by Win32 calls. 
	Several new Win32 messages are sent when this flag is on.
	
	* [msdos/dosmem.c] [memory/global.c]
	Some changes in DOS memory allocation.

Fri Feb  7 21:46:03 1997  Andrew Taylor  <andrew@riscan.com>

	* [win32/security.c]
	Added SID manipulation functions.

	* [include/debug.h]
	Added debugging class "security".

Fri  Feb 7 20:46:33 1997  Robert Pouliot <krynos@clic.net>

	* [debugger/msc.c] [debugger/source.c] 
	  [documentation/wine_os2.txt] [loader/signal.c]
	Some more changes for OS/2. Doesn't work yet.

Fri  Feb 7 09:31:17 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [scheduler/process.c]
	Added ExpandEnvironmentStrings*.

	* [misc/ntdll.c] [include/ntdll.h]
	Added some new functions.

	* [objects/cursoricon.c]
	CURSORICON_LoadHandler: check against some bizarre out of memory
	conditions.
	
	* [windows/mdi.c]
	Fixed DefFrameProc32*, added TranslateMDISysAccel32.

Wed Feb  5 01:31:05 1997  John Zero <john@globe.graphisoft.hu>

	* [resources/sysres_Hu.rc] [misc/ole2nls.c] [misc/main.c]
	  [programs/progman/Hu.rc] [programs/winhelp/Hu.rc]
	Added Hungarian language support.
diff --git a/windows/win.c b/windows/win.c
index 5d96ee1..da44073 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -38,7 +38,7 @@
 /* Desktop window */
 static WND *pWndDesktop = NULL;
 
-static HWND hwndSysModal = 0;
+static HWND32 hwndSysModal = 0;
 
 static WORD wDragWidth = 4;
 static WORD wDragHeight= 3;
@@ -47,6 +47,7 @@
 extern HWND32 CARET_GetHwnd(void);
 extern BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd);
 extern void   WINPOS_CheckActive(HWND32);
+extern BOOL32 EVENT_CheckFocus(void);
 
 /***********************************************************************
  *           WIN_FindWndPtr
@@ -224,7 +225,7 @@
  */
 HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue )
 {
-    HWND hwndRet;
+    HWND32 hwndRet;
     WND *pWnd = pWndDesktop;
 
     /* Note: the desktop window never gets WM_PAINT messages 
@@ -306,9 +307,9 @@
  *
  * Destroy storage associated to a window. "Internals" p.358
  */
-static void WIN_DestroyWindow( WND* wndPtr )
+static WND* WIN_DestroyWindow( WND* wndPtr )
 {
-    HWND hwnd = wndPtr->hwndSelf;
+    HWND32 hwnd = wndPtr->hwndSelf;
     WND *pWnd;
 
     dprintf_win( stddeb, "WIN_DestroyWindow: %04x\n", wndPtr->hwndSelf );
@@ -321,11 +322,7 @@
     /* free child windows */
 
     while ((pWnd = wndPtr->child))
-    {
-        /* Make sure the linked list remains coherent */
-        wndPtr->child = pWnd->next;
-        WIN_DestroyWindow( pWnd );
-    }
+        wndPtr->child = WIN_DestroyWindow( pWnd );
 
     SendMessage32A( wndPtr->hwndSelf, WM_NCDESTROY, 0, 0);
 
@@ -370,8 +367,10 @@
 
     wndPtr->class->cWindows--;
     wndPtr->class = NULL;
+    pWnd = wndPtr->next;
 
     USER_HEAP_FREE( hwnd );
+    return pWnd;
 }
 
 /***********************************************************************
@@ -400,7 +399,7 @@
 BOOL32 WIN_CreateDesktopWindow(void)
 {
     CLASS *class;
-    HWND hwndDesktop;
+    HWND32 hwndDesktop;
 
     dprintf_win(stddeb,"Creating desktop window\n");
 
@@ -460,14 +459,14 @@
  *
  * Implementation of CreateWindowEx().
  */
-static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
-                                BOOL unicode )
+static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
+                                  BOOL32 win32, BOOL32 unicode )
 {
     CLASS *classPtr;
     WND *wndPtr;
     HWND16 hwnd, hwndLinkAfter;
     POINT16 maxSize, maxPos, minTrack, maxTrack;
-    LRESULT wmcreate;
+    LRESULT (*localSend32)(HWND32, UINT32, WPARAM32, LPARAM);
 
     dprintf_win( stddeb, "CreateWindowEx: " );
     if (HIWORD(cs->lpszName)) dprintf_win( stddeb, "'%s' ", cs->lpszName );
@@ -566,7 +565,7 @@
     wndPtr->dwStyle        = cs->style & ~WS_VISIBLE;
     wndPtr->dwExStyle      = cs->dwExStyle;
     wndPtr->wIDmenu        = 0;
-    wndPtr->flags          = 0;
+    wndPtr->flags          = win32 ? WIN_ISWIN32 : 0;
     wndPtr->pVScroll       = NULL;
     wndPtr->pHScroll       = NULL;
     wndPtr->pProp          = NULL;
@@ -585,9 +584,7 @@
 
 	cbtc.lpcs = cs;
 	cbtc.hwndInsertAfter = hwndLinkAfter;
-	wmcreate = !HOOK_CallHooks32A( WH_CBT, HCBT_CREATEWND, hwnd,
-				       (LPARAM)&cbtc );
-	if (!wmcreate)
+	if ( HOOK_CallHooks32A(WH_CBT, HCBT_CREATEWND, hwnd, (LPARAM)&cbtc) )
 	{
 	    dprintf_win(stddeb, "CreateWindowEx: CBT-hook returned 0\n");
 	    USER_HEAP_FREE( hwnd );
@@ -726,85 +723,70 @@
      */
 
     maxPos.x = wndPtr->rectWindow.left; maxPos.y = wndPtr->rectWindow.top;
-    if (unicode)
+
+    localSend32 = unicode ? SendMessage32W : SendMessage32A;
+    if( (*localSend32)( hwnd, WM_NCCREATE, 0, (LPARAM)cs) )
     {
-        if (!SendMessage32W( hwnd, WM_NCCREATE, 0, (LPARAM)cs)) wmcreate = -1;
-        else
-        {
-            WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
-                                   NULL, NULL, 0, &wndPtr->rectClient );
-	    OffsetRect16(&wndPtr->rectWindow, maxPos.x - wndPtr->rectWindow.left,
-					    maxPos.y - wndPtr->rectWindow.top);
-            wmcreate = SendMessage32W( hwnd, WM_CREATE, 0, (LPARAM)cs );
-        }
-    }
-    else
-    {
-        if (!SendMessage32A( hwnd, WM_NCCREATE, 0, (LPARAM)cs)) wmcreate = -1;
-        else
-        {
-            WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
-                                   NULL, NULL, 0, &wndPtr->rectClient );
-            OffsetRect16(&wndPtr->rectWindow, maxPos.x - wndPtr->rectWindow.left,
+        WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
+                               NULL, NULL, 0, &wndPtr->rectClient );
+        OffsetRect16(&wndPtr->rectWindow, maxPos.x - wndPtr->rectWindow.left,
                                             maxPos.y - wndPtr->rectWindow.top);
-            wmcreate = SendMessage32A( hwnd, WM_CREATE, 0, (LPARAM)cs );
+        if( ((*localSend32)( hwnd, WM_CREATE, 0, (LPARAM)cs )) != -1 )
+        {
+            /* Send the size messages */
+
+            if (!(wndPtr->flags & WIN_NEED_SIZE))
+            {
+                /* send it anyway */
+                SendMessage16( hwnd, WM_SIZE, SIZE_RESTORED,
+                        MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
+                        wndPtr->rectClient.bottom-wndPtr->rectClient.top));
+                SendMessage16( hwnd, WM_MOVE, 0, MAKELONG( wndPtr->rectClient.left,
+                                                   wndPtr->rectClient.top ));
+            }
+
+            WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LPARAM)hwnd );
+            if (!IsWindow(hwnd)) return 0;
+
+            /* Show the window, maximizing or minimizing if needed */
+
+            if (wndPtr->dwStyle & WS_MINIMIZE)
+            {
+                /* MinMaximize(hwnd, SW_SHOWMINNOACTIVE, 1) in "Internals" */
+
+                wndPtr->dwStyle &= ~WS_MAXIMIZE;
+                WINPOS_FindIconPos( hwnd );
+                SetWindowPos32( hwnd, 0, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
+                        SYSMETRICS_CXICON, SYSMETRICS_CYICON,
+                        SWP_FRAMECHANGED | ((GetActiveWindow32())? SWP_NOACTIVATE : 0)  );
+            }
+            else if (wndPtr->dwStyle & WS_MAXIMIZE)
+            {
+                /* MinMaximize(hwnd, SW_SHOWMAXIMIZED, 1) */
+
+                NC_GetMinMaxInfo( wndPtr, &maxSize, &maxPos, &minTrack, &maxTrack );
+                SetWindowPos32( hwnd, 0, maxPos.x, maxPos.y, maxSize.x, maxSize.y,
+                    ((GetActiveWindow32())? SWP_NOACTIVATE : 0) | SWP_FRAMECHANGED );
+            }
+
+            if (cs->style & WS_VISIBLE) ShowWindow32( hwnd, SW_SHOW );
+
+            /* Call WH_SHELL hook */
+
+            if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
+                HOOK_CallHooks16( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 );
+
+            dprintf_win(stddeb, "CreateWindowEx: created window %04x\n", hwnd);
+            return hwnd;
         }
     }
-    
-    if (wmcreate == -1)
-    {
-	  /* Abort window creation */
-	dprintf_win(stddeb,"CreateWindowEx: wmcreate==-1, aborting\n");
-        WIN_UnlinkWindow( hwnd );
-        WIN_DestroyWindow( wndPtr );
-	return 0;
-    }
 
-    /* Send the size messages */
+    /* Abort window creation */
 
-    if (!(wndPtr->flags & WIN_NEED_SIZE))
-    {
-	/* send it anyway */
-	SendMessage16( hwnd, WM_SIZE, SIZE_RESTORED,
-                   MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
-                            wndPtr->rectClient.bottom-wndPtr->rectClient.top));
-        SendMessage16( hwnd, WM_MOVE, 0, MAKELONG( wndPtr->rectClient.left,
-                                                   wndPtr->rectClient.top ));
-    } 
-
-    WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LPARAM)hwnd );
-    if (!IsWindow(hwnd)) return 0;
-
-    /* Show the window, maximizing or minimizing if needed */
-
-    if (wndPtr->dwStyle & WS_MINIMIZE)
-    {
-	/* MinMaximize(hwnd, SW_SHOWMINNOACTIVE, 1) in "Internals" */
-
-        wndPtr->dwStyle &= ~WS_MAXIMIZE;
-        WINPOS_FindIconPos( hwnd );
-        SetWindowPos32( hwnd, 0, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
-                        SYSMETRICS_CXICON, SYSMETRICS_CYICON, 
-                        SWP_FRAMECHANGED | ((GetActiveWindow32())? SWP_NOACTIVATE : 0)  );
-    }
-    else if (wndPtr->dwStyle & WS_MAXIMIZE)
-    {
-	/* MinMaximize(hwnd, SW_SHOWMAXIMIZED, 1) */
-
-        NC_GetMinMaxInfo( wndPtr, &maxSize, &maxPos, &minTrack, &maxTrack );
-        SetWindowPos32( hwnd, 0, maxPos.x, maxPos.y, maxSize.x, maxSize.y,
-            ((GetActiveWindow32())? SWP_NOACTIVATE : 0) | SWP_FRAMECHANGED );
-    }
-    
-    if (cs->style & WS_VISIBLE) ShowWindow32( hwnd, SW_SHOW );
-
-    /* Call WH_SHELL hook */
-
-    if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
-        HOOK_CallHooks16( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 );
-
-    dprintf_win(stddeb, "CreateWindowEx: returning %04x\n", hwnd);
-    return hwnd;
+    dprintf_win(stddeb,"CreateWindowEx: aborted by WM_xxCREATE!\n");
+    WIN_UnlinkWindow( hwnd );
+    WIN_DestroyWindow( wndPtr );
+    return 0;
 }
 
 
@@ -859,7 +841,7 @@
     cs.lpszName       = windowName;
     cs.lpszClass      = className;
     cs.dwExStyle      = exStyle;
-    return WIN_CreateWindowEx( &cs, classAtom, FALSE );
+    return WIN_CreateWindowEx( &cs, classAtom, FALSE, FALSE );
 }
 
 
@@ -898,7 +880,7 @@
     cs.lpszName       = windowName;
     cs.lpszClass      = className;
     cs.dwExStyle      = exStyle;
-    return WIN_CreateWindowEx( &cs, classAtom, FALSE );
+    return WIN_CreateWindowEx( &cs, classAtom, TRUE, FALSE );
 }
 
 
@@ -944,7 +926,7 @@
     cs.dwExStyle      = exStyle;
     /* Note: we rely on the fact that CREATESTRUCT32A and */
     /* CREATESTRUCT32W have the same layout. */
-    return WIN_CreateWindowEx( (CREATESTRUCT32A *)&cs, classAtom, TRUE );
+    return WIN_CreateWindowEx( (CREATESTRUCT32A *)&cs, classAtom, TRUE, TRUE );
 }
 
 
@@ -1055,7 +1037,8 @@
         else break;
       }
 
-      WINPOS_ActivateOtherWindow(wndPtr);
+      if( !Options.managed || EVENT_CheckFocus() )
+          WINPOS_ActivateOtherWindow(wndPtr);
 
       if( wndPtr->owner &&
 	  wndPtr->owner->hwndLastActive == wndPtr->hwndSelf )
@@ -1079,25 +1062,43 @@
 
 
 /***********************************************************************
- *           CloseWindow   (USER.43)
+ *           CloseWindow16   (USER.43)
  */
-BOOL CloseWindow(HWND hWnd)
+BOOL16 CloseWindow16( HWND16 hwnd )
 {
-    WND * wndPtr = WIN_FindWndPtr(hWnd);
-    if (!wndPtr || (wndPtr->dwStyle & WS_CHILD)) return TRUE;
-    ShowWindow32(hWnd, SW_MINIMIZE);
+    return CloseWindow32( hwnd );
+}
+
+ 
+/***********************************************************************
+ *           CloseWindow32   (USER32.55)
+ */
+BOOL32 CloseWindow32( HWND32 hwnd )
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr || (wndPtr->dwStyle & WS_CHILD)) return FALSE;
+    ShowWindow32( hwnd, SW_MINIMIZE );
     return TRUE;
 }
 
  
 /***********************************************************************
- *           OpenIcon   (USER.44)
+ *           OpenIcon16   (USER.44)
  */
-BOOL OpenIcon(HWND hWnd)
+BOOL16 OpenIcon16( HWND16 hwnd )
 {
-    if (!IsIconic16(hWnd)) return FALSE;
-    ShowWindow32(hWnd, SW_SHOWNORMAL);
-    return(TRUE);
+    return OpenIcon32( hwnd );
+}
+
+
+/***********************************************************************
+ *           OpenIcon32   (USER32.409)
+ */
+BOOL32 OpenIcon32( HWND32 hwnd )
+{
+    if (!IsIconic32( hwnd )) return FALSE;
+    ShowWindow32( hwnd, SW_SHOWNORMAL );
+    return TRUE;
 }
 
 
@@ -1106,8 +1107,8 @@
  *
  * Implementation of FindWindow() and FindWindowEx().
  */
-static HWND WIN_FindWindow( HWND parent, HWND child, ATOM className,
-                            LPCSTR title )
+static HWND32 WIN_FindWindow( HWND32 parent, HWND32 child, ATOM className,
+                              LPCSTR title )
 {
     WND *pWnd;
     CLASS *pClass = NULL;
@@ -1220,7 +1221,7 @@
 {
     ATOM atom = 0;
     char *buffer;
-    HWND hwnd;
+    HWND32 hwnd;
 
     if (className)
     {
@@ -1415,7 +1416,7 @@
     {
 	case GWW_ID:        ptr = (WORD *)&wndPtr->wIDmenu; break;
 	case GWW_HINSTANCE: ptr = (WORD *)&wndPtr->hInstance; break;
-	case GWW_HWNDPARENT: return SetParent( hwnd, newval );
+	case GWW_HWNDPARENT: return SetParent32( hwnd, newval );
 	default:
             fprintf( stderr, "SetWindowWord: invalid offset %d\n", offset );
             return 0;
@@ -1504,6 +1505,9 @@
             WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)newval, type );
             return retval;
 	case GWL_STYLE:
+
+	    /* FIXME: WM_STYLE... messages for WIN_ISWIN32 windows */
+
             ptr = &wndPtr->dwStyle;
             /* Some bits can't be changed this way */
             newval &= ~(WS_VISIBLE | WS_CHILD);
@@ -1701,13 +1705,22 @@
 
 
 /*****************************************************************
- *         SetParent              (USER.233)
+ *         SetParent16   (USER.233)
  */
-HWND SetParent(HWND hwndChild, HWND hwndNewParent)
+HWND16 SetParent16( HWND16 hwndChild, HWND16 hwndNewParent )
 {
-    HWND oldParent;
+    return SetParent32( hwndChild, hwndNewParent );
+}
 
-    WND *wndPtr = WIN_FindWndPtr(hwndChild);
+
+/*****************************************************************
+ *         SetParent32   (USER32.494)
+ */
+HWND32 SetParent32( HWND32 hwndChild, HWND32 hwndNewParent )
+{
+    HWND32 oldParent;
+
+    WND *wndPtr = WIN_FindWndPtr( hwndChild );
     WND *pWndParent = WIN_FindWndPtr( hwndNewParent );
     if (!wndPtr || !pWndParent || !(wndPtr->dwStyle & WS_CHILD)) return 0;
 
@@ -1723,16 +1736,17 @@
 }
 
 
-
 /*******************************************************************
- *         IsChild    (USER.48)
+ *         IsChild16    (USER.48)
  */
 BOOL16 IsChild16( HWND16 parent, HWND16 child )
 {
     return IsChild32(parent,child);
 }
+
+
 /*******************************************************************
- *         IsChild    (USER32.338)
+ *         IsChild32    (USER32.338)
  */
 BOOL32 IsChild32( HWND32 parent, HWND32 child )
 {
@@ -1747,14 +1761,16 @@
 
 
 /***********************************************************************
- *           IsWindowVisible   (USER.49)
+ *           IsWindowVisible16   (USER.49)
  */
 BOOL16 IsWindowVisible16( HWND16 hwnd )
 {
     return IsWindowVisible32(hwnd);
 }
+
+
 /***********************************************************************
- *           IsWindowVisible   (USER32.350)
+ *           IsWindowVisible32   (USER32.350)
  */
 BOOL32 IsWindowVisible32( HWND32 hwnd )
 {
@@ -1767,6 +1783,7 @@
     return (wndPtr && (wndPtr->dwStyle & WS_VISIBLE));
 }
 
+
 /***********************************************************************
  *           WIN_IsWindowDrawable
  * 
@@ -1776,7 +1793,7 @@
  */
 BOOL32 WIN_IsWindowDrawable( WND* wnd , BOOL32 icon )
 {
-  HWND   hwnd= wnd->hwndSelf;
+  HWND32 hwnd = wnd->hwndSelf;
   BOOL32 yes = TRUE;
 
   while(wnd && yes)
@@ -1791,14 +1808,16 @@
 }
 
 /*******************************************************************
- *         GetTopWindow    (USER.229)
+ *         GetTopWindow16    (USER.229)
  */
 HWND16 GetTopWindow16( HWND16 hwnd )
 {
     return GetTopWindow32(hwnd);
 }
+
+
 /*******************************************************************
- *         GetTopWindow    (USER.229)
+ *         GetTopWindow32    (USER.229)
  */
 HWND32 GetTopWindow32( HWND32 hwnd )
 {
@@ -1809,14 +1828,16 @@
 
 
 /*******************************************************************
- *         GetWindow    (USER.262)
+ *         GetWindow16    (USER.262)
  */
 HWND16 GetWindow16( HWND16 hwnd, WORD rel )
 {
     return GetWindow32( hwnd,rel );
 }
+
+
 /*******************************************************************
- *         GetWindow    (USER32.301)
+ *         GetWindow32    (USER32.301)
  */
 HWND32 GetWindow32( HWND32 hwnd, WORD rel )
 {
@@ -1859,7 +1880,7 @@
 
 
 /*******************************************************************
- *         GetNextWindow    (USER.230)
+ *         GetNextWindow16    (USER.230)
  */
 HWND16 GetNextWindow16( HWND16 hwnd, WORD flag )
 {
@@ -1868,9 +1889,18 @@
 }
 
 /*******************************************************************
- *         ShowOwnedPopups  (USER.265)
+ *         ShowOwnedPopups16  (USER.265)
  */
-void ShowOwnedPopups( HWND owner, BOOL fShow )
+void ShowOwnedPopups16( HWND16 owner, BOOL16 fShow )
+{
+    ShowOwnedPopups32( owner, fShow );
+}
+
+
+/*******************************************************************
+ *         ShowOwnedPopups32  (USER32.530)
+ */
+BOOL32 ShowOwnedPopups32( HWND32 owner, BOOL32 fShow )
 {
     WND *pWnd = pWndDesktop->child;
     while (pWnd)
@@ -1880,13 +1910,22 @@
             ShowWindow32( pWnd->hwndSelf, fShow ? SW_SHOW : SW_HIDE );
         pWnd = pWnd->next;
     }
+    return TRUE;
 }
 
 
 /*******************************************************************
- *         GetLastActivePopup    (USER.287)
+ *         GetLastActivePopup16   (USER.287)
  */
-HWND GetLastActivePopup(HWND hwnd)
+HWND16 GetLastActivePopup16( HWND16 hwnd )
+{
+    return GetLastActivePopup32( hwnd );
+}
+
+/*******************************************************************
+ *         GetLastActivePopup32   (USER32.255)
+ */
+HWND32 GetLastActivePopup32( HWND32 hwnd )
 {
     WND *wndPtr;
     wndPtr = WIN_FindWndPtr(hwnd);
@@ -2050,9 +2089,18 @@
 
 
 /*******************************************************************
- *           AnyPopup   (USER.52)
+ *           AnyPopup16   (USER.52)
  */
-BOOL AnyPopup(void)
+BOOL16 AnyPopup16(void)
+{
+    return AnyPopup32();
+}
+
+
+/*******************************************************************
+ *           AnyPopup32   (USER32.3)
+ */
+BOOL32 AnyPopup32(void)
 {
     WND *wndPtr;
     for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
@@ -2060,10 +2108,20 @@
     return FALSE;
 }
 
+
 /*******************************************************************
- *			FlashWindow		[USER.105]
+ *            FlashWindow16   (USER.105)
  */
-BOOL FlashWindow(HWND hWnd, BOOL bInvert)
+BOOL16 FlashWindow16( HWND16 hWnd, BOOL16 bInvert )
+{
+    return FlashWindow32( hWnd, bInvert );
+}
+
+
+/*******************************************************************
+ *            FlashWindow32   (USER32.201)
+ */
+BOOL32 FlashWindow32( HWND32 hWnd, BOOL32 bInvert )
 {
     WND *wndPtr = WIN_FindWndPtr(hWnd);
 
@@ -2108,7 +2166,7 @@
  */
 HWND16 SetSysModalWindow16( HWND16 hWnd )
 {
-    HWND hWndOldModal = hwndSysModal;
+    HWND32 hWndOldModal = hwndSysModal;
     hwndSysModal = hWnd;
     dprintf_win(stdnimp,"EMPTY STUB !! SetSysModalWindow(%04x) !\n", hWnd);
     return hWndOldModal;
@@ -2130,7 +2188,7 @@
  * recursively find a child that contains spDragInfo->pt point 
  * and send WM_QUERYDROPOBJECT
  */
-BOOL16 DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo, BOOL32 bNoSend )
+BOOL16 DRAG_QueryUpdate( HWND32 hQueryWnd, SEGPTR spDragInfo, BOOL32 bNoSend )
 {
  BOOL16		wParam,bResult = 0;
  POINT16        pt;
@@ -2196,11 +2254,21 @@
  return bResult;
 }
 
+
 /*******************************************************************
- *                      DragDetect ( USER.465 )
- *
+ *             DragDetect   (USER.465)
  */
-BOOL16 DragDetect(HWND16 hWnd, POINT16 pt)
+BOOL16 DragDetect16( HWND16 hWnd, POINT16 pt )
+{
+    POINT32 pt32;
+    CONV_POINT16TO32( &pt, &pt32 );
+    return DragDetect32( hWnd, pt32 );
+}
+
+/*******************************************************************
+ *             DragDetect32   (USER32.150)
+ */
+BOOL32 DragDetect32( HWND32 hWnd, POINT32 pt )
 {
   MSG16 msg;
   RECT16  rect;
@@ -2241,7 +2309,7 @@
  *                              DragObject ( USER.464 )
  *
  */
-DWORD DragObject(HWND hwndScope, HWND hWnd, WORD wObj, HANDLE16 hOfStruct,
+DWORD DragObject(HWND16 hwndScope, HWND16 hWnd, WORD wObj, HANDLE16 hOfStruct,
                 WORD szList , HCURSOR16 hCursor)
 {
  MSG16	 	msg;
@@ -2253,7 +2321,7 @@
  DWORD		dwRet = 0;
  short	 	dragDone = 0;
  HCURSOR16	hCurrentCursor = 0;
- HWND		hCurrentWnd = 0;
+ HWND16		hCurrentWnd = 0;
  BOOL16		b;
 
  lpDragInfo = (LPDRAGINFO) GlobalLock16(hDragInfo);
@@ -2280,7 +2348,7 @@
 	if( hDragCursor == hCursor ) hDragCursor = 0;
 	else hCursor = hDragCursor;
 
-	hOldCursor = SetCursor(hDragCursor);
+	hOldCursor = SetCursor32(hDragCursor);
    }
 
  lpDragInfo->hWnd   = hWnd;
@@ -2291,7 +2359,7 @@
  lpDragInfo->l = 0L; 
 
  SetCapture32(hWnd);
- ShowCursor(1);
+ ShowCursor32( TRUE );
 
  while( !dragDone )
   {
@@ -2315,7 +2383,7 @@
          lpDragInfo->hScope = 0;
 	}
     if( hCurrentCursor )
-        SetCursor(hCurrentCursor);
+        SetCursor32(hCurrentCursor);
 
     dprintf_msg(stddeb,"drag: got %04x\n", b);
 
@@ -2344,14 +2412,13 @@
   }
 
  ReleaseCapture();
- ShowCursor(0);
+ ShowCursor32( FALSE );
 
  if( hCursor )
-   {
-     SetCursor(hOldCursor);
-     if( hDragCursor )
-	 DestroyCursor(hDragCursor);
-   }
+ {
+     SetCursor32( hOldCursor );
+     if (hDragCursor) DestroyCursor32( hDragCursor );
+ }
 
  if( hCurrentCursor != hBummer ) 
 	dwRet = SendMessage16( lpDragInfo->hScope, WM_DROPOBJECT,