- Moved to new menu structures, synced in wine code and started first phase to server side. Resulting that more tests are running and failing less. Unplugged ntuser bad functions.
- See CORE-5605, CORE-7447, CORE-7967, CORE-8098 and CORE-8107

svn path=/trunk/; revision=63027
This commit is contained in:
James Tabor 2014-04-28 03:55:23 +00:00
parent 2a6fbc8f80
commit 9e6fb311ed
9 changed files with 2440 additions and 1617 deletions

View file

@ -5,6 +5,7 @@ typedef struct _PROCESSINFO *PPROCESSINFO;
typedef struct _THREADINFO *PTHREADINFO; typedef struct _THREADINFO *PTHREADINFO;
struct _DESKTOP; struct _DESKTOP;
struct _WND; struct _WND;
struct tagPOPUPMENU;
#define FIRST_USER_HANDLE 0x0020 /* first possible value for low word of user handle */ #define FIRST_USER_HANDLE 0x0020 /* first possible value for low word of user handle */
#define LAST_USER_HANDLE 0xffef /* last possible value for low word of user handle */ #define LAST_USER_HANDLE 0xffef /* last possible value for low word of user handle */
@ -313,7 +314,7 @@ typedef struct tagITEM
struct tagMENU* spSubMenu; /* Pop-up menu. */ struct tagMENU* spSubMenu; /* Pop-up menu. */
HANDLE hbmpChecked; HANDLE hbmpChecked;
HANDLE hbmpUnchecked; HANDLE hbmpUnchecked;
USHORT* lpstr; /* Item text pointer. */ USHORT* Xlpstr; /* Item text pointer. */
ULONG cch; ULONG cch;
DWORD_PTR dwItemData; DWORD_PTR dwItemData;
ULONG xItem; /* Item position. left */ ULONG xItem; /* Item position. left */
@ -326,6 +327,9 @@ typedef struct tagITEM
HBITMAP hbmp; /* bitmap */ HBITMAP hbmp; /* bitmap */
INT cxBmp; /* Width Maximum size of the bitmap items in MIIM_BITMAP state */ INT cxBmp; /* Width Maximum size of the bitmap items in MIIM_BITMAP state */
INT cyBmp; /* Height " */ INT cyBmp; /* Height " */
//// ReactOS
UNICODE_STRING lpstr;
struct tagITEM *Next;
} ITEM, *PITEM; } ITEM, *PITEM;
typedef struct tagMENULIST typedef struct tagMENULIST
@ -347,7 +351,7 @@ typedef struct tagMENU
{ {
PROCDESKHEAD head; PROCDESKHEAD head;
ULONG fFlags; /* [Style flags | Menu flags] */ ULONG fFlags; /* [Style flags | Menu flags] */
INT iItem; /* nPos of selected item, if -1 not selected. */ INT iItem; /* nPos of selected item, if -1 not selected. AKA focused item */
UINT cAlloced; /* Number of allocated items. Inc's of 8 */ UINT cAlloced; /* Number of allocated items. Inc's of 8 */
UINT cItems; /* Number of items in the menu */ UINT cItems; /* Number of items in the menu */
ULONG cxMenu; /* Width of the whole menu */ ULONG cxMenu; /* Width of the whole menu */
@ -363,8 +367,54 @@ typedef struct tagMENU
INT iTop; /* Current scroll position Top */ INT iTop; /* Current scroll position Top */
INT iMaxTop; /* Current scroll position Max Top */ INT iMaxTop; /* Current scroll position Max Top */
DWORD dwArrowsOn:2; /* Arrows: 0 off, 1 on, 2 to the top, 3 to the bottom. */ DWORD dwArrowsOn:2; /* Arrows: 0 off, 1 on, 2 to the top, 3 to the bottom. */
//// ReactOS
LIST_ENTRY ListEntry;
HWND hWnd; /* Window containing the menu */
BOOL TimeToHide;
} MENU, *PMENU; } MENU, *PMENU;
typedef struct tagPOPUPMENU
{
ULONG fIsMenuBar:1;
ULONG fHasMenuBar:1;
ULONG fIsSysMenu:1;
ULONG fIsTrackPopup:1;
ULONG fDroppedLeft:1;
ULONG fHierarchyDropped:1;
ULONG fRightButton:1;
ULONG fToggle:1;
ULONG fSynchronous:1;
ULONG fFirstClick:1;
ULONG fDropNextPopup:1;
ULONG fNoNotify:1;
ULONG fAboutToHide:1;
ULONG fShowTimer:1;
ULONG fHideTimer:1;
ULONG fDestroyed:1;
ULONG fDelayedFree:1;
ULONG fFlushDelayedFree:1;
ULONG fFreed:1;
ULONG fInCancel:1;
ULONG fTrackMouseEvent:1;
ULONG fSendUninit:1;
ULONG fRtoL:1;
// ULONG fDesktopMenu:1;
ULONG iDropDir:5;
ULONG fUseMonitorRect:1;
struct _WND *spwndNotify;
struct _WND *spwndPopupMenu;
struct _WND *spwndNextPopup;
struct _WND *spwndPrevPopup;
PMENU spmenu;
PMENU spmenuAlternate;
struct _WND *spwndActivePopup;
struct tagPOPUPMENU *ppopupmenuRoot;
struct tagPOPUPMENU *ppmDelayedFree;
UINT posSelectedItem;
UINT posDropped;
} POPUPMENU, *PPOPUPMENU;
typedef struct _REGISTER_SYSCLASS typedef struct _REGISTER_SYSCLASS
{ {
/* This is a reactos specific class used to initialize the /* This is a reactos specific class used to initialize the
@ -657,6 +707,12 @@ typedef struct _SBWND
SBCALC SBCalc; SBCALC SBCalc;
} SBWND, *PSBWND; } SBWND, *PSBWND;
typedef struct _MENUWND
{
WND wnd;
PPOPUPMENU ppopupmenu;
} MENUWND, *PMENUWND;
typedef struct _PFNCLIENT typedef struct _PFNCLIENT
{ {
WNDPROC pfnScrollBarWndProc; WNDPROC pfnScrollBarWndProc;
@ -3371,16 +3427,20 @@ typedef struct tagROSMENUINFO
DWORD dwContextHelpID; DWORD dwContextHelpID;
ULONG_PTR dwMenuData; ULONG_PTR dwMenuData;
/* ----------- Extra ----------- */ /* ----------- Extra ----------- */
ULONG fFlags; /* Menu flags (MF_POPUP, MF_SYSMENU) */
UINT iItem; /* Currently focused item */
UINT cItems; /* Number of items in the menu */
WORD cxMenu; /* Width of the whole menu */
WORD cyMenu; /* Height of the whole menu */
ULONG cxTextAlign;
PWND spwndNotify; /* window receiving the messages for ownerdraw */
INT iTop;
INT iMaxTop;
DWORD dwArrowsOn:2;
HMENU Self; /* Handle of this menu */ HMENU Self; /* Handle of this menu */
WORD Flags; /* Menu flags (MF_POPUP, MF_SYSMENU) */
UINT FocusedItem; /* Currently focused item */
UINT MenuItemCount; /* Number of items in the menu */
HWND Wnd; /* Window containing the menu */ HWND Wnd; /* Window containing the menu */
WORD Width; /* Width of the whole menu */ BOOL TimeToHide; /* Request hiding when receiving a second click in the top-level menu item */
WORD Height; /* Height of the whole menu */
HWND WndOwner; /* window receiving the messages for ownerdraw */
BOOL TimeToHide; /* Request hiding when receiving a second click in the top-level menu item */
SIZE maxBmpSize; /* Maximum size of the bitmap items in MIIM_BITMAP state */
} ROSMENUINFO, *PROSMENUINFO; } ROSMENUINFO, *PROSMENUINFO;
BOOL BOOL
@ -3410,6 +3470,7 @@ typedef struct tagROSMENUITEMINFO
RECT Rect; /* Item area (relative to menu window) */ RECT Rect; /* Item area (relative to menu window) */
UINT dxTab; /* X position of text after Tab */ UINT dxTab; /* X position of text after Tab */
LPWSTR lpstr; /* Copy of the text pointer in MenuItem->Text */ LPWSTR lpstr; /* Copy of the text pointer in MenuItem->Text */
SIZE maxBmpSize; /* Maximum size of the bitmap items in MIIM_BITMAP state */
} ROSMENUITEMINFO, *PROSMENUITEMINFO; } ROSMENUITEMINFO, *PROSMENUITEMINFO;
BOOL BOOL

View file

@ -50,8 +50,7 @@ co_IntTranslateAccelerator(
UINT Mask = 0, nPos; UINT Mask = 0, nPos;
HWND hWnd; HWND hWnd;
HMENU hMenu, hSubMenu; HMENU hMenu, hSubMenu;
PMENU_OBJECT MenuObject, SubMenu; PMENU MenuObject;
PMENU_ITEM MenuItem;
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
@ -101,16 +100,11 @@ co_IntTranslateAccelerator(
hMenu = (Window->style & WS_CHILD) ? 0 : (HMENU)Window->IDMenu; hMenu = (Window->style & WS_CHILD) ? 0 : (HMENU)Window->IDMenu;
hSubMenu = NULL; hSubMenu = NULL;
MenuObject = IntGetMenuObject(hMenu); MenuObject = IntGetMenuObject(hMenu);
nPos = pAccel->cmd;
if (MenuObject) if (MenuObject)
{ {
nPos = IntGetMenuItemByFlag(MenuObject, if ((MENU_FindItem (&MenuObject, &nPos, MF_BYPOSITION)))
pAccel->cmd, hSubMenu = MenuObject->head.h;
MF_BYCOMMAND,
&SubMenu,
&MenuItem,
NULL);
if (nPos != (UINT) - 1)
hSubMenu = SubMenu->head.h;
else else
hMenu = NULL; hMenu = NULL;
} }
@ -120,16 +114,11 @@ co_IntTranslateAccelerator(
hMenu = Window->SystemMenu; hMenu = Window->SystemMenu;
hSubMenu = hMenu; /* system menu is a popup menu */ hSubMenu = hMenu; /* system menu is a popup menu */
MenuObject = IntGetMenuObject(hMenu); MenuObject = IntGetMenuObject(hMenu);
nPos = pAccel->cmd;
if (MenuObject) if (MenuObject)
{ {
nPos = IntGetMenuItemByFlag(MenuObject, if ((MENU_FindItem (&MenuObject, &nPos, MF_BYPOSITION)))
pAccel->cmd, hSubMenu = MenuObject->head.h;
MF_BYCOMMAND,
&SubMenu,
&MenuItem,
NULL);
if (nPos != (UINT) - 1)
hSubMenu = SubMenu->head.h;
else else
hMenu = NULL; hMenu = NULL;
} }

File diff suppressed because it is too large Load diff

View file

@ -10,32 +10,6 @@
#define MF_END (0x0080) #define MF_END (0x0080)
#endif #endif
typedef struct _MENU_ITEM
{
struct _MENU_ITEM *Next;
UINT fType;
UINT fState;
UINT wID;
HMENU hSubMenu;
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
ULONG_PTR dwItemData;
UNICODE_STRING Text;
HBITMAP hbmpItem;
RECTL Rect;
UINT dxTab;
} MENU_ITEM, *PMENU_ITEM;
typedef struct _MENU_OBJECT
{
PROCDESKHEAD head;
PEPROCESS Process;
LIST_ENTRY ListEntry;
PMENU_ITEM MenuItemList;
ROSMENUINFO MenuInfo;
BOOL RtoL;
} MENU_OBJECT, *PMENU_OBJECT;
typedef struct _SETMENUITEMRECT typedef struct _SETMENUITEMRECT
{ {
UINT uItem; UINT uItem;
@ -43,33 +17,34 @@ typedef struct _SETMENUITEMRECT
RECTL rcRect; RECTL rcRect;
} SETMENUITEMRECT, *PSETMENUITEMRECT; } SETMENUITEMRECT, *PSETMENUITEMRECT;
PMENU_OBJECT FASTCALL PMENU FASTCALL
IntGetMenuObject(HMENU hMenu); IntGetMenuObject(HMENU hMenu);
#define IntReleaseMenuObject(MenuObj) \ #define IntReleaseMenuObject(MenuObj) \
UserDereferenceObject(MenuObj) UserDereferenceObject(MenuObj)
BOOL FASTCALL BOOL FASTCALL
IntDestroyMenuObject(PMENU_OBJECT MenuObject, BOOL bRecurse, BOOL RemoveFromProcess); IntDestroyMenuObject(PMENU MenuObject, BOOL bRecurse, BOOL RemoveFromProcess);
PMENU_OBJECT FASTCALL PMENU FASTCALL
IntCloneMenu(PMENU_OBJECT Source); IntCloneMenu(PMENU Source);
int FASTCALL int FASTCALL
IntGetMenuItemByFlag(PMENU_OBJECT MenuObject, UINT uSearchBy, UINT fFlag, IntGetMenuItemByFlag(PMENU MenuObject, UINT uSearchBy, UINT fFlag,
PMENU_OBJECT *SubMenu, PMENU_ITEM *MenuItem, PMENU *SubMenu, PITEM *MenuItem,
PMENU_ITEM *PrevMenuItem); PITEM *PrevMenuItem);
BOOL FASTCALL BOOL FASTCALL
IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process); IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process);
BOOL FASTCALL BOOL FASTCALL
IntInsertMenuItem(_In_ PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, IntInsertMenuItem(_In_ PMENU MenuObject, UINT uItem, BOOL fByPosition,
PROSMENUITEMINFO ItemInfo); PROSMENUITEMINFO ItemInfo);
PMENU_OBJECT FASTCALL PMENU FASTCALL
IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu); IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu);
UINT FASTCALL IntFindSubMenu(HMENU *hMenu, HMENU hSubTarget ); UINT FASTCALL IntFindSubMenu(HMENU *hMenu, HMENU hSubTarget );
UINT FASTCALL IntGetMenuState( HMENU hMenu, UINT uId, UINT uFlags); UINT FASTCALL IntGetMenuState( HMENU hMenu, UINT uId, UINT uFlags);
BOOL FASTCALL IntRemoveMenuItem(PMENU Menu, UINT uPosition, UINT uFlags, BOOL bRecurse);
PITEM MENU_FindItem( PMENU *pmenu, UINT *nPos, UINT wFlags );

View file

@ -597,7 +597,7 @@ PVOID FASTCALL ValidateHandle(HANDLE handle, HANDLE_TYPE type)
} }
/* /*
* NtUserValidateHandleSecure * NtUserValidateHandleSecure W2k3 has one argument.
* *
* Status * Status
* @implemented * @implemented
@ -609,62 +609,46 @@ NtUserValidateHandleSecure(
HANDLE handle, HANDLE handle,
BOOL Restricted) BOOL Restricted)
{ {
if(!Restricted) UINT uType;
PPROCESSINFO ppi;
PUSER_HANDLE_ENTRY entry;
DECLARE_RETURN(BOOL);
UserEnterExclusive();
if (!(entry = handle_to_entry(gHandleTable, handle )))
{
EngSetLastError(ERROR_INVALID_HANDLE);
RETURN( FALSE);
}
uType = entry->type;
switch (uType)
{ {
UINT uType;
{
PUSER_HANDLE_ENTRY entry;
if (!(entry = handle_to_entry(gHandleTable, handle )))
{
EngSetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
uType = entry->type;
}
switch (uType)
{
case TYPE_WINDOW: case TYPE_WINDOW:
{ case TYPE_INPUTCONTEXT:
if (UserGetWindowObject((HWND) handle)) return TRUE; ppi = ((PTHREADINFO)entry->pi)->ppi;
return FALSE; break;
}
case TYPE_MENU: case TYPE_MENU:
{
if (UserGetMenuObject((HMENU) handle)) return TRUE;
return FALSE;
}
case TYPE_ACCELTABLE: case TYPE_ACCELTABLE:
{
if (UserGetAccelObject((HACCEL) handle)) return TRUE;
return FALSE;
}
case TYPE_CURSOR: case TYPE_CURSOR:
{
if (UserGetCurIconObject((HCURSOR) handle)) return TRUE;
return FALSE;
}
case TYPE_HOOK: case TYPE_HOOK:
{
if (IntGetHookObject((HHOOK) handle)) return TRUE;
return FALSE;
}
case TYPE_MONITOR:
{
if (UserGetMonitorObject((HMONITOR) handle)) return TRUE;
return FALSE;
}
case TYPE_CALLPROC: case TYPE_CALLPROC:
{ case TYPE_SETWINDOWPOS:
WNDPROC_INFO Proc; ppi = entry->pi;
return UserGetCallProcInfo( handle, &Proc ); break;
}
default: default:
EngSetLastError(ERROR_INVALID_HANDLE); ppi = NULL;
} break;
} }
else
{ /* Is handle entry restricted? */ if (!ppi) RETURN( FALSE);
STUB
} // Same process job returns TRUE.
return FALSE; if (gptiCurrent->ppi->pW32Job == ppi->pW32Job) RETURN( TRUE);
RETURN( FALSE);
CLEANUP:
UserLeave();
END_CLEANUP;
} }

View file

@ -401,17 +401,17 @@ NtUserCallTwoParam(
case TWOPARAM_ROUTINE_SETMENUBARHEIGHT: case TWOPARAM_ROUTINE_SETMENUBARHEIGHT:
{ {
DWORD_PTR Ret; DWORD_PTR Ret;
PMENU_OBJECT MenuObject = IntGetMenuObject((HMENU)Param1); PMENU MenuObject = IntGetMenuObject((HMENU)Param1);
if(!MenuObject) if(!MenuObject)
RETURN( 0); RETURN( 0);
if(Param2 > 0) if(Param2 > 0)
{ {
Ret = (MenuObject->MenuInfo.Height == (int)Param2); Ret = (MenuObject->cyMenu == (int)Param2);
MenuObject->MenuInfo.Height = (int)Param2; MenuObject->cyMenu = (int)Param2;
} }
else else
Ret = (DWORD_PTR)MenuObject->MenuInfo.Height; Ret = (DWORD_PTR)MenuObject->cyMenu;
IntReleaseMenuObject(MenuObject); IntReleaseMenuObject(MenuObject);
RETURN( Ret); RETURN( Ret);
} }
@ -564,9 +564,9 @@ NtUserCallHwndLock(
break; break;
case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE: case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE:
TRACE("co_IntSetForegroundWindow 1 0x%p\n",hWnd); TRACE("co_IntSetForegroundWindow M 1 0x%p\n",hWnd);
Ret = co_IntSetForegroundWindowMouse(Window); Ret = co_IntSetForegroundWindowMouse(Window);
TRACE("co_IntSetForegroundWindow 2 0x%p\n",hWnd); TRACE("co_IntSetForegroundWindow M 2 0x%p\n",hWnd);
break; break;
case HWNDLOCK_ROUTINE_UPDATEWINDOW: case HWNDLOCK_ROUTINE_UPDATEWINDOW:

View file

@ -1,6 +1,6 @@
#pragma once #pragma once
PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu); PMENU FASTCALL UserGetMenuObject(HMENU hMenu);
#define ASSERT_REFS_CO(_obj_) \ #define ASSERT_REFS_CO(_obj_) \
{ \ { \
@ -109,7 +109,7 @@ PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type);
/*************** MENU.C ***************/ /*************** MENU.C ***************/
HMENU FASTCALL UserCreateMenu(BOOL PopupMenu); HMENU FASTCALL UserCreateMenu(BOOL PopupMenu);
BOOL FASTCALL UserSetMenuDefaultItem(PMENU_OBJECT Menu, UINT uItem, UINT fByPos); BOOL FASTCALL UserSetMenuDefaultItem(PMENU Menu, UINT uItem, UINT fByPos);
BOOL FASTCALL UserDestroyMenu(HMENU hMenu); BOOL FASTCALL UserDestroyMenu(HMENU hMenu);
/*************** SCROLLBAR.C ***************/ /*************** SCROLLBAR.C ***************/

View file

@ -459,7 +459,7 @@ UserFreeWindowInfo(PTHREADINFO ti, PWND Wnd)
} }
// DesktopHeapFree(Wnd->head.rpdesk, Wnd); // DesktopHeapFree(Wnd->head.rpdesk, Wnd);
// WindowObject->Wnd = NULL; // WindowObject->hWnd = NULL;
} }
/*********************************************************************** /***********************************************************************
@ -479,7 +479,7 @@ static LRESULT co_UserFreeWindow(PWND Window,
HWND *Children; HWND *Children;
HWND *ChildHandle; HWND *ChildHandle;
PWND Child; PWND Child;
PMENU_OBJECT Menu; PMENU Menu;
BOOLEAN BelongsToThreadData; BOOLEAN BelongsToThreadData;
ASSERT(Window); ASSERT(Window);
@ -792,7 +792,7 @@ IntSetMenu(
HMENU Menu, HMENU Menu,
BOOL *Changed) BOOL *Changed)
{ {
PMENU_OBJECT OldMenu, NewMenu = NULL; PMENU OldMenu, NewMenu = NULL;
if ((Wnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD) if ((Wnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
{ {
@ -810,7 +810,7 @@ IntSetMenu(
if (Wnd->IDMenu) if (Wnd->IDMenu)
{ {
OldMenu = IntGetMenuObject((HMENU) Wnd->IDMenu); OldMenu = IntGetMenuObject((HMENU) Wnd->IDMenu);
ASSERT(NULL == OldMenu || OldMenu->MenuInfo.Wnd == Wnd->head.h); ASSERT(NULL == OldMenu || OldMenu->hWnd == Wnd->head.h);
} }
else else
{ {
@ -829,7 +829,7 @@ IntSetMenu(
EngSetLastError(ERROR_INVALID_MENU_HANDLE); EngSetLastError(ERROR_INVALID_MENU_HANDLE);
return FALSE; return FALSE;
} }
if (NULL != NewMenu->MenuInfo.Wnd) if (NULL != NewMenu->hWnd)
{ {
/* Can't use the same menu for two windows */ /* Can't use the same menu for two windows */
if (NULL != OldMenu) if (NULL != OldMenu)
@ -845,12 +845,12 @@ IntSetMenu(
Wnd->IDMenu = (UINT) Menu; Wnd->IDMenu = (UINT) Menu;
if (NULL != NewMenu) if (NULL != NewMenu)
{ {
NewMenu->MenuInfo.Wnd = Wnd->head.h; NewMenu->hWnd = Wnd->head.h;
IntReleaseMenuObject(NewMenu); IntReleaseMenuObject(NewMenu);
} }
if (NULL != OldMenu) if (NULL != OldMenu)
{ {
OldMenu->MenuInfo.Wnd = NULL; OldMenu->hWnd = NULL;
IntReleaseMenuObject(OldMenu); IntReleaseMenuObject(OldMenu);
} }
@ -895,13 +895,13 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread)
} }
} }
PMENU_OBJECT FASTCALL PMENU FASTCALL
IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu) IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
{ {
PMENU_OBJECT Menu, NewMenu = NULL, SysMenu = NULL, ret = NULL; PMENU Menu, NewMenu = NULL, SysMenu = NULL, ret = NULL;
PTHREADINFO W32Thread; PTHREADINFO W32Thread;
HMENU hNewMenu, hSysMenu; HMENU hNewMenu, hSysMenu;
ROSMENUITEMINFO ItemInfo; ROSMENUITEMINFO ItemInfo = {0};
if(bRevert) if(bRevert)
{ {
@ -929,10 +929,10 @@ IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
NewMenu = IntCloneMenu(Menu); NewMenu = IntCloneMenu(Menu);
if(NewMenu) if(NewMenu)
{ { // Use spmenuSys
Window->SystemMenu = NewMenu->MenuInfo.Self; Window->SystemMenu = NewMenu->head.h;
NewMenu->MenuInfo.Flags |= MNF_SYSDESKMN; NewMenu->fFlags |= MNF_SYSDESKMN;
NewMenu->MenuInfo.Wnd = Window->head.h; NewMenu->hWnd = Window->head.h;
ret = NewMenu; ret = NewMenu;
//IntReleaseMenuObject(NewMenu); //IntReleaseMenuObject(NewMenu);
} }
@ -950,8 +950,8 @@ IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
UserDestroyMenu(hSysMenu); UserDestroyMenu(hSysMenu);
return NULL; return NULL;
} }
SysMenu->MenuInfo.Flags |= MNF_SYSDESKMN; SysMenu->fFlags |= MNF_SYSDESKMN;
SysMenu->MenuInfo.Wnd = Window->head.h; SysMenu->hWnd = Window->head.h;
hNewMenu = co_IntLoadSysMenuTemplate(); hNewMenu = co_IntLoadSysMenuTemplate();
if(!hNewMenu) if(!hNewMenu)
{ {
@ -970,21 +970,24 @@ IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
NewMenu = IntCloneMenu(Menu); NewMenu = IntCloneMenu(Menu);
if(NewMenu) if(NewMenu)
{ {
NewMenu->MenuInfo.Flags |= MNF_SYSDESKMN | MNF_POPUP; NewMenu->fFlags |= MNF_SYSDESKMN | MNF_POPUP;
NewMenu->MenuInfo.dwStyle = MNS_CHECKORBMP; // Do not set MNS_CHECKORBMP it breaks menus, also original code destroyed the style anyway.
IntReleaseMenuObject(NewMenu); IntReleaseMenuObject(NewMenu);
UserSetMenuDefaultItem(NewMenu, SC_CLOSE, FALSE); UserSetMenuDefaultItem(NewMenu, SC_CLOSE, FALSE);
if (Window->pcls->style & CS_NOCLOSE)
IntRemoveMenuItem(NewMenu, SC_CLOSE, MF_BYCOMMAND, TRUE);
ItemInfo.cbSize = sizeof(MENUITEMINFOW); ItemInfo.cbSize = sizeof(MENUITEMINFOW);
ItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU; ItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU;
ItemInfo.fType = 0; ItemInfo.fType = 0;
ItemInfo.fState = MFS_ENABLED; ItemInfo.fState = MFS_ENABLED;
ItemInfo.dwTypeData = NULL; ItemInfo.dwTypeData = NULL;
ItemInfo.cch = 0; ItemInfo.cch = 0;
ItemInfo.hSubMenu = NewMenu->MenuInfo.Self; ItemInfo.hSubMenu = NewMenu->head.h;
IntInsertMenuItem(SysMenu, (UINT) -1, TRUE, &ItemInfo); IntInsertMenuItem(SysMenu, (UINT) -1, TRUE, &ItemInfo);
Window->SystemMenu = SysMenu->MenuInfo.Self; Window->SystemMenu = SysMenu->head.h;
ret = SysMenu; ret = SysMenu;
} }
@ -1419,15 +1422,15 @@ co_UserSetParent(HWND hWndChild, HWND hWndNewParent)
} }
BOOL FASTCALL BOOL FASTCALL
IntSetSystemMenu(PWND Window, PMENU_OBJECT Menu) IntSetSystemMenu(PWND Window, PMENU Menu)
{ {
PMENU_OBJECT OldMenu; PMENU OldMenu;
if(Window->SystemMenu) if(Window->SystemMenu)
{ {
OldMenu = IntGetMenuObject(Window->SystemMenu); OldMenu = IntGetMenuObject(Window->SystemMenu);
if(OldMenu) if(OldMenu)
{ {
OldMenu->MenuInfo.Flags &= ~ MNF_SYSDESKMN; OldMenu->fFlags &= ~ MNF_SYSDESKMN;
IntReleaseMenuObject(OldMenu); IntReleaseMenuObject(OldMenu);
} }
} }
@ -1435,10 +1438,10 @@ IntSetSystemMenu(PWND Window, PMENU_OBJECT Menu)
if(Menu) if(Menu)
{ {
/* FIXME: Check window style, propably return FALSE? */ /* FIXME: Check window style, propably return FALSE? */
Window->SystemMenu = Menu->MenuInfo.Self; Window->SystemMenu = Menu->head.h;
Menu->MenuInfo.Flags |= MNF_SYSDESKMN; Menu->fFlags |= MNF_SYSDESKMN;
} }
else else // Use spmenuSys too!
Window->SystemMenu = (HMENU)0; Window->SystemMenu = (HMENU)0;
return TRUE; return TRUE;
@ -1752,7 +1755,7 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
PWND pWnd = NULL; PWND pWnd = NULL;
HWND hWnd; HWND hWnd;
PTHREADINFO pti = NULL; PTHREADINFO pti = NULL;
PMENU_OBJECT SystemMenu; PMENU SystemMenu;
BOOL MenuChanged; BOOL MenuChanged;
BOOL bUnicodeWindow; BOOL bUnicodeWindow;
@ -1985,8 +1988,8 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
{ {
SystemMenu = IntGetSystemMenu(pWnd, TRUE, TRUE); SystemMenu = IntGetSystemMenu(pWnd, TRUE, TRUE);
if(SystemMenu) if(SystemMenu)
{ { // spmenuSys
pWnd->SystemMenu = SystemMenu->MenuInfo.Self; pWnd->SystemMenu = SystemMenu->head.h;
IntReleaseMenuObject(SystemMenu); IntReleaseMenuObject(SystemMenu);
} }
} }
@ -3678,7 +3681,7 @@ HMENU APIENTRY
NtUserGetSystemMenu(HWND hWnd, BOOL bRevert) NtUserGetSystemMenu(HWND hWnd, BOOL bRevert)
{ {
PWND Window; PWND Window;
PMENU_OBJECT Menu; PMENU Menu;
DECLARE_RETURN(HMENU); DECLARE_RETURN(HMENU);
TRACE("Enter NtUserGetSystemMenu\n"); TRACE("Enter NtUserGetSystemMenu\n");
@ -3694,7 +3697,7 @@ NtUserGetSystemMenu(HWND hWnd, BOOL bRevert)
RETURN(NULL); RETURN(NULL);
} }
RETURN(Menu->MenuInfo.Self); RETURN(Menu->head.h);
CLEANUP: CLEANUP:
TRACE("Leave NtUserGetSystemMenu, ret=%p\n", _ret_); TRACE("Leave NtUserGetSystemMenu, ret=%p\n", _ret_);
@ -3714,7 +3717,7 @@ NtUserSetSystemMenu(HWND hWnd, HMENU hMenu)
{ {
BOOL Result = FALSE; BOOL Result = FALSE;
PWND Window; PWND Window;
PMENU_OBJECT Menu; PMENU Menu;
DECLARE_RETURN(BOOL); DECLARE_RETURN(BOOL);
TRACE("Enter NtUserSetSystemMenu\n"); TRACE("Enter NtUserSetSystemMenu\n");

File diff suppressed because it is too large Load diff