mirror of
https://github.com/reactos/reactos.git
synced 2024-06-28 17:01:28 +00:00
[Win32k]
- 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:
parent
2a6fbc8f80
commit
9e6fb311ed
|
@ -5,6 +5,7 @@ typedef struct _PROCESSINFO *PPROCESSINFO;
|
|||
typedef struct _THREADINFO *PTHREADINFO;
|
||||
struct _DESKTOP;
|
||||
struct _WND;
|
||||
struct tagPOPUPMENU;
|
||||
|
||||
#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 */
|
||||
|
@ -313,7 +314,7 @@ typedef struct tagITEM
|
|||
struct tagMENU* spSubMenu; /* Pop-up menu. */
|
||||
HANDLE hbmpChecked;
|
||||
HANDLE hbmpUnchecked;
|
||||
USHORT* lpstr; /* Item text pointer. */
|
||||
USHORT* Xlpstr; /* Item text pointer. */
|
||||
ULONG cch;
|
||||
DWORD_PTR dwItemData;
|
||||
ULONG xItem; /* Item position. left */
|
||||
|
@ -326,6 +327,9 @@ typedef struct tagITEM
|
|||
HBITMAP hbmp; /* bitmap */
|
||||
INT cxBmp; /* Width Maximum size of the bitmap items in MIIM_BITMAP state */
|
||||
INT cyBmp; /* Height " */
|
||||
//// ReactOS
|
||||
UNICODE_STRING lpstr;
|
||||
struct tagITEM *Next;
|
||||
} ITEM, *PITEM;
|
||||
|
||||
typedef struct tagMENULIST
|
||||
|
@ -347,7 +351,7 @@ typedef struct tagMENU
|
|||
{
|
||||
PROCDESKHEAD head;
|
||||
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 cItems; /* Number of items in the menu */
|
||||
ULONG cxMenu; /* Width of the whole menu */
|
||||
|
@ -363,8 +367,54 @@ typedef struct tagMENU
|
|||
INT iTop; /* Current scroll position Top */
|
||||
INT iMaxTop; /* Current scroll position Max Top */
|
||||
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;
|
||||
|
||||
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
|
||||
{
|
||||
/* This is a reactos specific class used to initialize the
|
||||
|
@ -657,6 +707,12 @@ typedef struct _SBWND
|
|||
SBCALC SBCalc;
|
||||
} SBWND, *PSBWND;
|
||||
|
||||
typedef struct _MENUWND
|
||||
{
|
||||
WND wnd;
|
||||
PPOPUPMENU ppopupmenu;
|
||||
} MENUWND, *PMENUWND;
|
||||
|
||||
typedef struct _PFNCLIENT
|
||||
{
|
||||
WNDPROC pfnScrollBarWndProc;
|
||||
|
@ -3371,16 +3427,20 @@ typedef struct tagROSMENUINFO
|
|||
DWORD dwContextHelpID;
|
||||
ULONG_PTR dwMenuData;
|
||||
/* ----------- 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 */
|
||||
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 */
|
||||
WORD Width; /* Width of the whole menu */
|
||||
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 */
|
||||
BOOL TimeToHide; /* Request hiding when receiving a second click in the top-level menu item */
|
||||
} ROSMENUINFO, *PROSMENUINFO;
|
||||
|
||||
BOOL
|
||||
|
@ -3410,6 +3470,7 @@ typedef struct tagROSMENUITEMINFO
|
|||
RECT Rect; /* Item area (relative to menu window) */
|
||||
UINT dxTab; /* X position of text after Tab */
|
||||
LPWSTR lpstr; /* Copy of the text pointer in MenuItem->Text */
|
||||
SIZE maxBmpSize; /* Maximum size of the bitmap items in MIIM_BITMAP state */
|
||||
} ROSMENUITEMINFO, *PROSMENUITEMINFO;
|
||||
|
||||
BOOL
|
||||
|
|
|
@ -50,8 +50,7 @@ co_IntTranslateAccelerator(
|
|||
UINT Mask = 0, nPos;
|
||||
HWND hWnd;
|
||||
HMENU hMenu, hSubMenu;
|
||||
PMENU_OBJECT MenuObject, SubMenu;
|
||||
PMENU_ITEM MenuItem;
|
||||
PMENU MenuObject;
|
||||
|
||||
ASSERT_REFS_CO(Window);
|
||||
|
||||
|
@ -101,16 +100,11 @@ co_IntTranslateAccelerator(
|
|||
hMenu = (Window->style & WS_CHILD) ? 0 : (HMENU)Window->IDMenu;
|
||||
hSubMenu = NULL;
|
||||
MenuObject = IntGetMenuObject(hMenu);
|
||||
nPos = pAccel->cmd;
|
||||
if (MenuObject)
|
||||
{
|
||||
nPos = IntGetMenuItemByFlag(MenuObject,
|
||||
pAccel->cmd,
|
||||
MF_BYCOMMAND,
|
||||
&SubMenu,
|
||||
&MenuItem,
|
||||
NULL);
|
||||
if (nPos != (UINT) - 1)
|
||||
hSubMenu = SubMenu->head.h;
|
||||
if ((MENU_FindItem (&MenuObject, &nPos, MF_BYPOSITION)))
|
||||
hSubMenu = MenuObject->head.h;
|
||||
else
|
||||
hMenu = NULL;
|
||||
}
|
||||
|
@ -120,16 +114,11 @@ co_IntTranslateAccelerator(
|
|||
hMenu = Window->SystemMenu;
|
||||
hSubMenu = hMenu; /* system menu is a popup menu */
|
||||
MenuObject = IntGetMenuObject(hMenu);
|
||||
nPos = pAccel->cmd;
|
||||
if (MenuObject)
|
||||
{
|
||||
nPos = IntGetMenuItemByFlag(MenuObject,
|
||||
pAccel->cmd,
|
||||
MF_BYCOMMAND,
|
||||
&SubMenu,
|
||||
&MenuItem,
|
||||
NULL);
|
||||
if (nPos != (UINT) - 1)
|
||||
hSubMenu = SubMenu->head.h;
|
||||
if ((MENU_FindItem (&MenuObject, &nPos, MF_BYPOSITION)))
|
||||
hSubMenu = MenuObject->head.h;
|
||||
else
|
||||
hMenu = NULL;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -10,32 +10,6 @@
|
|||
#define MF_END (0x0080)
|
||||
#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
|
||||
{
|
||||
UINT uItem;
|
||||
|
@ -43,33 +17,34 @@ typedef struct _SETMENUITEMRECT
|
|||
RECTL rcRect;
|
||||
} SETMENUITEMRECT, *PSETMENUITEMRECT;
|
||||
|
||||
PMENU_OBJECT FASTCALL
|
||||
PMENU FASTCALL
|
||||
IntGetMenuObject(HMENU hMenu);
|
||||
|
||||
#define IntReleaseMenuObject(MenuObj) \
|
||||
UserDereferenceObject(MenuObj)
|
||||
|
||||
BOOL FASTCALL
|
||||
IntDestroyMenuObject(PMENU_OBJECT MenuObject, BOOL bRecurse, BOOL RemoveFromProcess);
|
||||
IntDestroyMenuObject(PMENU MenuObject, BOOL bRecurse, BOOL RemoveFromProcess);
|
||||
|
||||
PMENU_OBJECT FASTCALL
|
||||
IntCloneMenu(PMENU_OBJECT Source);
|
||||
PMENU FASTCALL
|
||||
IntCloneMenu(PMENU Source);
|
||||
|
||||
int FASTCALL
|
||||
IntGetMenuItemByFlag(PMENU_OBJECT MenuObject, UINT uSearchBy, UINT fFlag,
|
||||
PMENU_OBJECT *SubMenu, PMENU_ITEM *MenuItem,
|
||||
PMENU_ITEM *PrevMenuItem);
|
||||
IntGetMenuItemByFlag(PMENU MenuObject, UINT uSearchBy, UINT fFlag,
|
||||
PMENU *SubMenu, PITEM *MenuItem,
|
||||
PITEM *PrevMenuItem);
|
||||
|
||||
BOOL FASTCALL
|
||||
IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process);
|
||||
|
||||
BOOL FASTCALL
|
||||
IntInsertMenuItem(_In_ PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition,
|
||||
IntInsertMenuItem(_In_ PMENU MenuObject, UINT uItem, BOOL fByPosition,
|
||||
PROSMENUITEMINFO ItemInfo);
|
||||
|
||||
PMENU_OBJECT FASTCALL
|
||||
PMENU FASTCALL
|
||||
IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu);
|
||||
|
||||
UINT FASTCALL IntFindSubMenu(HMENU *hMenu, HMENU hSubTarget );
|
||||
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 );
|
||||
|
|
|
@ -597,7 +597,7 @@ PVOID FASTCALL ValidateHandle(HANDLE handle, HANDLE_TYPE type)
|
|||
}
|
||||
|
||||
/*
|
||||
* NtUserValidateHandleSecure
|
||||
* NtUserValidateHandleSecure W2k3 has one argument.
|
||||
*
|
||||
* Status
|
||||
* @implemented
|
||||
|
@ -609,62 +609,46 @@ NtUserValidateHandleSecure(
|
|||
HANDLE handle,
|
||||
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:
|
||||
{
|
||||
if (UserGetWindowObject((HWND) handle)) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
case TYPE_INPUTCONTEXT:
|
||||
ppi = ((PTHREADINFO)entry->pi)->ppi;
|
||||
break;
|
||||
case TYPE_MENU:
|
||||
{
|
||||
if (UserGetMenuObject((HMENU) handle)) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
case TYPE_ACCELTABLE:
|
||||
{
|
||||
if (UserGetAccelObject((HACCEL) handle)) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
case TYPE_CURSOR:
|
||||
{
|
||||
if (UserGetCurIconObject((HCURSOR) handle)) return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
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:
|
||||
{
|
||||
WNDPROC_INFO Proc;
|
||||
return UserGetCallProcInfo( handle, &Proc );
|
||||
}
|
||||
case TYPE_SETWINDOWPOS:
|
||||
ppi = entry->pi;
|
||||
break;
|
||||
default:
|
||||
EngSetLastError(ERROR_INVALID_HANDLE);
|
||||
}
|
||||
ppi = NULL;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{ /* Is handle entry restricted? */
|
||||
STUB
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
if (!ppi) RETURN( FALSE);
|
||||
|
||||
// Same process job returns TRUE.
|
||||
if (gptiCurrent->ppi->pW32Job == ppi->pW32Job) RETURN( TRUE);
|
||||
|
||||
RETURN( FALSE);
|
||||
|
||||
CLEANUP:
|
||||
UserLeave();
|
||||
END_CLEANUP;
|
||||
}
|
||||
|
|
|
@ -401,17 +401,17 @@ NtUserCallTwoParam(
|
|||
case TWOPARAM_ROUTINE_SETMENUBARHEIGHT:
|
||||
{
|
||||
DWORD_PTR Ret;
|
||||
PMENU_OBJECT MenuObject = IntGetMenuObject((HMENU)Param1);
|
||||
PMENU MenuObject = IntGetMenuObject((HMENU)Param1);
|
||||
if(!MenuObject)
|
||||
RETURN( 0);
|
||||
|
||||
if(Param2 > 0)
|
||||
{
|
||||
Ret = (MenuObject->MenuInfo.Height == (int)Param2);
|
||||
MenuObject->MenuInfo.Height = (int)Param2;
|
||||
Ret = (MenuObject->cyMenu == (int)Param2);
|
||||
MenuObject->cyMenu = (int)Param2;
|
||||
}
|
||||
else
|
||||
Ret = (DWORD_PTR)MenuObject->MenuInfo.Height;
|
||||
Ret = (DWORD_PTR)MenuObject->cyMenu;
|
||||
IntReleaseMenuObject(MenuObject);
|
||||
RETURN( Ret);
|
||||
}
|
||||
|
@ -564,9 +564,9 @@ NtUserCallHwndLock(
|
|||
break;
|
||||
|
||||
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);
|
||||
TRACE("co_IntSetForegroundWindow 2 0x%p\n",hWnd);
|
||||
TRACE("co_IntSetForegroundWindow M 2 0x%p\n",hWnd);
|
||||
break;
|
||||
|
||||
case HWNDLOCK_ROUTINE_UPDATEWINDOW:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu);
|
||||
PMENU FASTCALL UserGetMenuObject(HMENU hMenu);
|
||||
|
||||
#define ASSERT_REFS_CO(_obj_) \
|
||||
{ \
|
||||
|
@ -109,7 +109,7 @@ PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type);
|
|||
/*************** MENU.C ***************/
|
||||
|
||||
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);
|
||||
|
||||
/*************** SCROLLBAR.C ***************/
|
||||
|
|
|
@ -459,7 +459,7 @@ UserFreeWindowInfo(PTHREADINFO ti, PWND 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 *ChildHandle;
|
||||
PWND Child;
|
||||
PMENU_OBJECT Menu;
|
||||
PMENU Menu;
|
||||
BOOLEAN BelongsToThreadData;
|
||||
|
||||
ASSERT(Window);
|
||||
|
@ -792,7 +792,7 @@ IntSetMenu(
|
|||
HMENU Menu,
|
||||
BOOL *Changed)
|
||||
{
|
||||
PMENU_OBJECT OldMenu, NewMenu = NULL;
|
||||
PMENU OldMenu, NewMenu = NULL;
|
||||
|
||||
if ((Wnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
|
||||
{
|
||||
|
@ -810,7 +810,7 @@ IntSetMenu(
|
|||
if (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
|
||||
{
|
||||
|
@ -829,7 +829,7 @@ IntSetMenu(
|
|||
EngSetLastError(ERROR_INVALID_MENU_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
if (NULL != NewMenu->MenuInfo.Wnd)
|
||||
if (NULL != NewMenu->hWnd)
|
||||
{
|
||||
/* Can't use the same menu for two windows */
|
||||
if (NULL != OldMenu)
|
||||
|
@ -845,12 +845,12 @@ IntSetMenu(
|
|||
Wnd->IDMenu = (UINT) Menu;
|
||||
if (NULL != NewMenu)
|
||||
{
|
||||
NewMenu->MenuInfo.Wnd = Wnd->head.h;
|
||||
NewMenu->hWnd = Wnd->head.h;
|
||||
IntReleaseMenuObject(NewMenu);
|
||||
}
|
||||
if (NULL != OldMenu)
|
||||
{
|
||||
OldMenu->MenuInfo.Wnd = NULL;
|
||||
OldMenu->hWnd = NULL;
|
||||
IntReleaseMenuObject(OldMenu);
|
||||
}
|
||||
|
||||
|
@ -895,13 +895,13 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread)
|
|||
}
|
||||
}
|
||||
|
||||
PMENU_OBJECT FASTCALL
|
||||
PMENU FASTCALL
|
||||
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;
|
||||
HMENU hNewMenu, hSysMenu;
|
||||
ROSMENUITEMINFO ItemInfo;
|
||||
ROSMENUITEMINFO ItemInfo = {0};
|
||||
|
||||
if(bRevert)
|
||||
{
|
||||
|
@ -929,10 +929,10 @@ IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
|
|||
|
||||
NewMenu = IntCloneMenu(Menu);
|
||||
if(NewMenu)
|
||||
{
|
||||
Window->SystemMenu = NewMenu->MenuInfo.Self;
|
||||
NewMenu->MenuInfo.Flags |= MNF_SYSDESKMN;
|
||||
NewMenu->MenuInfo.Wnd = Window->head.h;
|
||||
{ // Use spmenuSys
|
||||
Window->SystemMenu = NewMenu->head.h;
|
||||
NewMenu->fFlags |= MNF_SYSDESKMN;
|
||||
NewMenu->hWnd = Window->head.h;
|
||||
ret = NewMenu;
|
||||
//IntReleaseMenuObject(NewMenu);
|
||||
}
|
||||
|
@ -950,8 +950,8 @@ IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
|
|||
UserDestroyMenu(hSysMenu);
|
||||
return NULL;
|
||||
}
|
||||
SysMenu->MenuInfo.Flags |= MNF_SYSDESKMN;
|
||||
SysMenu->MenuInfo.Wnd = Window->head.h;
|
||||
SysMenu->fFlags |= MNF_SYSDESKMN;
|
||||
SysMenu->hWnd = Window->head.h;
|
||||
hNewMenu = co_IntLoadSysMenuTemplate();
|
||||
if(!hNewMenu)
|
||||
{
|
||||
|
@ -970,21 +970,24 @@ IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
|
|||
NewMenu = IntCloneMenu(Menu);
|
||||
if(NewMenu)
|
||||
{
|
||||
NewMenu->MenuInfo.Flags |= MNF_SYSDESKMN | MNF_POPUP;
|
||||
NewMenu->MenuInfo.dwStyle = MNS_CHECKORBMP;
|
||||
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->MenuInfo.Self;
|
||||
ItemInfo.hSubMenu = NewMenu->head.h;
|
||||
IntInsertMenuItem(SysMenu, (UINT) -1, TRUE, &ItemInfo);
|
||||
|
||||
Window->SystemMenu = SysMenu->MenuInfo.Self;
|
||||
Window->SystemMenu = SysMenu->head.h;
|
||||
|
||||
ret = SysMenu;
|
||||
}
|
||||
|
@ -1419,15 +1422,15 @@ co_UserSetParent(HWND hWndChild, HWND hWndNewParent)
|
|||
}
|
||||
|
||||
BOOL FASTCALL
|
||||
IntSetSystemMenu(PWND Window, PMENU_OBJECT Menu)
|
||||
IntSetSystemMenu(PWND Window, PMENU Menu)
|
||||
{
|
||||
PMENU_OBJECT OldMenu;
|
||||
PMENU OldMenu;
|
||||
if(Window->SystemMenu)
|
||||
{
|
||||
OldMenu = IntGetMenuObject(Window->SystemMenu);
|
||||
if(OldMenu)
|
||||
{
|
||||
OldMenu->MenuInfo.Flags &= ~ MNF_SYSDESKMN;
|
||||
OldMenu->fFlags &= ~ MNF_SYSDESKMN;
|
||||
IntReleaseMenuObject(OldMenu);
|
||||
}
|
||||
}
|
||||
|
@ -1435,10 +1438,10 @@ IntSetSystemMenu(PWND Window, PMENU_OBJECT Menu)
|
|||
if(Menu)
|
||||
{
|
||||
/* FIXME: Check window style, propably return FALSE? */
|
||||
Window->SystemMenu = Menu->MenuInfo.Self;
|
||||
Menu->MenuInfo.Flags |= MNF_SYSDESKMN;
|
||||
Window->SystemMenu = Menu->head.h;
|
||||
Menu->fFlags |= MNF_SYSDESKMN;
|
||||
}
|
||||
else
|
||||
else // Use spmenuSys too!
|
||||
Window->SystemMenu = (HMENU)0;
|
||||
|
||||
return TRUE;
|
||||
|
@ -1752,7 +1755,7 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
|
|||
PWND pWnd = NULL;
|
||||
HWND hWnd;
|
||||
PTHREADINFO pti = NULL;
|
||||
PMENU_OBJECT SystemMenu;
|
||||
PMENU SystemMenu;
|
||||
BOOL MenuChanged;
|
||||
BOOL bUnicodeWindow;
|
||||
|
||||
|
@ -1985,8 +1988,8 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
|
|||
{
|
||||
SystemMenu = IntGetSystemMenu(pWnd, TRUE, TRUE);
|
||||
if(SystemMenu)
|
||||
{
|
||||
pWnd->SystemMenu = SystemMenu->MenuInfo.Self;
|
||||
{ // spmenuSys
|
||||
pWnd->SystemMenu = SystemMenu->head.h;
|
||||
IntReleaseMenuObject(SystemMenu);
|
||||
}
|
||||
}
|
||||
|
@ -3678,7 +3681,7 @@ HMENU APIENTRY
|
|||
NtUserGetSystemMenu(HWND hWnd, BOOL bRevert)
|
||||
{
|
||||
PWND Window;
|
||||
PMENU_OBJECT Menu;
|
||||
PMENU Menu;
|
||||
DECLARE_RETURN(HMENU);
|
||||
|
||||
TRACE("Enter NtUserGetSystemMenu\n");
|
||||
|
@ -3694,7 +3697,7 @@ NtUserGetSystemMenu(HWND hWnd, BOOL bRevert)
|
|||
RETURN(NULL);
|
||||
}
|
||||
|
||||
RETURN(Menu->MenuInfo.Self);
|
||||
RETURN(Menu->head.h);
|
||||
|
||||
CLEANUP:
|
||||
TRACE("Leave NtUserGetSystemMenu, ret=%p\n", _ret_);
|
||||
|
@ -3714,7 +3717,7 @@ NtUserSetSystemMenu(HWND hWnd, HMENU hMenu)
|
|||
{
|
||||
BOOL Result = FALSE;
|
||||
PWND Window;
|
||||
PMENU_OBJECT Menu;
|
||||
PMENU Menu;
|
||||
DECLARE_RETURN(BOOL);
|
||||
|
||||
TRACE("Enter NtUserSetSystemMenu\n");
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue