Serge Ivanov
SetParent: call SetWindowPos with SWP_NOACTIVATE flag set.

diff --git a/windows/win.c b/windows/win.c
index fb656bc..bdc8197 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -28,7 +28,6 @@
 #include "winproc.h"
 #include "task.h"
 #include "thread.h"
-#include "process.h"
 #include "winerror.h"
 #include "mdi.h"
 #include "local.h"
@@ -36,8 +35,8 @@
 #include "stackframe.h"
 #include "debugtools.h"
 
-DEFAULT_DEBUG_CHANNEL(win)
-DECLARE_DEBUG_CHANNEL(msg)
+DEFAULT_DEBUG_CHANNEL(win);
+DECLARE_DEBUG_CHANNEL(msg);
 
 /**********************************************************************/
 
@@ -699,54 +698,39 @@
 
     /* Fix the coordinates */
 
-    if (cs->x == CW_USEDEFAULT || cs->x == CW_USEDEFAULT16)
+    if (cs->x == CW_USEDEFAULT || cs->x == CW_USEDEFAULT16 ||
+        cs->cx == CW_USEDEFAULT || cs->cx == CW_USEDEFAULT16)
     {
-        PDB *pdb = PROCESS_Current();
+        STARTUPINFOA info;
+        info.dwFlags = 0;
+        if (!(cs->style & (WS_CHILD | WS_POPUP))) GetStartupInfoA( &info );
 
-       /* Never believe Microsoft's documentation... CreateWindowEx doc says 
-        * that if an overlapped window is created with WS_VISIBLE style bit 
-        * set and the x parameter is set to CW_USEDEFAULT, the system ignores
-        * the y parameter. However, disassembling NT implementation (WIN32K.SYS)
-        * reveals that
-        *
-        * 1) not only it checks for CW_USEDEFAULT but also for CW_USEDEFAULT16 
-        * 2) it does not ignore the y parameter as the docs claim; instead, it 
-        *    uses it as second parameter to ShowWindow() unless y is either
-        *    CW_USEDEFAULT or CW_USEDEFAULT16.
-        * 
-        * The fact that we didn't do 2) caused bogus windows pop up when wine
-        * was running apps that were using this obscure feature. Example - 
-        * calc.exe that comes with Win98 (only Win98, it's different from 
-        * the one that comes with Win95 and NT)
-        */
-        if (cs->y != CW_USEDEFAULT && cs->y != CW_USEDEFAULT16) sw = cs->y;
-
-        /* We have saved cs->y, now we can trash it */
-        if (   !(cs->style & (WS_CHILD | WS_POPUP))
-            &&  (pdb->env_db->startup_info->dwFlags & STARTF_USEPOSITION) )
+        if (cs->x == CW_USEDEFAULT || cs->x == CW_USEDEFAULT16)
         {
-            cs->x = pdb->env_db->startup_info->dwX;
-            cs->y = pdb->env_db->startup_info->dwY;
+            /* Never believe Microsoft's documentation... CreateWindowEx doc says 
+             * that if an overlapped window is created with WS_VISIBLE style bit 
+             * set and the x parameter is set to CW_USEDEFAULT, the system ignores
+             * the y parameter. However, disassembling NT implementation (WIN32K.SYS)
+             * reveals that
+             *
+             * 1) not only it checks for CW_USEDEFAULT but also for CW_USEDEFAULT16 
+             * 2) it does not ignore the y parameter as the docs claim; instead, it 
+             *    uses it as second parameter to ShowWindow() unless y is either
+             *    CW_USEDEFAULT or CW_USEDEFAULT16.
+             * 
+             * The fact that we didn't do 2) caused bogus windows pop up when wine
+             * was running apps that were using this obscure feature. Example - 
+             * calc.exe that comes with Win98 (only Win98, it's different from 
+             * the one that comes with Win95 and NT)
+             */
+            if (cs->y != CW_USEDEFAULT && cs->y != CW_USEDEFAULT16) sw = cs->y;
+            cs->x = (info.dwFlags & STARTF_USEPOSITION) ? info.dwX : 0;
+            cs->y = (info.dwFlags & STARTF_USEPOSITION) ? info.dwY : 0;
         }
-        else
+        if (cs->cx == CW_USEDEFAULT || cs->cx == CW_USEDEFAULT16)
         {
-            cs->x = 0;
-            cs->y = 0;
-        }
-    }
-    if (cs->cx == CW_USEDEFAULT || cs->cx == CW_USEDEFAULT16)
-    {
-        PDB *pdb = PROCESS_Current();
-        if (   !(cs->style & (WS_CHILD | WS_POPUP))
-            &&  (pdb->env_db->startup_info->dwFlags & STARTF_USESIZE) )
-        {
-            cs->cx = pdb->env_db->startup_info->dwXSize;
-            cs->cy = pdb->env_db->startup_info->dwYSize;
-        }
-        else
-        {
-            cs->cx = 600; /* FIXME */
-            cs->cy = 400;
+            cs->cx = (info.dwFlags & STARTF_USESIZE) ? info.dwXSize : 0;
+            cs->cy = (info.dwFlags & STARTF_USESIZE) ? info.dwYSize : 0;
         }
     }
 
@@ -2409,7 +2393,7 @@
      WM_WINDOWPOSCHANGED notification messages. 
   */
   SetWindowPos( hwndChild, HWND_TOPMOST, 0, 0, 0, 0,
-      SWP_NOMOVE|SWP_NOSIZE|((dwStyle & WS_VISIBLE)?SWP_SHOWWINDOW:0));
+      SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|((dwStyle & WS_VISIBLE)?SWP_SHOWWINDOW:0));
   /* FIXME: a WM_MOVE is also generated (in the DefWindowProc handler
    * for WM_WINDOWPOSCHANGED) in Windows, should probably remove SWP_NOMOVE */