}
}
-PMENU FASTCALL
-IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
-{
- PMENU Menu, NewMenu = NULL, SysMenu = NULL, ret = NULL;
- PTHREADINFO W32Thread;
- HMENU hNewMenu, hSysMenu;
- ROSMENUITEMINFO ItemInfoSet = {0};
- ROSMENUITEMINFO ItemInfo = {0};
- UNICODE_STRING MenuName;
-
- if(bRevert)
- {
- W32Thread = PsGetCurrentThreadWin32Thread();
-
- if(!W32Thread->rpdesk)
- return NULL;
-
- if(Window->SystemMenu)
- {
- Menu = UserGetMenuObject(Window->SystemMenu);
- if(Menu)
- {
- IntDestroyMenuObject(Menu, TRUE, TRUE);
- Window->SystemMenu = (HMENU)0;
- }
- }
-
- if(W32Thread->rpdesk->rpwinstaParent->SystemMenuTemplate)
- {
- /* Clone system menu */
- Menu = UserGetMenuObject(W32Thread->rpdesk->rpwinstaParent->SystemMenuTemplate);
- if(!Menu)
- return NULL;
-
- NewMenu = IntCloneMenu(Menu);
- if(NewMenu)
- { // Use spmenuSys
- Window->SystemMenu = NewMenu->head.h;
- NewMenu->fFlags |= MNF_SYSDESKMN;
- NewMenu->hWnd = Window->head.h;
- ret = NewMenu;
- //IntReleaseMenuObject(NewMenu);
- }
- }
- else
- {
- hSysMenu = UserCreateMenu(FALSE);
- if (NULL == hSysMenu)
- {
- return NULL;
- }
- SysMenu = IntGetMenuObject(hSysMenu);
- if (NULL == SysMenu)
- {
- UserDestroyMenu(hSysMenu);
- return NULL;
- }
- SysMenu->fFlags |= MNF_SYSDESKMN;
- SysMenu->hWnd = Window->head.h;
- //hNewMenu = co_IntLoadSysMenuTemplate();
- //if ( Window->ExStyle & WS_EX_MDICHILD )
- //{
- // RtlInitUnicodeString( &MenuName, L"SYSMENUMDI");
- // hNewMenu = co_IntCallLoadMenu( hModClient, &MenuName);
- //}
- //else
- {
- RtlInitUnicodeString( &MenuName, L"SYSMENU");
- hNewMenu = co_IntCallLoadMenu( hModClient, &MenuName);
- //ERR("%wZ\n",&MenuName);
- }
- if(!hNewMenu)
- {
- ERR("No Menu!!\n");
- IntReleaseMenuObject(SysMenu);
- UserDestroyMenu(hSysMenu);
- return NULL;
- }
- Menu = IntGetMenuObject(hNewMenu);
- if(!Menu)
- {
- IntReleaseMenuObject(SysMenu);
- UserDestroyMenu(hSysMenu);
- return NULL;
- }
-
- // Do the rest in here.
-
- Menu->fFlags |= MNS_CHECKORBMP | MNF_SYSDESKMN | MNF_POPUP;
-
- ItemInfoSet.cbSize = sizeof( MENUITEMINFOW);
- ItemInfoSet.fMask = MIIM_BITMAP;
- ItemInfoSet.hbmpItem = HBMMENU_POPUP_CLOSE;
- IntMenuItemInfo(Menu, SC_CLOSE, FALSE, &ItemInfoSet, TRUE, NULL);
- ItemInfoSet.hbmpItem = HBMMENU_POPUP_RESTORE;
- IntMenuItemInfo(Menu, SC_RESTORE, FALSE, &ItemInfoSet, TRUE, NULL);
- ItemInfoSet.hbmpItem = HBMMENU_POPUP_MAXIMIZE;
- IntMenuItemInfo(Menu, SC_MAXIMIZE, FALSE, &ItemInfoSet, TRUE, NULL);
- ItemInfoSet.hbmpItem = HBMMENU_POPUP_MINIMIZE;
- IntMenuItemInfo(Menu, SC_MINIMIZE, FALSE, &ItemInfoSet, TRUE, NULL);
-
- NewMenu = IntCloneMenu(Menu);
- if(NewMenu)
- {
- NewMenu->fFlags |= MNF_SYSDESKMN | MNF_POPUP;
- // Do not set MNS_CHECKORBMP it breaks menus, also original code destroyed the style anyway.
- IntReleaseMenuObject(NewMenu);
- UserSetMenuDefaultItem(NewMenu, SC_CLOSE, FALSE);
-
- if (Window->pcls->style & CS_NOCLOSE)
- IntRemoveMenuItem(NewMenu, SC_CLOSE, MF_BYCOMMAND, TRUE);
-
- ItemInfo.cbSize = sizeof(MENUITEMINFOW);
- ItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU;
- ItemInfo.fType = 0;
- ItemInfo.fState = MFS_ENABLED;
- ItemInfo.dwTypeData = NULL;
- ItemInfo.cch = 0;
- ItemInfo.hSubMenu = NewMenu->head.h;
- IntInsertMenuItem(SysMenu, (UINT) -1, TRUE, &ItemInfo, NULL);
-
- Window->SystemMenu = SysMenu->head.h;
-
- ret = SysMenu;
- }
- IntDestroyMenuObject(Menu, FALSE, TRUE);
- }
- if(RetMenu)
- return ret;
- else
- return NULL;
- }
- else
- {
- if(Window->SystemMenu)
- return IntGetMenuObject((HMENU)Window->SystemMenu);
- else
- return NULL;
- }
-}
-
-
BOOL FASTCALL
IntIsChildWindow(PWND Parent, PWND BaseWindow)
{
return( hWndOldParent);
}
-BOOL FASTCALL
-IntSetSystemMenu(PWND Window, PMENU Menu)
-{
- PMENU OldMenu;
- if(Window->SystemMenu)
- {
- OldMenu = IntGetMenuObject(Window->SystemMenu);
- if(OldMenu)
- {
- OldMenu->fFlags &= ~ MNF_SYSDESKMN;
- IntReleaseMenuObject(OldMenu);
- }
- }
-
- if(Menu)
- {
- /* FIXME: Check window style, propably return FALSE? */
- Window->SystemMenu = Menu->head.h;
- Menu->fFlags |= MNF_SYSDESKMN;
- }
- else // Use spmenuSys too!
- Window->SystemMenu = (HMENU)0;
-
- return TRUE;
-}
-
/* Unlink the window from siblings. children and parent are kept in place. */
VOID FASTCALL
IntUnlinkWindow(PWND Wnd)
PWND pWnd = NULL;
HWND hWnd;
PTHREADINFO pti = NULL;
- PMENU SystemMenu;
BOOL MenuChanged;
BOOL bUnicodeWindow;
if (!(pWnd->style & (WS_CHILD | WS_POPUP)))
pWnd->state |= WNDS_SENDSIZEMOVEMSGS;
- /* Create system menu */
- if ((Cs->style & WS_SYSMENU)) // && (dwStyle & WS_CAPTION) == WS_CAPTION)
- {
- SystemMenu = IntGetSystemMenu(pWnd, TRUE, TRUE);
- if(SystemMenu)
- { // spmenuSys
- pWnd->SystemMenu = SystemMenu->head.h;
- IntReleaseMenuObject(SystemMenu);
- }
- }
-
/* Set the window menu */
if ((Cs->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)
{
- if (Cs->hMenu)
+ if (Cs->hMenu)
+ {
IntSetMenu(pWnd, Cs->hMenu, &MenuChanged);
+ }
else if (pWnd->pcls->lpszMenuName) // Take it from the parent.
{
UNICODE_STRING MenuName;
Window->rcWindow.top = Cs->y;
Window->rcWindow.right = Cs->x + Size.cx;
Window->rcWindow.bottom = Cs->y + Size.cy;
-/*
+ /*
if (0 != (Window->style & WS_CHILD) && ParentWindow)
{
-// ERR("co_UserCreateWindowEx(): Offset rcWindow\n");
+ ERR("co_UserCreateWindowEx(): Offset rcWindow\n");
RECTL_vOffsetRect(&Window->rcWindow,
ParentWindow->rcClient.left,
ParentWindow->rcClient.top);
}
-*/
+ */
/* correct child window coordinates if mirroring on parent is enabled */
if (ParentWindow != NULL)
{
END_CLEANUP;
}
-/*
- * NtUserGetSystemMenu
- *
- * The NtUserGetSystemMenu function allows the application to access the
- * window menu (also known as the system menu or the control menu) for
- * copying and modifying.
- *
- * Parameters
- * hWnd
- * Handle to the window that will own a copy of the window menu.
- * bRevert
- * Specifies the action to be taken. If this parameter is FALSE,
- * NtUserGetSystemMenu returns a handle to the copy of the window menu
- * currently in use. The copy is initially identical to the window menu
- * but it can be modified.
- * If this parameter is TRUE, GetSystemMenu resets the window menu back
- * to the default state. The previous window menu, if any, is destroyed.
- *
- * Return Value
- * If the bRevert parameter is FALSE, the return value is a handle to a
- * copy of the window menu. If the bRevert parameter is TRUE, the return
- * value is NULL.
- *
- * Status
- * @implemented
- */
-
-HMENU APIENTRY
-NtUserGetSystemMenu(HWND hWnd, BOOL bRevert)
-{
- PWND Window;
- PMENU Menu;
- DECLARE_RETURN(HMENU);
-
- TRACE("Enter NtUserGetSystemMenu\n");
- UserEnterShared();
-
- if (!(Window = UserGetWindowObject(hWnd)))
- {
- RETURN(NULL);
- }
-
- if (!(Menu = IntGetSystemMenu(Window, bRevert, FALSE)))
- {
- RETURN(NULL);
- }
-
- RETURN(Menu->head.h);
-
-CLEANUP:
- TRACE("Leave NtUserGetSystemMenu, ret=%p\n", _ret_);
- UserLeave();
- END_CLEANUP;
-}
-
-/*
- * NtUserSetSystemMenu
- *
- * Status
- * @implemented
- */
-
-BOOL APIENTRY
-NtUserSetSystemMenu(HWND hWnd, HMENU hMenu)
-{
- BOOL Result = FALSE;
- PWND Window;
- PMENU Menu;
- DECLARE_RETURN(BOOL);
-
- TRACE("Enter NtUserSetSystemMenu\n");
- UserEnterExclusive();
-
- if (!(Window = UserGetWindowObject(hWnd)))
- {
- RETURN( FALSE);
- }
-
- if (hMenu)
- {
- /*
- * Assign new menu handle.
- */
- if (!(Menu = UserGetMenuObject(hMenu)))
- {
- RETURN( FALSE);
- }
-
- Result = IntSetSystemMenu(Window, Menu);
- }
-
- RETURN( Result);
-
-CLEANUP:
- TRACE("Leave NtUserSetSystemMenu, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
-}
-
// Fixes wine Win test_window_styles and todo tests...
static BOOL FASTCALL
IntCheckFrameEdge(ULONG Style, ULONG ExStyle)