[ros-diffs] [jimtabor] 45995: - [User32] Sync Mdi to wine 1.1.40.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Sun Mar 7 22:18:52 CET 2010


Author: jimtabor
Date: Sun Mar  7 22:18:52 2010
New Revision: 45995

URL: http://svn.reactos.org/svn/reactos?rev=45995&view=rev
Log:
- [User32] Sync Mdi to wine 1.1.40.

Modified:
    trunk/reactos/dll/win32/user32/windows/mdi.c
    trunk/reactos/dll/win32/user32/windows/window.c
    trunk/reactos/media/doc/README.WINE

Modified: trunk/reactos/dll/win32/user32/windows/mdi.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/mdi.c?rev=45995&r1=45994&r2=45995&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/mdi.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/mdi.c [iso-8859-1] Sun Mar  7 22:18:52 2010
@@ -100,7 +100,20 @@
 
 typedef struct
 {
+    /* At some points, particularly when switching MDI children, active and
+     * maximized MDI children may be not the same window, so we need to track
+     * them separately.
+     * The only place where we switch to/from maximized state is DefMDIChildProc
+     * WM_SIZE/SIZE_MAXIMIZED handler. We get that notification only after the
+     * ShowWindow(SW_SHOWMAXIMIZED) request, therefore window is guaranteed to
+     * be visible at the time we get the notification, and it's safe to assume
+     * that hwndChildMaximized is always visible.
+     * If the app plays games with WS_VISIBLE, WS_MAXIMIZE or any other window
+     * states it must keep coherency with USER32 on its own. This is true for
+     * Windows as well.
+     */
     UINT      nActiveChildren;
+    HWND      hwndChildMaximized;
     HWND      hwndActiveChild;
     HWND      *child; /* array of tracked children */
     HMENU     hFrameMenu;
@@ -116,15 +129,13 @@
 //static HBITMAP hBmpClose   = 0;
 
 /* ----------------- declarations ----------------- */
-static void MDI_UpdateFrameText( HWND, HWND, LPCWSTR);
+static void MDI_UpdateFrameText( HWND, HWND, BOOL, LPCWSTR);
 static BOOL MDI_AugmentFrameMenu( HWND, HWND );
 static BOOL MDI_RestoreFrameMenu( HWND, HWND, HBITMAP );
 static LONG MDI_ChildActivate( HWND, HWND );
 static LRESULT MDI_RefreshMenu(MDICLIENTINFO *);
 
 static HWND MDI_MoreWindowsDialog(HWND);
-//static LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
-//static LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
 
 HWND* WIN_ListChildren (HWND hWndparent)
 {
@@ -220,13 +231,15 @@
     WND *win = WIN_GetPtr( client );
     if (win)
     {
-        if (win == WND_OTHER_PROCESS)
-        {
-            if (IsWindow(client)) ERR( "client %p belongs to other process\n", client );
+        if (win == WND_OTHER_PROCESS || win == WND_DESKTOP)
+        {
+            if (IsWindow(client)) WARN( "client %p belongs to other process\n", client );
             return NULL;
         }
-        if (win->cbWndExtra < sizeof(MDICLIENTINFO)) WARN( "%p is not an MDI client\n", client );
-        else ret = (MDICLIENTINFO *)win->wExtra;
+        if (win->flags & WIN_ISMDICLIENT)
+            ret = (MDICLIENTINFO *)win->wExtra;
+        else
+            WARN( "%p is not an MDI client\n", client );
         WIN_ReleasePtr( win );
     }
     return ret;
@@ -246,7 +259,6 @@
     }
     return TRUE;
 }
-
 
 /**********************************************************************
  * 			MDI_GetWindow
@@ -343,12 +355,14 @@
 
     if (!(ci = get_client_info( hwnd ))) return 0;
 
+    TRACE("old frame menu %p, old window menu %p\n", ci->hFrameMenu, ci->hWindowMenu);
+
     if (hmenuFrame)
     {
         if (hmenuFrame == ci->hFrameMenu) return (LRESULT)hmenuFrame;
 
-        if (IsZoomed(ci->hwndActiveChild))
-            MDI_RestoreFrameMenu( hwndFrame, ci->hwndActiveChild, ci->hBmpClose );
+        if (ci->hwndChildMaximized)
+            MDI_RestoreFrameMenu( hwndFrame, ci->hwndChildMaximized, ci->hBmpClose );
     }
 
     if( hmenuWindow && hmenuWindow != ci->hWindowMenu )
@@ -382,8 +396,8 @@
             HMENU oldFrameMenu = ci->hFrameMenu;
 
             ci->hFrameMenu = hmenuFrame;
-            if (IsZoomed(ci->hwndActiveChild) && (GetWindowLongPtrW(ci->hwndActiveChild, GWL_STYLE) & WS_VISIBLE))
-                MDI_AugmentFrameMenu( hwndFrame, ci->hwndActiveChild );
+            if (ci->hwndChildMaximized)
+                MDI_AugmentFrameMenu( hwndFrame, ci->hwndChildMaximized );
 
             return (LRESULT)oldFrameMenu;
         }
@@ -396,8 +410,8 @@
          * that the "if" to this "else" wouldn't catch the need to
          * augment the frame menu.
          */
-        if( IsZoomed(ci->hwndActiveChild) )
-            MDI_AugmentFrameMenu( hwndFrame, ci->hwndActiveChild );
+        if( ci->hwndChildMaximized )
+            MDI_AugmentFrameMenu( hwndFrame, ci->hwndChildMaximized );
     }
 
     return 0;
@@ -577,12 +591,15 @@
         else
         {
             ShowWindow(child, SW_HIDE);
-            if (IsZoomed(child))
+            if (child == ci->hwndChildMaximized)
             {
-                MDI_RestoreFrameMenu(GetParent(client), child, ci->hBmpClose);
-                MDI_UpdateFrameText(GetParent(client), client, NULL);
+                HWND frame = GetParent(client);
+                MDI_RestoreFrameMenu(frame, child, ci->hBmpClose);
+                ci->hwndChildMaximized = 0;
+                MDI_UpdateFrameText(frame, client, TRUE, NULL);
             }
-            MDI_ChildActivate(client, 0);
+            if (flagDestroy)
+                MDI_ChildActivate(client, 0);
         }
     }
 
@@ -613,10 +630,9 @@
         }
     }
 
-    SendMessageW(client, WM_MDIREFRESHMENU, 0, 0);
-
     if (flagDestroy)
     {
+        SendMessageW(client, WM_MDIREFRESHMENU, 0, 0);
         MDI_PostUpdate(GetParent(child), ci, SB_BOTH+1);
         DestroyWindow(child);
     }
@@ -663,7 +679,13 @@
     if( isActiveFrameWnd )
     {
         SendMessageW( child, WM_NCACTIVATE, TRUE, 0L);
-        SetFocus( client );
+        /* Let the client window manage focus for children, but if the focus
+         * is already on the client (for instance this is the 1st child) then
+         * SetFocus won't work. It appears that Windows sends WM_SETFOCUS
+         * manually in this case.
+         */
+        if (SetFocus( client ) == client)
+            SendMessageW( client, WM_SETFOCUS, (WPARAM)client, 0 );
     }
 
     SendMessageW( child, WM_MDIACTIVATE, (WPARAM)prevActiveWnd, (LPARAM)child );
@@ -715,8 +737,8 @@
     BOOL has_icons = FALSE;
     int i, total;
 
-    if (IsZoomed(ci->hwndActiveChild))
-        SendMessageW(client, WM_MDIRESTORE, (WPARAM)ci->hwndActiveChild, 0);
+    if (ci->hwndChildMaximized)
+        SendMessageW(client, WM_MDIRESTORE, (WPARAM)ci->hwndChildMaximized, 0);
 
     if (ci->nActiveChildren == 0) return 0;
 
