create more window data structures before calling WH_CBT hooks.

Rein Klazes rklazes at xs4all.nl
Sun Dec 16 11:24:15 CST 2001


The right patch attached this time.

Rein.
-- 
Rein Klazes
rklazes at xs4all.nl
-------------- next part --------------
--- ./wine/windows/win.c	Tue Dec 11 07:30:05 2001
+++ ./mywine/windows/win.c	Sun Dec 16 14:24:09 2001
@@ -778,6 +778,8 @@
     WIN_SetRectangles( hwndDesktop, &rect, &rect );
     WIN_SetStyle( hwndDesktop, WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS );
 
+    pWndDesktop->pDriverData          = 0;
+ 
     if (!USER_Driver.pCreateWindow( hwndDesktop, &cs, FALSE )) return FALSE;
 
     pWndDesktop->flags |= WIN_NEEDS_ERASEBKGND;
@@ -1068,32 +1070,13 @@
 
     if (wndExtra) memset( wndPtr->wExtra, 0, wndExtra);
 
-    /* Call the WH_CBT hook */
+    /* create some window data structures */
+    wndPtr->pDriverData         = 0;
+    USER_Driver.pCreateWindow( wndPtr->hwndSelf, cs, unicode);
 
     hwndLinkAfter = ((cs->style & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD)
  ? HWND_BOTTOM : HWND_TOP;
 
-    if (HOOK_IsHooked( WH_CBT ))
-    {
-	CBT_CREATEWNDA cbtc;
-        LRESULT ret;
-
-	cbtc.lpcs = cs;
-	cbtc.hwndInsertAfter = hwndLinkAfter;
-        ret = (type == WIN_PROC_32W) ? HOOK_CallHooksW(WH_CBT, HCBT_CREATEWND,
-                                                       (WPARAM)hwnd, (LPARAM)&cbtc)
-                                     : HOOK_CallHooksA(WH_CBT, HCBT_CREATEWND,
-                                                       (WPARAM)hwnd, (LPARAM)&cbtc);
-        if (ret)
-	{
-	    TRACE("CBT-hook returned 0\n");
-            free_window_handle( hwnd );
-            CLASS_RemoveWindow( classPtr );
-            WIN_ReleaseWndPtr(wndPtr);
-            return 0;
-	}
-    }
-
     /* Correct the window style - stage 2 */
 
     if (!(cs->style & WS_CHILD))
@@ -1142,6 +1125,29 @@
         }
     }
     else SetWindowLongW( hwnd, GWL_ID, (UINT)cs->hMenu );
+    
+    /* Call the WH_CBT hook */
+    if (HOOK_IsHooked( WH_CBT ))
+    {
+	CBT_CREATEWNDA cbtc;
+        LRESULT ret;
+
+	cbtc.lpcs = cs;
+	cbtc.hwndInsertAfter = hwndLinkAfter;
+        ret = (type == WIN_PROC_32W) ? HOOK_CallHooksW(WH_CBT, HCBT_CREATEWND,
+                                                       (WPARAM)hwnd, (LPARAM)&cbtc)
+                                     : HOOK_CallHooksA(WH_CBT, HCBT_CREATEWND,
+                                                       (WPARAM)hwnd, (LPARAM)&cbtc);
+        if (ret)
+	{
+	    TRACE("CBT-hook returned 0\n");
+            free_window_handle( hwnd );
+            CLASS_RemoveWindow( classPtr );
+            WIN_ReleaseWndPtr(wndPtr);
+            return 0;
+	}
+    }
+
     WIN_ReleaseWndPtr( wndPtr );
 
     if (!USER_Driver.pCreateWindow( hwnd, cs, unicode))
--- ./wine/dlls/x11drv/window.c	Mon Oct 22 21:08:34 2001
+++ ./mywine/dlls/x11drv/window.c	Sun Dec 16 14:08:58 2001
@@ -827,26 +827,33 @@
     RECT rect;
     BOOL ret = FALSE;
 
-    if (!(data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data)))) return FALSE;
-    data->whole_window  = 0;
-    data->client_window = 0;
-    data->icon_window   = 0;
-    data->hWMIconBitmap = 0;
-    data->hWMIconMask   = 0;
-
     wndPtr = WIN_GetPtr( hwnd );
-    wndPtr->pDriverData = data;
+    if(!wndPtr->pDriverData) {
+        if (!(data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data)))){
+            WIN_ReleasePtr( wndPtr );
+            return FALSE;
+        }
+        data->whole_window  = 0;
+        data->client_window = 0;
+        data->icon_window   = 0;
+        data->hWMIconBitmap = 0;
+        data->hWMIconMask   = 0;
+
+        wndPtr->pDriverData = data;
 
-    /* initialize the dimensions before sending WM_GETMINMAXINFO */
-    SetRect( &rect, cs->x, cs->y, cs->x + cs->cx, cs->y + cs->cy );
-    WIN_SetRectangles( hwnd, &rect, &rect );
+        /* initialize the dimensions before sending WM_GETMINMAXINFO */
+        SetRect( &rect, cs->x, cs->y, cs->x + cs->cx, cs->y + cs->cy );
+        WIN_SetRectangles( hwnd, &rect, &rect );
 
-    if (!wndPtr->parent)
-    {
-        create_desktop( display, wndPtr, cs );
+        if (!wndPtr->parent)
+        {
+            create_desktop( display, wndPtr, cs );
+        }
         WIN_ReleasePtr( wndPtr );
         return TRUE;
     }
+
+    data=wndPtr->pDriverData;
 
     if (!create_whole_window( display, wndPtr )) goto failed;
     if (!create_client_window( display, wndPtr )) goto failed;


More information about the wine-patches mailing list