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/m…
==============================================================================
--- 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/w…
==============================================================================
--- 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=…
==============================================================================
--- 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)