@@ -745,13 +767,17 @@
         /* walk the list (backwards) and move windows */
         for (i = total - 1; i >= 0; i--)
         {
+            LONG style;
+            LONG posOptions = SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER;
+
             MDI_CalcDefaultChildPos(client, n++, pos, delta, NULL);
-
             TRACE("move %p to (%ld,%ld) size [%ld,%ld]\n",
                   win_array[i], pos[0].x, pos[0].y, pos[1].x, pos[1].y);
-
+            style = GetWindowLongW(win_array[i], GWL_STYLE);
+
+            if (!(style & WS_SIZEBOX)) posOptions |= SWP_NOSIZE;
             SetWindowPos( win_array[i], 0, pos[0].x, pos[0].y, pos[1].x, pos[1].y,
-                          SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER);
+                           posOptions);
         }
     }
     HeapFree( GetProcessHeap(), 0, win_array );
@@ -769,8 +795,8 @@
     int i, total;
     BOOL has_icons = FALSE;
 
-    if (IsZoomed(ci->hwndActiveChild))
-        SendMessageW(client, WM_MDIRESTORE, (WPARAM)ci->hwndActiveChild, 0);
+    if (ci->hwndChildMaximized)
+        SendMessageW(client, WM_MDIRESTORE, (WPARAM)ci->hwndChildMaximized, 0);
 
     if (ci->nActiveChildren == 0) return;
 
@@ -831,8 +857,11 @@
             y = 0;
             for (r = 1; r <= rows && *pWnd; r++, i++)
             {
-                SetWindowPos(*pWnd, 0, x, y, xsize, ysize,
-                             SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER);
+                LONG posOptions = SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER;
+                LONG style = GetWindowLongW(win_array[i], GWL_STYLE);  
+                if (!(style & WS_SIZEBOX)) posOptions |= SWP_NOSIZE; 
+
+                SetWindowPos(*pWnd, 0, x, y, xsize, ysize, posOptions);
                 y += ysize;
                 pWnd++;
             }
@@ -854,23 +883,26 @@
     HMENU menu = GetMenu( frame );
     HMENU  	hSysPopup = 0;
     HBITMAP hSysMenuBitmap = 0;
+    HICON hIcon;
     INT nItems;
     UINT iId;
-    HICON hIcon;
 
     TRACE("frame %p,child %p\n",frame,hChild);
 
     if( !menu ) return 0;
-
+//// ReactOS start
     /* if the system buttons already exist do not add them again */
     nItems = GetMenuItemCount(menu) - 1;
     iId = GetMenuItemID(menu,nItems) ;
     if (iId == SC_RESTORE || iId == SC_CLOSE)
-        return 0;
+	return 0;
 
     /* create a copy of sysmenu popup and insert it into frame menu bar */
     if (!(hSysPopup = GetSystemMenu(hChild, FALSE)))
-	return 0;
+    {
+        TRACE("child %p doesn't have a system menu\n", hChild);
+        return 0;
+    }
 
     AppendMenuW(menu, MF_HELP | MF_BITMAP,
                 SC_MINIMIZE, (LPCWSTR)HBMMENU_MBAR_MINIMIZE ) ;
@@ -886,6 +918,7 @@
         hIcon = (HICON)GetClassLongPtrW(hChild, GCLP_HICON);
     if (!hIcon)
         hIcon = LoadIconW(NULL, IDI_APPLICATION);
+//// End
     if (hIcon)
     {
       HDC hMemDC;
@@ -938,15 +971,17 @@
 {
     MENUITEMINFOW menuInfo;
     HMENU menu = GetMenu( frame );
-    INT nItems = GetMenuItemCount(menu) - 1;
-    UINT iId = GetMenuItemID(menu,nItems) ;
-
-    TRACE("frame %p,child %p,nIt=%d,iId=%d\n",frame,hChild,nItems,iId);
+    INT nItems;
+    UINT iId;
+
+    TRACE("frame %p,child %p\n",frame, hChild);
 
     if( !menu ) return 0;
 
     /* if there is no system buttons then nothing to do */
-    if(!(iId == SC_RESTORE || iId == SC_CLOSE) )
+    nItems = GetMenuItemCount(menu) - 1;
+    iId = GetMenuItemID(menu,nItems) ;
+    if( !(iId == SC_RESTORE || iId == SC_CLOSE) )
 	return 0;
 
     /*
@@ -994,7 +1029,7 @@
  *
  * Note: lpTitle can be NULL
  */
-static void MDI_UpdateFrameText( HWND frame, HWND hClient, LPCWSTR lpTitle )
+static void MDI_UpdateFrameText( HWND frame, HWND hClient, BOOL repaint, LPCWSTR lpTitle )
 {
     WCHAR   lpBuffer[MDI_MAXTITLELENGTH+1];
     MDICLIENTINFO *ci = get_client_info( hClient );
@@ -1019,7 +1054,7 @@
 
     if (ci->frameTitle)
     {
-	if (IsZoomed(ci->hwndActiveChild) && IsWindowVisible(ci->hwndActiveChild))
+	if (ci->hwndChildMaximized)
 	{
 	    /* combine frame title and child title if possible */
 
@@ -1048,6 +1083,10 @@
 	lpBuffer[0] = '\0';
 
     DefWindowProcW( frame, WM_SETTEXT, 0, (LPARAM)lpBuffer );
+
+    if (repaint)  
+        SetWindowPos( frame, 0,0,0,0,0, SWP_FRAMECHANGED |  
+                      SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER ); 
 }
 
 
@@ -1057,63 +1096,43 @@
 /**********************************************************************
  *		MDIClientWndProc_common
  */
-LRESULT WINAPI MDIClientWndProc_common( HWND hwnd, UINT message,
-                                   WPARAM wParam, LPARAM lParam, BOOL unicode )
+LRESULT WINAPI MDIClientWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode )
 {
     MDICLIENTINFO *ci = NULL;
 
     TRACE("%p %04x (%s) %08lx %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
 
-    if (WM_NCCREATE != message && NULL == (ci = get_client_info(hwnd)))
-    {
-        return 0;
-    }
-
-#ifndef __REACTOS__
-    if (!(ci = get_client_info( hwnd ))) return 0;
+    if (!(ci = get_client_info(hwnd)))
+    {
+        if (message == WM_NCCREATE)
+        {
+#ifdef __REACTOS__
+          if (!(ci = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ci))))
+             return FALSE;
+           SetWindowLongPtrW( hwnd, 0, (LONG_PTR)ci );
+           ci->hBmpClose = 0;
+#else
+           WND *wndPtr = WIN_GetPtr( hwnd );
+           wndPtr->flags |= WIN_ISMDICLIENT;
+           WIN_ReleasePtr( wndPtr );
 #endif
+        }
+        return unicode ? DefWindowProcW( hwnd, message, wParam, lParam ) :
+                         DefWindowProcA( hwnd, message, wParam, lParam );
+    }
 
     switch (message)
     {
-#ifdef __REACTOS__
-      case WM_NCCREATE:
-	if (!(ci = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ci))))
-		return FALSE;
-        SetWindowLongPtrW( hwnd, 0, (LONG_PTR)ci );
-        ci->hBmpClose = 0;
-	return TRUE;
-#endif
-
       case WM_CREATE:
       {
           /* Since we are using only cs->lpCreateParams, we can safely
            * cast to LPCREATESTRUCTA here */
-          LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
-#ifndef __REACTOS__
-          WND *wndPtr = WIN_GetPtr( hwnd );
-
-          wndPtr->flags |= WIN_ISMDICLIENT;
-#endif
-	/* Translation layer doesn't know what's in the cs->lpCreateParams
-	 * so we have to keep track of what environment we're in. */
-
-#ifndef __REACTOS__
-	if( wndPtr->flags & WIN_ISWIN32 )
-#endif
-	{
-            LPCLIENTCREATESTRUCT ccs = (LPCLIENTCREATESTRUCT)cs->lpCreateParams;
-	    ci->hWindowMenu	= ccs->hWindowMenu;
-	    ci->idFirstChild	= ccs->idFirstChild;
-	}
-#ifndef __REACTOS__
-        else
-	{
-	    LPCLIENTCREATESTRUCT16 ccs = MapSL((SEGPTR)cs->lpCreateParams);
-	    ci->hWindowMenu	= HMENU_32(ccs->hWindowMenu);
-	    ci->idFirstChild	= ccs->idFirstChild;
-	}
-        WIN_ReleasePtr( wndPtr );
-#endif
+        LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
+        LPCLIENTCREATESTRUCT ccs = (LPCLIENTCREATESTRUCT)cs->lpCreateParams;
+
+        ci->hWindowMenu		= ccs->hWindowMenu;
+	ci->idFirstChild	= ccs->idFirstChild;
+	ci->hwndChildMaximized  = 0;
         ci->child = NULL;
 	ci->nActiveChildren	= 0;
 	ci->nTotalCreated	= 0;
@@ -1130,8 +1149,8 @@
 
       case WM_DESTROY:
       {
-          if( IsZoomed(ci->hwndActiveChild) )
-              MDI_RestoreFrameMenu(GetParent(hwnd), ci->hwndActiveChild, ci->hBmpClose);
+          if( ci->hwndChildMaximized )
+              MDI_RestoreFrameMenu(GetParent(hwnd), ci->hwndChildMaximized, ci->hBmpClose);
 
           ci->nActiveChildren = 0;
           MDI_RefreshMenu(ci);
@@ -1147,7 +1166,8 @@
 
       case WM_MDIACTIVATE:
       {
-        MDI_SwitchActiveChild( ci, (HWND)wParam, TRUE );
+        if( ci->hwndActiveChild != (HWND)wParam )
+            SetWindowPos((HWND)wParam, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
         return 0;
       }
 
@@ -1177,18 +1197,13 @@
                                             hwnd, 0, csA->hOwner,
                                             (LPVOID)csA->lParam);
             }
-
-            if (IsZoomed(ci->hwndActiveChild))
-            {
-                MDI_AugmentFrameMenu(GetParent(hwnd), child);
-                MDI_UpdateFrameText(GetParent(hwnd), hwnd, NULL);
-            }
             return (LRESULT)child;
         }
         return 0;
 
       case WM_MDIDESTROY:
           return MDIDestroyChild( hwnd, ci, (HWND)wParam, TRUE );
+
       case WM_MDIGETACTIVE:
           if (lParam) *(BOOL *)lParam = IsZoomed(ci->hwndActiveChild);
           return (LRESULT)ci->hwndActiveChild;
@@ -1212,7 +1227,7 @@
       }
 
       case WM_MDIRESTORE:
-        SendMessageW( (HWND)wParam, WM_SYSCOMMAND, SC_RESTORE, 0);
+        ShowWindow( (HWND)wParam, SW_SHOWNORMAL );
         return 0;
 
       case WM_MDISETMENU:
@@ -1251,10 +1266,14 @@
         case WM_CREATE:
             if (GetWindowLongPtrW((HWND)lParam, GWL_EXSTYLE) & WS_EX_MDICHILD)
             {
+                // ReactOS See rev 33503
                 if (!ci->child)
                     ci->child = HeapAlloc(GetProcessHeap(), 0, sizeof(HWND));
                 else
                     ci->child = HeapReAlloc(GetProcessHeap(), 0, ci->child, sizeof(HWND) * (ci->nActiveChildren + 1));
+
+                TRACE("Adding MDI child %p, # of children %d\n",
+                      (HWND)lParam, ci->nActiveChildren);
 
                 if (ci->child != NULL)
                 {
@@ -1279,12 +1298,14 @@
                 SetWindowPos(child, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE );
             break;
             }
+
+        case WM_DESTROY:
+            return MDIDestroyChild( hwnd, ci, WIN_GetFullHandle( (HWND)lParam ), FALSE );
         }
         return 0;
 
       case WM_SIZE:
-        if( IsWindow(ci->hwndActiveChild) && IsZoomed(ci->hwndActiveChild) &&
-            (GetWindowLongPtrW(ci->hwndActiveChild, GWL_STYLE) & WS_VISIBLE) )
+        if( ci->hwndActiveChild && IsZoomed(ci->hwndActiveChild) )
 	{
 	    RECT	rect;
 
@@ -1292,7 +1313,6 @@
 	    rect.top = 0;
 	    rect.right = LOWORD(lParam);
 	    rect.bottom = HIWORD(lParam);
-
 	    AdjustWindowRectEx(&rect, GetWindowLongPtrA(ci->hwndActiveChild, GWL_STYLE),
                                0, GetWindowLongPtrA(ci->hwndActiveChild, GWL_EXSTYLE) );
 	    MoveWindow(ci->hwndActiveChild, rect.left, rect.top,
@@ -1351,7 +1371,7 @@
                 if (text == NULL)
                     return 0;
                 MultiByteToWideChar( CP_ACP, 0, (LPSTR)lParam, -1, text, len );
-                MDI_UpdateFrameText( hwnd, hwndMDIClient, text );
+                MDI_UpdateFrameText( hwnd, hwndMDIClient, FALSE, text );
                 HeapFree( GetProcessHeap(), 0, text );
             }
             return 1; /* success. FIXME: check text length */
@@ -1389,7 +1409,7 @@
                 if (id <  ci->idFirstChild || id >= ci->idFirstChild + ci->nActiveChildren)
                 {
                     if( (id - 0xf000) & 0xf00f ) break;
-                    if( !IsZoomed(ci->hwndActiveChild) ) break;
+                    if( !ci->hwndChildMaximized ) break;
                     switch( id )
                     {
                     case SC_CLOSE:
@@ -1426,7 +1446,7 @@
 	    break;
 
         case WM_SETTEXT:
-            MDI_UpdateFrameText( hwnd, hwndMDIClient, (LPWSTR)lParam );
+            MDI_UpdateFrameText( hwnd, hwndMDIClient, FALSE, (LPWSTR)lParam );
 	    return 1; /* success. FIXME: check text length */
 
         case WM_SETFOCUS:
@@ -1482,8 +1502,8 @@
     {
     case WM_SETTEXT:
 	DefWindowProcA(hwnd, message, wParam, lParam);
-	if( ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild) )
-	    MDI_UpdateFrameText( GetParent(client), client, NULL );
+	if( ci->hwndChildMaximized == hwnd )
+	    MDI_UpdateFrameText( GetParent(client), client, TRUE, NULL );
         return 1; /* success. FIXME: check text length */
 
     case WM_GETMINMAXINFO:
@@ -1516,6 +1536,7 @@
     MDICLIENTINFO *ci = get_client_info( client );
 
     TRACE("%p %04x (%s) %08lx %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
+
     hwnd = WIN_GetFullHandle( hwnd );
     if (!ci) return DefWindowProcW( hwnd, message, wParam, lParam );
 
@@ -1523,8 +1544,8 @@
     {
     case WM_SETTEXT:
         DefWindowProcW(hwnd, message, wParam, lParam);
-        if( ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild) )
-            MDI_UpdateFrameText( GetParent(client), client, NULL );
+        if( ci->hwndChildMaximized == hwnd )
+            MDI_UpdateFrameText( GetParent(client), client, TRUE, NULL );
         return 1; /* success. FIXME: check text length */
 
     case WM_GETMINMAXINFO:
@@ -1538,22 +1559,27 @@
         SendMessageW( client, WM_MDIDESTROY, (WPARAM)hwnd, 0 );
         return 0;
 
+    case WM_SETFOCUS:
+        if (ci->hwndActiveChild != hwnd)
+            MDI_ChildActivate( client, hwnd );
+        break;
+
     case WM_CHILDACTIVATE:
         MDI_ChildActivate( client, hwnd );
         return 0;
 
     case WM_SYSCOMMAND:
-        switch( wParam )
+        switch( wParam & 0xfff0)
         {
         case SC_MOVE:
-            if( ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild))
+            if( ci->hwndChildMaximized == hwnd )
                 return 0;
             break;
         case SC_RESTORE:
         case SC_MINIMIZE:
             break;
         case SC_MAXIMIZE:
-            if (ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild))
+            if (ci->hwndChildMaximized == hwnd )
                 return SendMessageW( GetParent(client), message, wParam, lParam);
             break;
         case SC_NEXTWINDOW:
@@ -1569,25 +1595,60 @@
 #ifndef __REACTOS__
     case WM_SETVISIBLE:
 #endif
-        if (IsZoomed(ci->hwndActiveChild)) ci->mdiFlags &= ~MDIF_NEEDUPDATE;
+        if (ci->hwndChildMaximized) ci->mdiFlags &= ~MDIF_NEEDUPDATE;
         else MDI_PostUpdate(client, ci, SB_BOTH+1);
         break;
 
     case WM_SIZE:
-        if( hwnd == ci->hwndActiveChild )
-        {
-            if( wParam == SIZE_MAXIMIZED )
+        /* This is the only place where we switch to/from maximized state */
+        /* do not change */
+        TRACE("current active %p, maximized %p\n", ci->hwndActiveChild, ci->hwndChildMaximized);
+
+        if( ci->hwndChildMaximized == hwnd && wParam != SIZE_MAXIMIZED)
+        {
+            HWND frame;
+
+            ci->hwndChildMaximized = 0;
+
+            frame = GetParent(client);
+            MDI_RestoreFrameMenu( frame, hwnd, ci->hBmpClose );
+            MDI_UpdateFrameText( frame, client, TRUE, NULL );
+        }
+
+        if( wParam == SIZE_MAXIMIZED )
+        {
+            HWND frame, hMaxChild = ci->hwndChildMaximized;
+
+            if( hMaxChild == hwnd ) break;
+
+            if( hMaxChild)
             {
-                TRACE("maximizing child %p\n", hwnd );
-
-                MDI_AugmentFrameMenu( GetParent(client), hwnd );
+                SendMessageW( hMaxChild, WM_SETREDRAW, FALSE, 0 );
+
+                MDI_RestoreFrameMenu( GetParent(client), hMaxChild, ci->hBmpClose );
+                ShowWindow( hMaxChild, SW_SHOWNOACTIVATE );
+
+                SendMessageW( hMaxChild, WM_SETREDRAW, TRUE, 0 );
             }
-            else
-                MDI_RestoreFrameMenu( GetParent(client), hwnd , ci->hBmpClose);
-        }
-
-        MDI_UpdateFrameText( GetParent(client), client, NULL );
-        MDI_RefreshMenu(ci);
+
+            TRACE("maximizing child %p\n", hwnd );
+
+            /* keep track of the maximized window. */
+            ci->hwndChildMaximized = hwnd; /* !!! */
+
+            frame = GetParent(client);
+            MDI_AugmentFrameMenu( frame, hwnd );
+            MDI_UpdateFrameText( frame, client, TRUE, NULL );
+        }
+
+        if( wParam == SIZE_MINIMIZED )
+        {
+            HWND switchTo = MDI_GetWindow( ci, hwnd, TRUE, WS_MINIMIZE );
+
+            if (!switchTo) switchTo = hwnd;
+            SendMessageW( switchTo, WM_CHILDACTIVATE, 0, 0 );
+	}
+
         MDI_PostUpdate(client, ci, SB_BOTH+1);
         break;
 
@@ -1613,7 +1674,7 @@
     case WM_SYSCHAR:
         if (wParam == '-')
         {
-            SendMessageW( hwnd, WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (DWORD)VK_SPACE);
+            SendMessageW( hwnd, WM_SYSCOMMAND, SC_KEYMENU, VK_SPACE);
             return 0;
         }
         break;
@@ -1716,7 +1777,7 @@
                 return 0;
             }
             TRACE("wParam = %04lx\n", wParam);
-            SendMessageW(ci->hwndActiveChild, WM_SYSCOMMAND, wParam, (LPARAM)msg->wParam);
+            SendMessageW(ci->hwndActiveChild, WM_SYSCOMMAND, wParam, msg->wParam);
             return 1;
         }
     }
@@ -1903,6 +1964,14 @@
     return 0;
 }
 
