Author: jimtabor
Date: Mon May 26 01:26:45 2014
New Revision: 63455
URL:
http://svn.reactos.org/svn/reactos?rev=63455&view=rev
Log:
[Win32k]
- Fix G/SetSystemMenu. Move code into menu.c.
- Add loading for MDI system menu.
Modified:
trunk/reactos/win32ss/include/ntuser.h
trunk/reactos/win32ss/user/ntuser/menu.c
trunk/reactos/win32ss/user/ntuser/menu.h
trunk/reactos/win32ss/user/ntuser/window.c
trunk/reactos/win32ss/user/user32/windows/menu.c
Modified: trunk/reactos/win32ss/include/ntuser.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/include/ntuser.h?r…
==============================================================================
--- trunk/reactos/win32ss/include/ntuser.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/include/ntuser.h [iso-8859-1] Mon May 26 01:26:45 2014
@@ -345,6 +345,8 @@
#define MNF_DESKTOPMN 0x0040
#define MNF_SYSDESKMN 0x0080
#define MNF_SYSSUBMENU 0x0100
+// Hack
+#define MNF_SYSMENU 0x0200
typedef struct tagMENU
{
Modified: trunk/reactos/win32ss/user/ntuser/menu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/menu.c…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/menu.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/menu.c [iso-8859-1] Mon May 26 01:26:45 2014
@@ -915,7 +915,7 @@
}
}
- if( !(MenuObject->fFlags & MNF_SYSDESKMN) &&
+ if( !(MenuObject->fFlags & MNF_SYSMENU) &&
!MenuItem->Xlpstr &&
!lpmii->dwTypeData &&
!(MenuItem->fType & MFT_OWNERDRAW) &&
@@ -1430,7 +1430,7 @@
return (HMENU)0;
}
Menu = IntCreateMenu(&Handle, !PopupMenu);
- if (Menu->head.rpdesk->rpwinstaParent != WinStaObject)
+ if (Menu && Menu->head.rpdesk->rpwinstaParent != WinStaObject)
{
ERR("Desktop Window Station does not match Process one!\n");
}
@@ -1658,6 +1658,183 @@
return TRUE;
}
+PMENU FASTCALL MENU_GetSystemMenu(PWND Window, PMENU Popup)
+{
+ PMENU Menu, NewMenu = NULL, SysMenu = NULL;
+ HMENU hSysMenu, hNewMenu = NULL;
+ ROSMENUITEMINFO ItemInfoSet = {0};
+ ROSMENUITEMINFO ItemInfo = {0};
+ UNICODE_STRING MenuName;
+
+ hSysMenu = UserCreateMenu(FALSE);
+ if (NULL == hSysMenu)
+ {
+ return NULL;
+ }
+ SysMenu = IntGetMenuObject(hSysMenu);
+ if (NULL == SysMenu)
+ {
+ UserDestroyMenu(hSysMenu);
+ return NULL;
+ }
+
+ SysMenu->fFlags |= MNF_SYSMENU;
+ SysMenu->hWnd = Window->head.h;
+
+ if (!Popup)
+ {
+ //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_SYSMENU | 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);
+
+ IntReleaseMenuObject(NewMenu);
+ UserSetMenuDefaultItem(NewMenu, SC_CLOSE, FALSE);
+
+ IntDestroyMenuObject(Menu, FALSE, TRUE);
+ }
+ else
+ {
+ NewMenu = Popup;
+ }
+ if (NewMenu)
+ {
+ NewMenu->fFlags |= MNF_SYSMENU | MNF_POPUP;
+
+ 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 = UserHMGetHandle(NewMenu);
+ IntInsertMenuItem(SysMenu, (UINT) -1, TRUE, &ItemInfo, NULL);
+
+ return SysMenu;
+ }
+ ERR("failed to load system menu!\n");
+ return NULL;
+}
+
+PMENU FASTCALL
+IntGetSystemMenu(PWND Window, BOOL bRevert)
+{
+ PMENU Menu;
+
+ if (bRevert)
+ {
+ if (Window->SystemMenu)
+ {
+ Menu = UserGetMenuObject(Window->SystemMenu);
+ if (Menu && !(Menu->fFlags & MNF_SYSDESKMN))
+ {
+ IntDestroyMenuObject(Menu, TRUE, TRUE);
+ Window->SystemMenu = NULL;
+ }
+ }
+ }
+ else
+ {
+ Menu = Window->SystemMenu ? UserGetMenuObject(Window->SystemMenu) : NULL;
+ if ((!Window->SystemMenu || Menu->fFlags & MNF_SYSDESKMN) &&
Window->style & WS_SYSMENU)
+ {
+ Menu = MENU_GetSystemMenu(Window, NULL);
+ Window->SystemMenu = Menu ? UserHMGetHandle(Menu) : NULL;
+ }
+ }
+
+ if (Window->SystemMenu)
+ {
+ HMENU hMenu = IntGetSubMenu( Window->SystemMenu, 0);
+ /* Store the dummy sysmenu handle to facilitate the refresh */
+ /* of the close button if the SC_CLOSE item change */
+ Menu = UserGetMenuObject(hMenu);
+ if (Menu)
+ {
+ Menu->spwndNotify = Window;
+ Menu->fFlags |= MNF_SYSSUBMENU;
+ }
+ return Menu;
+ }
+ return NULL;
+}
+
+BOOL FASTCALL
+IntSetSystemMenu(PWND Window, PMENU Menu)
+{
+ PMENU OldMenu;
+
+ if (!(Window->style & WS_SYSMENU)) return FALSE;
+
+ if (Window->SystemMenu)
+ {
+ OldMenu = UserGetMenuObject(Window->SystemMenu);
+ if (OldMenu)
+ {
+ OldMenu->fFlags &= ~MNF_SYSMENU;
+ IntDestroyMenuObject(OldMenu, TRUE, TRUE);
+ }
+ }
+
+ OldMenu = MENU_GetSystemMenu(Window, Menu);
+ if (OldMenu)
+ { // Use spmenuSys too!
+ Window->SystemMenu = UserHMGetHandle(OldMenu);
+ }
+ else
+ Window->SystemMenu = NULL;
+
+ if (Menu && Window != Menu->spwndNotify)
+ {
+ Menu->spwndNotify = Window;
+ }
+
+ return TRUE;
+}
+
+
/* FUNCTIONS *****************************************************************/
/*
@@ -1712,6 +1889,107 @@
CLEANUP:
TRACE("Leave NtUserDeleteMenu, ret=%i\n",_ret_);
+ UserLeave();
+ 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)))
+ {
+ 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 and Up the Lock Count.
+ */
+ if (!(Menu = IntGetMenuObject(hMenu)))
+ {
+ RETURN( FALSE);
+ }
+
+ Result = IntSetSystemMenu(Window, Menu);
+ }
+ else
+ EngSetLastError(ERROR_INVALID_MENU_HANDLE);
+
+ RETURN( Result);
+
+CLEANUP:
+ TRACE("Leave NtUserSetSystemMenu, ret=%i\n",_ret_);
UserLeave();
END_CLEANUP;
}
@@ -1908,7 +2186,7 @@
break;
case OBJID_SYSMENU:
if (!(pWnd->style & WS_SYSMENU)) RETURN(FALSE);
- Menu = IntGetSystemMenu(pWnd, FALSE, FALSE);
+ Menu = IntGetSystemMenu(pWnd, FALSE);
hMenu = Menu->head.h;
break;
default:
Modified: trunk/reactos/win32ss/user/ntuser/menu.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/menu.h…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/menu.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/menu.h [iso-8859-1] Mon May 26 01:26:45 2014
@@ -41,7 +41,7 @@
IntInsertMenuItem(_In_ PMENU MenuObject, UINT uItem, BOOL fByPosition, PROSMENUITEMINFO
ItemInfo, PUNICODE_STRING lpstr);
PMENU FASTCALL
-IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu);
+IntGetSystemMenu(PWND Window, BOOL bRevert);
UINT FASTCALL IntFindSubMenu(HMENU *hMenu, HMENU hSubTarget );
UINT FASTCALL IntGetMenuState( HMENU hMenu, UINT uId, UINT uFlags);
Modified: trunk/reactos/win32ss/user/ntuser/window.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/window…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/window.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/window.c [iso-8859-1] Mon May 26 01:26:45 2014
@@ -895,148 +895,6 @@
}
}
-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)
{
@@ -1448,32 +1306,6 @@
}
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. */
@@ -1784,7 +1616,6 @@
PWND pWnd = NULL;
HWND hWnd;
PTHREADINFO pti = NULL;
- PMENU SystemMenu;
BOOL MenuChanged;
BOOL bUnicodeWindow;
@@ -2012,22 +1843,13 @@
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;
@@ -2338,15 +2160,15 @@
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)
{
@@ -3679,105 +3501,6 @@
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)
Modified: trunk/reactos/win32ss/user/user32/windows/menu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/window…
==============================================================================
--- trunk/reactos/win32ss/user/user32/windows/menu.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/user32/windows/menu.c [iso-8859-1] Mon May 26 01:26:45
2014
@@ -70,10 +70,10 @@
#define IS_MAGIC_BITMAP(id) ((id) && ((INT_PTR)(id) < 12) &&
((INT_PTR)(id) >= -1))
#define IS_SYSTEM_MENU(MenuInfo) \
- (0 == ((MenuInfo)->fFlags & MNF_POPUP) && 0 != ((MenuInfo)->fFlags
& MNF_SYSDESKMN))
+ (0 == ((MenuInfo)->fFlags & MNF_POPUP) && 0 != ((MenuInfo)->fFlags
& MNF_SYSMENU))
#define IS_SYSTEM_POPUP(MenuInfo) \
- (0 != ((MenuInfo)->fFlags & MNF_POPUP) && 0 != ((MenuInfo)->fFlags
& MNF_SYSDESKMN))
+ (0 != ((MenuInfo)->fFlags & MNF_POPUP) && 0 != ((MenuInfo)->fFlags
& MNF_SYSMENU))
#define IS_BITMAP_ITEM(flags) (MF_BITMAP == MENU_ITEM_TYPE(flags))
@@ -902,7 +902,7 @@
}
Flags |= menu->fFlags & MNF_POPUP ? MF_POPUP : 0;
- Flags |= menu->fFlags & MNF_SYSDESKMN ? MF_SYSMENU : 0;
+ Flags |= menu->fFlags & MNF_SYSMENU ? MF_SYSMENU : 0;
MenuChar = SendMessageW( WndOwner, WM_MENUCHAR,
MAKEWPARAM(Key, Flags), (LPARAM) hmenu);
@@ -1257,7 +1257,11 @@
MENU_GetMaxPopupHeight(PROSMENUINFO lppop)
{
if (lppop->cyMax)
+ {
+ //ERR("MGMaxPH cyMax %d\n",lppop->cyMax);
return lppop->cyMax;
+ }
+ //ERR("MGMaxPH SyMax %d\n",GetSystemMetrics(SM_CYSCREEN) -
GetSystemMetrics(SM_CYBORDER));
return GetSystemMetrics(SM_CYSCREEN) - GetSystemMetrics(SM_CYBORDER);
}
@@ -1844,13 +1848,14 @@
/* process text if present */
if (lpitem->lpstr)
{
- register int i = 0;
+ int i = 0;
HFONT hfontOld = 0;
+
UINT uFormat = menuBar ?
DT_CENTER | DT_VCENTER | DT_SINGLELINE :
DT_LEFT | DT_VCENTER | DT_SINGLELINE;
- if((MenuInfo->dwStyle & MNS_CHECKORBMP))
+ if ((MenuInfo->dwStyle & MNS_CHECKORBMP))
rect.left += max(0, (int)(MenuInfo->cxTextAlign -
GetSystemMetrics(SM_CXMENUCHECK)));
else
rect.left += MenuInfo->cxTextAlign;
@@ -1861,8 +1866,13 @@
}
if (menuBar) {
- rect.left += MENU_BAR_ITEMS_SPACE / 2;
- rect.right -= MENU_BAR_ITEMS_SPACE / 2;
+ if( lpitem->hbmpItem)
+ rect.left += lpitem->maxBmpSize.cx;
+ if( !(lpitem->hbmpItem == HBMMENU_CALLBACK))
+ rect.left += MenuCharSize.cx;
+ rect.right -= MenuCharSize.cx;
+ //rect.left += MENU_BAR_ITEMS_SPACE / 2;
+ //rect.right -= MENU_BAR_ITEMS_SPACE / 2;
}
Text = lpitem->lpstr;
@@ -1911,8 +1921,8 @@
--rect.left; --rect.top; --rect.right; --rect.bottom;
}
SetTextColor(hdc, RGB(0x80, 0x80, 0x80));
- }
- DrawTextW( hdc, Text + i + 1, -1, &rect, uFormat );
+ }
+ DrawTextW( hdc, Text + i + 1, -1, &rect, uFormat );
}
if (hfontOld)
@@ -1961,6 +1971,7 @@
UINT u;
MenuInitRosMenuItemInfo(&ItemInfo);
+ //for (u = MenuInfo.cItems; u > 0; u--, item++)
for (u = 0; u < MenuInfo.cItems; u++)
{
if (MenuGetRosMenuItemInfo(MenuInfo.Self, u, &ItemInfo))
@@ -1972,7 +1983,9 @@
}
/* draw scroll arrows */
if (MenuInfo.dwArrowsOn)
+ {
MENU_DrawScrollArrows(&MenuInfo, hdc);
+ }
MenuSetRosMenuInfo(&MenuInfo);
MenuCleanupRosMenuItemInfo(&ItemInfo);
@@ -2013,7 +2026,7 @@
if (hfontOld) SelectObject( hDC, hfontOld);
return lppop.cyMenu;
}
- else
+ else
return DrawMenuBarTemp(hwnd, hDC, lprect, hMenu, NULL);
}
@@ -2185,6 +2198,7 @@
ScrollWindow(lppop->Wnd, 0, nOldPos - lppop->iTop, &rc, &rc);
MENU_DrawScrollArrows(lppop, hdc);
}
+ MenuSetRosMenuInfo(lppop);
}
}
@@ -2248,7 +2262,7 @@
WPARAM wParam = MAKEWPARAM( ItemInfo.hSubMenu ? wIndex : ItemInfo.wID,
ItemInfo.fType | ItemInfo.fState |
(ItemInfo.hSubMenu ? MF_POPUP : 0) |
- (hmenu->fFlags & MNF_SYSDESKMN ?
MF_SYSMENU : 0 ) );
+ (hmenu->fFlags & MNF_SYSMENU ?
MF_SYSMENU : 0 ) );
SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) hmenu->Self);
}
@@ -2267,7 +2281,7 @@
{
WPARAM wParam = MAKEWPARAM( Pos, ItemInfo.fType | ItemInfo.fState |
(ItemInfo.hSubMenu ? MF_POPUP : 0) |
- (TopMenuInfo.fFlags & MNF_SYSDESKMN ?
MF_SYSMENU : 0 ) );
+ (TopMenuInfo.fFlags & MNF_SYSMENU ?
MF_SYSMENU : 0 ) );
SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) topmenu);
}
@@ -3065,7 +3079,7 @@
do not send a message to the owner */
if (0 == (Flags & TPM_RETURNCMD))
{
- if (0 != (MenuInfo->fFlags & MNF_SYSDESKMN))
+ if (0 != (MenuInfo->fFlags & MNF_SYSMENU))
{
PostMessageW(Mt->OwnerWnd, WM_SYSCOMMAND, ItemInfo.wID,
MAKELPARAM((SHORT) Mt->Pt.x, (SHORT) Mt->Pt.y));
@@ -3250,7 +3264,7 @@
if (ht != HTNOWHERE && ht != HTERROR) ret = hMenu;
}
else if (ht == HTSYSMENU)
- ret = NtUserGetSystemMenu(menu->hWnd, FALSE);
+ ret = get_win_sys_menu(menu->hWnd);
else if (ht == HTMENU)
ret = GetMenu( menu->hWnd );
}
@@ -3398,7 +3412,7 @@
else if (0 != (Style & WS_SYSMENU))
{
/* switch to the system menu */
- NewMenu = NtUserGetSystemMenu(NewWnd, FALSE);
+ NewMenu = get_win_sys_menu(NewWnd);
}
else
{
@@ -3415,10 +3429,10 @@
DWORD Style = GetWindowLongPtrW(NewWnd, GWL_STYLE);
if (0 != (Style & WS_SYSMENU)
- && GetSystemMenu(NewWnd, FALSE) == NewMenu)
+ && get_win_sys_menu(NewWnd) == NewMenu)
{
/* get the real system menu */
- NewMenu = NtUserGetSystemMenu(NewWnd, FALSE);
+ NewMenu = get_win_sys_menu(NewWnd);
}
else if (0 != (Style & WS_CHILD) || GetMenu(NewWnd) != NewMenu)
{
@@ -4081,7 +4095,7 @@
IntNotifyWinEvent( EVENT_SYSTEM_MENUSTART,
hWnd,
- MenuInfo.fFlags & MNF_SYSDESKMN ? OBJID_SYSMENU : OBJID_MENU,
+ MenuInfo.fFlags & MNF_SYSMENU ? OBJID_SYSMENU : OBJID_MENU,
CHILDID_SELF, 0);
return TRUE;
}
@@ -4108,7 +4122,7 @@
*/
VOID MenuTrackMouseMenuBar( HWND hWnd, ULONG ht, POINT pt)
{
- HMENU hMenu = (ht == HTSYSMENU) ? NtUserGetSystemMenu( hWnd, FALSE) : GetMenu(hWnd);
+ HMENU hMenu = (ht == HTSYSMENU) ? get_win_sys_menu( hWnd ) : GetMenu(hWnd);
UINT wFlags = TPM_BUTTONDOWN | TPM_LEFTALIGN | TPM_LEFTBUTTON;
TRACE("wnd=%p ht=0x%04x (%ld,%ld)\n", hWnd, ht, pt.x, pt.y);
@@ -4124,6 +4138,8 @@
}
MenuInitTracking(hWnd, hMenu, FALSE, wFlags);
+ /* fetch the window menu again, it may have changed */
+ hMenu = (ht == HTSYSMENU) ? get_win_sys_menu( hWnd ) : GetMenu( hWnd );
MenuTrackMenu(hMenu, wFlags, pt.x, pt.y, hWnd, NULL);
MenuExitTracking(hWnd, FALSE);
}
@@ -4155,7 +4171,7 @@
if (!hTrackMenu || IsIconic(hwnd) || wChar == ' ' )
{
if (!(GetWindowLongPtrW( hwnd, GWL_STYLE ) & WS_SYSMENU)) return;
- hTrackMenu = NtUserGetSystemMenu(hwnd, FALSE);
+ hTrackMenu = get_win_sys_menu(hwnd);
uItem = 0;
wParam |= HTSYSMENU; /* prevent item lookup */
}
@@ -4432,6 +4448,44 @@
}
}
+HMENU FASTCALL MENU_LoadSystemMenu(BOOL mdi)
+{
+ HMENU hmenu = LoadMenuW(User32Instance, L"SYSMENU");
+
+ if (hmenu)
+ {
+ MENUINFO menuinfo = {0};
+ MENUITEMINFOW info = {0};
+ //WCHAR buf[128];
+
+ // removing space for checkboxes from menu
+ menuinfo.cbSize = sizeof(menuinfo);
+ menuinfo.fMask = MIM_STYLE;
+ GetMenuInfo(hmenu, &menuinfo);
+ menuinfo.dwStyle |= MNS_CHECKORBMP;
+ SetMenuInfo(hmenu, &menuinfo);
+
+ // adding bitmaps to menu items
+ info.cbSize = sizeof(info);
+ info.fMask |= MIIM_BITMAP;
+ info.hbmpItem = HBMMENU_POPUP_MINIMIZE;
+ SetMenuItemInfoW(hmenu, SC_MINIMIZE, FALSE, &info);
+ info.hbmpItem = HBMMENU_POPUP_RESTORE;
+ SetMenuItemInfoW(hmenu, SC_RESTORE, FALSE, &info);
+ info.hbmpItem = HBMMENU_POPUP_MAXIMIZE;
+ SetMenuItemInfoW(hmenu, SC_MAXIMIZE, FALSE, &info);
+ info.hbmpItem = HBMMENU_POPUP_CLOSE;
+ SetMenuItemInfoW(hmenu, SC_CLOSE, FALSE, &info);
+ if (mdi)
+ {
+ AppendMenuW(hmenu, MF_SEPARATOR, 0, NULL);
+ //LoadStringW(User32Instance, IDS_MDI_NEXT, buf, sizeof(buf)/sizeof(WCHAR));
+ //AppendMenuW(hmenu, MF_STRING, SC_NEXTWINDOW, buf);
+ }
+ }
+ return hmenu;
+}
+
NTSTATUS WINAPI
User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength)
{
@@ -5023,11 +5077,7 @@
HWND hWnd,
BOOL bRevert)
{
- HMENU TopMenu;
-
- TopMenu = NtUserGetSystemMenu(hWnd, bRevert);
-
- return NULL == TopMenu ? NULL : GetSubMenu(TopMenu, 0);
+ return NtUserGetSystemMenu(hWnd, bRevert);
}
/*