+/***********************************************************************
+ *              CascadeChildWindows (USER32.@)
+ */
+WORD WINAPI CascadeChildWindows( HWND parent, UINT flags )
+{
+    return CascadeWindows( parent, flags, NULL, 0, NULL );
+}
+
 
 /******************************************************************************
  *		TileWindows (USER32.@) Tiles MDI child windows
@@ -1918,6 +1987,15 @@
     FIXME("(%p,0x%08x,...,%u,...): stub\n", hwndParent, wFlags, cKids);
     return 0;
 }
+
+/***********************************************************************
+ *              TileChildWindows (USER32.@)
+ */
+WORD WINAPI TileChildWindows( HWND parent, UINT flags )
+{  
+    return TileWindows( parent, flags, NULL, 0, NULL );
+}
+
 
 /************************************************************************
  *              "More Windows..." functionality
@@ -2022,7 +2100,6 @@
     if (template == 0)
         return 0;
 
-    return (HWND) DialogBoxIndirectParamA(User32Instance,
-                                          (const DLGTEMPLATE*) template,
-                                          hwnd, MDI_MoreWindowsDlgProc, (LPARAM) hwnd);
-}
+    return (HWND) DialogBoxIndirectParamA(User32Instance, template, hwnd,
+                                          MDI_MoreWindowsDlgProc, (LPARAM) hwnd);
+}

Modified: trunk/reactos/dll/win32/user32/windows/window.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/window.c?rev=45995&r1=45994&r2=45995&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] Sun Mar  7 22:18:52 2010
@@ -100,17 +100,6 @@
 SwitchToThisWindow(HWND hwnd, BOOL fUnknown)
 {
     ShowWindow(hwnd, SW_SHOW);
-}
-
-
-/*
- * @implemented
- */
-WORD
-WINAPI
-CascadeChildWindows ( HWND hWndParent, WORD wFlags )
-{
-  return CascadeWindows(hWndParent, wFlags, NULL, 0, NULL);
 }
 
 
@@ -1985,16 +1974,6 @@
 /*
  * @implemented
  */
-WORD
-WINAPI
-TileChildWindows(HWND hWndParent, WORD wFlags)
-{
-    return TileWindows(hWndParent, wFlags, NULL, 0, NULL);
-}
-
-/*
- * @implemented
- */
 BOOL WINAPI
 AnyPopup(VOID)
 {

Modified: trunk/reactos/media/doc/README.WINE
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=45995&r1=45994&r2=45995&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sun Mar  7 22:18:52 2010
@@ -250,7 +250,7 @@
 
   reactos/dll/win32/user32/windows/defwnd.c     # Forked
   reactos/dll/win32/user32/windows/draw.c       # Forked at Wine-20020904 (uitools.c)
-  reactos/dll/win32/user32/windows/mdi.c        # Synced at 20060703
+  reactos/dll/win32/user32/windows/mdi.c        # Synced to Wine-1_1_40
   reactos/dll/win32/user32/windows/menu.c       # Forked
   reactos/dll/win32/user32/windows/messagebox.c # Forked
   reactos/dll/win32/user32/windows/rect.c       # Forked (uitools.c)




More information about the Ros-diffs mailing list