mirror of
https://github.com/reactos/reactos.git
synced 2024-07-11 07:05:12 +00:00
[NtUser|User32]
- Use new menu flags. - Fix msg test_menu_messages tests. Patch from CORE-7966 breaks it. - Fix edit tests with GetMenuBarInfo. - Fix menu test_getmenubarinfo tests but the todo on line 375. svn path=/trunk/; revision=62526
This commit is contained in:
parent
eb1db23139
commit
05f6960a49
|
@ -271,7 +271,7 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar)
|
||||||
Menu->MenuInfo.dwMenuData = 0; /* Default */
|
Menu->MenuInfo.dwMenuData = 0; /* Default */
|
||||||
Menu->MenuInfo.Self = *Handle;
|
Menu->MenuInfo.Self = *Handle;
|
||||||
Menu->MenuInfo.FocusedItem = NO_SELECTED_ITEM;
|
Menu->MenuInfo.FocusedItem = NO_SELECTED_ITEM;
|
||||||
Menu->MenuInfo.Flags = (IsMenuBar ? 0 : MF_POPUP);
|
Menu->MenuInfo.Flags = (IsMenuBar ? 0 : MNF_POPUP);
|
||||||
Menu->MenuInfo.Wnd = NULL;
|
Menu->MenuInfo.Wnd = NULL;
|
||||||
Menu->MenuInfo.WndOwner = NULL;
|
Menu->MenuInfo.WndOwner = NULL;
|
||||||
Menu->MenuInfo.Height = 0;
|
Menu->MenuInfo.Height = 0;
|
||||||
|
@ -741,7 +741,7 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
|
||||||
SubMenuObject = UserGetMenuObject(MenuItem->hSubMenu);
|
SubMenuObject = UserGetMenuObject(MenuItem->hSubMenu);
|
||||||
if (SubMenuObject != NULL)
|
if (SubMenuObject != NULL)
|
||||||
{
|
{
|
||||||
SubMenuObject->MenuInfo.Flags |= MF_POPUP;
|
SubMenuObject->MenuInfo.Flags |= MNF_POPUP;
|
||||||
MenuItem->fType |= MF_POPUP;
|
MenuItem->fType |= MF_POPUP;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -784,7 +784,7 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (0 == (MenuObject->MenuInfo.Flags & MF_SYSMENU))
|
if (0 == (MenuObject->MenuInfo.Flags & MNF_SYSDESKMN))
|
||||||
{
|
{
|
||||||
MenuItem->fType |= MF_SEPARATOR;
|
MenuItem->fType |= MF_SEPARATOR;
|
||||||
}
|
}
|
||||||
|
@ -1733,6 +1733,50 @@ CLEANUP:
|
||||||
END_CLEANUP;
|
END_CLEANUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL FASTCALL
|
||||||
|
IntGetMenuItemRect(
|
||||||
|
PWND pWnd,
|
||||||
|
PMENU_OBJECT Menu,
|
||||||
|
UINT uItem,
|
||||||
|
PRECTL Rect)
|
||||||
|
{
|
||||||
|
LONG XMove, YMove;
|
||||||
|
PMENU_ITEM MenuItem;
|
||||||
|
int p = 0;
|
||||||
|
|
||||||
|
if (!pWnd)
|
||||||
|
{
|
||||||
|
HWND hWnd = Menu->MenuInfo.Wnd;
|
||||||
|
if (!(pWnd = UserGetWindowObject(hWnd))) return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((p = IntGetMenuItemByFlag(Menu, uItem, MF_BYPOSITION, NULL, &MenuItem, NULL)) > -1)
|
||||||
|
*Rect = MenuItem->Rect;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ERR("Failed Item Lookup! %d\n", p);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Menu->MenuInfo.Flags & MNF_POPUP)
|
||||||
|
{
|
||||||
|
XMove = pWnd->rcClient.left;
|
||||||
|
YMove = pWnd->rcClient.top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XMove = pWnd->rcWindow.left;
|
||||||
|
YMove = pWnd->rcWindow.top;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rect->left += XMove;
|
||||||
|
Rect->top += YMove;
|
||||||
|
Rect->right += XMove;
|
||||||
|
Rect->bottom += YMove;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -1743,219 +1787,126 @@ NtUserGetMenuBarInfo(
|
||||||
LONG idItem,
|
LONG idItem,
|
||||||
PMENUBARINFO pmbi)
|
PMENUBARINFO pmbi)
|
||||||
{
|
{
|
||||||
BOOL Res = TRUE;
|
PWND pWnd;
|
||||||
PMENU_OBJECT MenuObject;
|
|
||||||
PMENU_ITEM mi;
|
|
||||||
PWND WindowObject;
|
|
||||||
HMENU hMenu;
|
HMENU hMenu;
|
||||||
POINT Offset;
|
|
||||||
RECTL Rect;
|
|
||||||
MENUBARINFO kmbi;
|
MENUBARINFO kmbi;
|
||||||
|
BOOL Ret;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
PMENU_OBJECT Menu = NULL;
|
||||||
DECLARE_RETURN(BOOL);
|
DECLARE_RETURN(BOOL);
|
||||||
|
|
||||||
TRACE("Enter NtUserGetMenuBarInfo\n");
|
TRACE("Enter NtUserGetMenuBarInfo\n");
|
||||||
UserEnterShared();
|
UserEnterShared();
|
||||||
|
|
||||||
if (!(WindowObject = UserGetWindowObject(hwnd)))
|
if (!(pWnd = UserGetWindowObject(hwnd)))
|
||||||
{
|
{
|
||||||
EngSetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
EngSetLastError(ERROR_INVALID_WINDOW_HANDLE);
|
||||||
RETURN(FALSE);
|
RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
hMenu = (HMENU)(DWORD_PTR)WindowObject->IDMenu;
|
|
||||||
|
|
||||||
if (!(MenuObject = UserGetMenuObject(hMenu)))
|
|
||||||
{
|
|
||||||
EngSetLastError(ERROR_INVALID_MENU_HANDLE);
|
|
||||||
RETURN(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pmbi->cbSize != sizeof(MENUBARINFO))
|
|
||||||
{
|
|
||||||
EngSetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
RETURN(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
kmbi.cbSize = sizeof(MENUBARINFO);
|
|
||||||
kmbi.fBarFocused = FALSE;
|
|
||||||
kmbi.fFocused = FALSE;
|
|
||||||
kmbi.hwndMenu = NULL;
|
|
||||||
|
|
||||||
switch (idObject)
|
switch (idObject)
|
||||||
{
|
{
|
||||||
case OBJID_MENU:
|
case OBJID_CLIENT:
|
||||||
{
|
if (!pWnd->pcls->fnid)
|
||||||
PMENU_OBJECT SubMenuObject;
|
RETURN(FALSE);
|
||||||
kmbi.hMenu = hMenu;
|
if (pWnd->pcls->fnid != FNID_MENU)
|
||||||
if (idItem) /* Non-Zero-Based. */
|
{
|
||||||
{
|
WARN("called on invalid window: %d\n", pWnd->pcls->fnid);
|
||||||
if (IntGetMenuItemByFlag(MenuObject, idItem-1, MF_BYPOSITION, NULL, &mi, NULL) > -1)
|
|
||||||
kmbi.rcBar = mi->Rect;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* If items is zero we assume info for the menu itself. */
|
|
||||||
if (!(IntGetClientOrigin(WindowObject, &Offset)))
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Rect.left = Offset.x;
|
|
||||||
Rect.right = Offset.x + MenuObject->MenuInfo.Width;
|
|
||||||
Rect.bottom = Offset.y;
|
|
||||||
Rect.top = Offset.y - MenuObject->MenuInfo.Height;
|
|
||||||
kmbi.rcBar = Rect;
|
|
||||||
TRACE("Rect top = %d bottom = %d left = %d right = %d \n",
|
|
||||||
Rect.top, Rect.bottom, Rect.left, Rect.right);
|
|
||||||
}
|
|
||||||
if (idItem)
|
|
||||||
{
|
|
||||||
if (idItem-1 == MenuObject->MenuInfo.FocusedItem)
|
|
||||||
kmbi.fFocused = TRUE;
|
|
||||||
}
|
|
||||||
if (MenuObject->MenuInfo.FocusedItem != NO_SELECTED_ITEM)
|
|
||||||
kmbi.fBarFocused = TRUE;
|
|
||||||
|
|
||||||
if (MenuObject->MenuItemList)
|
|
||||||
{
|
|
||||||
SubMenuObject = UserGetMenuObject(MenuObject->MenuItemList->hSubMenu);
|
|
||||||
if(SubMenuObject) kmbi.hwndMenu = SubMenuObject->MenuInfo.Wnd;
|
|
||||||
}
|
|
||||||
TRACE("OBJID_MENU, idItem = %d\n",idItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OBJID_CLIENT:
|
|
||||||
{
|
|
||||||
PMENU_OBJECT SubMenuObject, XSubMenuObject;
|
|
||||||
HMENU hMenuChk;
|
|
||||||
// Windows does this! Wine checks for Atom and uses GetWindowLongPtrW.
|
|
||||||
hMenuChk = (HMENU)co_IntSendMessage(hwnd, MN_GETHMENU, 0, 0);
|
|
||||||
|
|
||||||
if (!(MenuObject = UserGetMenuObject(hMenuChk)))
|
|
||||||
{
|
|
||||||
ERR("Window does not have a Popup Menu!\n");
|
|
||||||
EngSetLastError(ERROR_INVALID_MENU_HANDLE);
|
EngSetLastError(ERROR_INVALID_MENU_HANDLE);
|
||||||
RETURN(FALSE);
|
RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
// Windows does this! Wine checks for Atom and uses GetWindowLongPtrW.
|
||||||
SubMenuObject = UserGetMenuObject(MenuObject->MenuItemList->hSubMenu);
|
hMenu = (HMENU)co_IntSendMessage(hwnd, MN_GETHMENU, 0, 0);
|
||||||
if(SubMenuObject) kmbi.hMenu = SubMenuObject->MenuInfo.Self;
|
break;
|
||||||
else
|
case OBJID_MENU:
|
||||||
{
|
hMenu = UlongToHandle(pWnd->IDMenu);
|
||||||
Res = FALSE;
|
break;
|
||||||
ERR("OBJID_CLIENT, No SubMenu!\n");
|
case OBJID_SYSMENU:
|
||||||
break;
|
if (!(pWnd->style & WS_SYSMENU)) RETURN(FALSE);
|
||||||
}
|
Menu = IntGetSystemMenu(pWnd, FALSE, FALSE);
|
||||||
if (idItem)
|
hMenu = Menu->MenuInfo.Self;
|
||||||
{
|
break;
|
||||||
if (IntGetMenuItemByFlag(SubMenuObject, idItem-1, MF_BYPOSITION, NULL, &mi, NULL) > -1)
|
default:
|
||||||
kmbi.rcBar = mi->Rect;
|
RETURN(FALSE);
|
||||||
else
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PWND SubWinObj;
|
|
||||||
if (!(SubWinObj = UserGetWindowObject(SubMenuObject->MenuInfo.Wnd)))
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!(IntGetClientOrigin(SubWinObj, &Offset)))
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Rect.left = Offset.x;
|
|
||||||
Rect.right = Offset.x + SubMenuObject->MenuInfo.Width;
|
|
||||||
Rect.top = Offset.y;
|
|
||||||
Rect.bottom = Offset.y + SubMenuObject->MenuInfo.Height;
|
|
||||||
kmbi.rcBar = Rect;
|
|
||||||
}
|
|
||||||
if (idItem)
|
|
||||||
{
|
|
||||||
if (idItem-1 == SubMenuObject->MenuInfo.FocusedItem)
|
|
||||||
kmbi.fFocused = TRUE;
|
|
||||||
}
|
|
||||||
if (SubMenuObject->MenuInfo.FocusedItem != NO_SELECTED_ITEM)
|
|
||||||
kmbi.fBarFocused = TRUE;
|
|
||||||
XSubMenuObject = UserGetMenuObject(SubMenuObject->MenuItemList->hSubMenu);
|
|
||||||
if (XSubMenuObject) kmbi.hwndMenu = XSubMenuObject->MenuInfo.Wnd;
|
|
||||||
TRACE("OBJID_CLIENT, idItem = %d\n",idItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OBJID_SYSMENU:
|
|
||||||
{
|
|
||||||
PMENU_OBJECT SysMenuObject, SubMenuObject;
|
|
||||||
if(!(SysMenuObject = IntGetSystemMenu(WindowObject, FALSE, FALSE)))
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
kmbi.hMenu = SysMenuObject->MenuInfo.Self;
|
|
||||||
if (idItem)
|
|
||||||
{
|
|
||||||
if (IntGetMenuItemByFlag(SysMenuObject, idItem-1, MF_BYPOSITION, NULL, &mi, NULL) > -1)
|
|
||||||
kmbi.rcBar = mi->Rect;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PWND SysWinObj;
|
|
||||||
if (!(SysWinObj = UserGetWindowObject(SysMenuObject->MenuInfo.Wnd)))
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!(IntGetClientOrigin(SysWinObj, &Offset)))
|
|
||||||
{
|
|
||||||
Res = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Rect.left = Offset.x;
|
|
||||||
Rect.right = Offset.x + SysMenuObject->MenuInfo.Width;
|
|
||||||
Rect.top = Offset.y;
|
|
||||||
Rect.bottom = Offset.y + SysMenuObject->MenuInfo.Height;
|
|
||||||
kmbi.rcBar = Rect;
|
|
||||||
}
|
|
||||||
if (idItem)
|
|
||||||
{
|
|
||||||
if (idItem-1 == SysMenuObject->MenuInfo.FocusedItem)
|
|
||||||
kmbi.fFocused = TRUE;
|
|
||||||
}
|
|
||||||
if (SysMenuObject->MenuInfo.FocusedItem != NO_SELECTED_ITEM)
|
|
||||||
kmbi.fBarFocused = TRUE;
|
|
||||||
SubMenuObject = UserGetMenuObject(SysMenuObject->MenuItemList->hSubMenu);
|
|
||||||
if(SubMenuObject) kmbi.hwndMenu = SubMenuObject->MenuInfo.Wnd;
|
|
||||||
TRACE("OBJID_SYSMENU, idItem = %d\n",idItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
Res = FALSE;
|
|
||||||
ERR("Unknown idObject = %d, idItem = %d\n",idObject,idItem);
|
|
||||||
}
|
}
|
||||||
if (Res)
|
|
||||||
{
|
if (!hMenu)
|
||||||
NTSTATUS Status = MmCopyToCaller(pmbi, &kmbi, sizeof(MENUBARINFO));
|
RETURN(FALSE);
|
||||||
if (! NT_SUCCESS(Status))
|
|
||||||
{
|
_SEH2_TRY
|
||||||
SetLastNtError(Status);
|
{
|
||||||
RETURN(FALSE);
|
kmbi.cbSize = pmbi->cbSize;
|
||||||
}
|
}
|
||||||
}
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
RETURN(Res);
|
{
|
||||||
|
kmbi.cbSize = 0;
|
||||||
|
}
|
||||||
|
_SEH2_END
|
||||||
|
|
||||||
|
if (kmbi.cbSize != sizeof(MENUBARINFO))
|
||||||
|
{
|
||||||
|
EngSetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
RETURN(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Menu) Menu = UserGetMenuObject(hMenu);
|
||||||
|
if (!Menu)
|
||||||
|
RETURN(FALSE);
|
||||||
|
|
||||||
|
if (idItem < 0 || idItem > Menu->MenuInfo.MenuItemCount)
|
||||||
|
RETURN(FALSE);
|
||||||
|
|
||||||
|
RECTL_vSetEmptyRect(&kmbi.rcBar);
|
||||||
|
|
||||||
|
if (idItem == 0)
|
||||||
|
{
|
||||||
|
Ret = IntGetMenuItemRect(pWnd, Menu, -1, &kmbi.rcBar);
|
||||||
|
kmbi.rcBar.right = kmbi.rcBar.left + Menu->MenuInfo.Width;
|
||||||
|
kmbi.rcBar.bottom = kmbi.rcBar.top + Menu->MenuInfo.Height;
|
||||||
|
ERR("idItem 0 %d\n",Ret);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Ret = IntGetMenuItemRect(pWnd, Menu, idItem-1, &kmbi.rcBar);
|
||||||
|
ERR("idItem X %d\n", Ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
kmbi.hMenu = hMenu;
|
||||||
|
kmbi.hwndMenu = NULL;
|
||||||
|
//kmbi.fBarFocused = top_popup_hmenu == hMenu;
|
||||||
|
if (idItem)
|
||||||
|
{
|
||||||
|
PMENU_OBJECT SubMenuObject;
|
||||||
|
kmbi.fFocused = Menu->MenuInfo.FocusedItem == idItem-1;
|
||||||
|
|
||||||
|
if ( kmbi.fFocused && Menu->MenuItemList->hSubMenu )
|
||||||
|
{
|
||||||
|
SubMenuObject = UserGetMenuObject(Menu->MenuItemList->hSubMenu);
|
||||||
|
if (SubMenuObject) kmbi.hwndMenu = SubMenuObject->MenuInfo.Wnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* else
|
||||||
|
{
|
||||||
|
kmbi.fFocused = kmbi.fBarFocused;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
RtlCopyMemory(pmbi, &kmbi, sizeof(MENUBARINFO));
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH2_END
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastNtError(Status);
|
||||||
|
RETURN(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN(TRUE);
|
||||||
|
|
||||||
CLEANUP:
|
CLEANUP:
|
||||||
TRACE("Leave NtUserGetMenuBarInfo, ret=%i\n",_ret_);
|
TRACE("Leave NtUserGetMenuBarInfo, ret=%i\n",_ret_);
|
||||||
|
@ -2011,9 +1962,9 @@ NtUserGetMenuItemRect(
|
||||||
PWND ReferenceWnd;
|
PWND ReferenceWnd;
|
||||||
LONG XMove, YMove;
|
LONG XMove, YMove;
|
||||||
RECTL Rect;
|
RECTL Rect;
|
||||||
NTSTATUS Status;
|
|
||||||
PMENU_OBJECT Menu;
|
PMENU_OBJECT Menu;
|
||||||
PMENU_ITEM MenuItem;
|
PMENU_ITEM MenuItem;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
DECLARE_RETURN(BOOL);
|
DECLARE_RETURN(BOOL);
|
||||||
|
|
||||||
TRACE("Enter NtUserGetMenuItemRect\n");
|
TRACE("Enter NtUserGetMenuItemRect\n");
|
||||||
|
@ -2038,7 +1989,7 @@ NtUserGetMenuItemRect(
|
||||||
|
|
||||||
if (!(ReferenceWnd = UserGetWindowObject(hWnd))) RETURN( FALSE);
|
if (!(ReferenceWnd = UserGetWindowObject(hWnd))) RETURN( FALSE);
|
||||||
|
|
||||||
if(MenuItem->fType & MF_POPUP)
|
if (Menu->MenuInfo.Flags & MNF_POPUP)
|
||||||
{
|
{
|
||||||
XMove = ReferenceWnd->rcClient.left;
|
XMove = ReferenceWnd->rcClient.left;
|
||||||
YMove = ReferenceWnd->rcClient.top;
|
YMove = ReferenceWnd->rcClient.top;
|
||||||
|
@ -2054,13 +2005,22 @@ NtUserGetMenuItemRect(
|
||||||
Rect.right += XMove;
|
Rect.right += XMove;
|
||||||
Rect.bottom += YMove;
|
Rect.bottom += YMove;
|
||||||
|
|
||||||
Status = MmCopyToCaller(lprcItem, &Rect, sizeof(RECT));
|
_SEH2_TRY
|
||||||
if (! NT_SUCCESS(Status))
|
{
|
||||||
|
RtlCopyMemory(lprcItem, &Rect, sizeof(RECTL));
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH2_END
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastNtError(Status);
|
SetLastNtError(Status);
|
||||||
RETURN( FALSE);
|
RETURN(FALSE);
|
||||||
}
|
}
|
||||||
RETURN( TRUE);
|
RETURN(TRUE);
|
||||||
|
|
||||||
CLEANUP:
|
CLEANUP:
|
||||||
TRACE("Leave NtUserGetMenuItemRect, ret=%i\n",_ret_);
|
TRACE("Leave NtUserGetMenuItemRect, ret=%i\n",_ret_);
|
||||||
|
|
|
@ -46,10 +46,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(menu);
|
||||||
#define IS_MAGIC_BITMAP(id) ((id) && ((INT_PTR)(id) < 12) && ((INT_PTR)(id) >= -1))
|
#define IS_MAGIC_BITMAP(id) ((id) && ((INT_PTR)(id) < 12) && ((INT_PTR)(id) >= -1))
|
||||||
|
|
||||||
#define IS_SYSTEM_MENU(MenuInfo) \
|
#define IS_SYSTEM_MENU(MenuInfo) \
|
||||||
(0 == ((MenuInfo)->Flags & MF_POPUP) && 0 != ((MenuInfo)->Flags & MF_SYSMENU))
|
(0 == ((MenuInfo)->Flags & MNF_POPUP) && 0 != ((MenuInfo)->Flags & MNF_SYSDESKMN))
|
||||||
|
|
||||||
#define IS_SYSTEM_POPUP(MenuInfo) \
|
#define IS_SYSTEM_POPUP(MenuInfo) \
|
||||||
(0 != ((MenuInfo)->Flags & MF_POPUP) && 0 != ((MenuInfo)->Flags & MF_SYSMENU))
|
(0 != ((MenuInfo)->Flags & MNF_POPUP) && 0 != ((MenuInfo)->Flags & MNF_SYSDESKMN))
|
||||||
|
|
||||||
#define IS_BITMAP_ITEM(flags) (MF_BITMAP == MENU_ITEM_TYPE(flags))
|
#define IS_BITMAP_ITEM(flags) (MF_BITMAP == MENU_ITEM_TYPE(flags))
|
||||||
|
|
||||||
|
@ -507,6 +507,7 @@ static UINT FASTCALL MenuFindItemByKey(HWND WndOwner, PROSMENUINFO MenuInfo,
|
||||||
PROSMENUITEMINFO Items, ItemInfo;
|
PROSMENUITEMINFO Items, ItemInfo;
|
||||||
LRESULT MenuChar;
|
LRESULT MenuChar;
|
||||||
UINT i;
|
UINT i;
|
||||||
|
WORD Flags = 0;
|
||||||
|
|
||||||
TRACE("\tlooking for '%c' (0x%02x) in [%p]\n", (char) Key, Key, MenuInfo);
|
TRACE("\tlooking for '%c' (0x%02x) in [%p]\n", (char) Key, Key, MenuInfo);
|
||||||
|
|
||||||
|
@ -546,8 +547,11 @@ static UINT FASTCALL MenuFindItemByKey(HWND WndOwner, PROSMENUINFO MenuInfo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Flags |= MenuInfo->Flags & MNF_POPUP ? MF_POPUP : 0;
|
||||||
|
Flags |= MenuInfo->Flags & MNF_SYSDESKMN ? MF_SYSMENU : 0;
|
||||||
|
|
||||||
MenuChar = SendMessageW(WndOwner, WM_MENUCHAR,
|
MenuChar = SendMessageW(WndOwner, WM_MENUCHAR,
|
||||||
MAKEWPARAM(Key, MenuInfo->Flags), (LPARAM) MenuInfo->Self);
|
MAKEWPARAM(Key, Flags), (LPARAM) MenuInfo->Self);
|
||||||
if (HIWORD(MenuChar) == MNC_EXECUTE) return LOWORD(MenuChar);
|
if (HIWORD(MenuChar) == MNC_EXECUTE) return LOWORD(MenuChar);
|
||||||
if (HIWORD(MenuChar) == MNC_CLOSE) return (UINT)(-2);
|
if (HIWORD(MenuChar) == MNC_CLOSE) return (UINT)(-2);
|
||||||
}
|
}
|
||||||
|
@ -1650,7 +1654,7 @@ static void FASTCALL MenuSelectItem(HWND hwndOwner, PROSMENUINFO hmenu, UINT wIn
|
||||||
|
|
||||||
if (!hmenu || !hmenu->MenuItemCount || !hmenu->Wnd) return;
|
if (!hmenu || !hmenu->MenuItemCount || !hmenu->Wnd) return;
|
||||||
if (hmenu->FocusedItem == wIndex) return;
|
if (hmenu->FocusedItem == wIndex) return;
|
||||||
if (hmenu->Flags & MF_POPUP) hdc = GetDC(hmenu->Wnd);
|
if (hmenu->Flags & MNF_POPUP) hdc = GetDC(hmenu->Wnd);
|
||||||
else hdc = GetDCEx(hmenu->Wnd, 0, DCX_CACHE | DCX_WINDOW);
|
else hdc = GetDCEx(hmenu->Wnd, 0, DCX_CACHE | DCX_WINDOW);
|
||||||
if (!top_popup) {
|
if (!top_popup) {
|
||||||
top_popup = hmenu->Wnd;
|
top_popup = hmenu->Wnd;
|
||||||
|
@ -1671,7 +1675,7 @@ static void FASTCALL MenuSelectItem(HWND hwndOwner, PROSMENUINFO hmenu, UINT wIn
|
||||||
MenuSetRosMenuItemInfo(hmenu->Self, hmenu->FocusedItem, &ItemInfo);
|
MenuSetRosMenuItemInfo(hmenu->Self, hmenu->FocusedItem, &ItemInfo);
|
||||||
}
|
}
|
||||||
MenuDrawMenuItem(hmenu->Wnd, hmenu, hwndOwner, hdc, &ItemInfo,
|
MenuDrawMenuItem(hmenu->Wnd, hmenu, hwndOwner, hdc, &ItemInfo,
|
||||||
hmenu->Height, ! (hmenu->Flags & MF_POPUP),
|
hmenu->Height, !(hmenu->Flags & MNF_POPUP),
|
||||||
ODA_SELECT);
|
ODA_SELECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1688,15 +1692,16 @@ static void FASTCALL MenuSelectItem(HWND hwndOwner, PROSMENUINFO hmenu, UINT wIn
|
||||||
ItemInfo.fState |= MF_HILITE;
|
ItemInfo.fState |= MF_HILITE;
|
||||||
MenuSetRosMenuItemInfo(hmenu->Self, hmenu->FocusedItem, &ItemInfo);
|
MenuSetRosMenuItemInfo(hmenu->Self, hmenu->FocusedItem, &ItemInfo);
|
||||||
MenuDrawMenuItem(hmenu->Wnd, hmenu, hwndOwner, hdc,
|
MenuDrawMenuItem(hmenu->Wnd, hmenu, hwndOwner, hdc,
|
||||||
&ItemInfo, hmenu->Height, ! (hmenu->Flags & MF_POPUP),
|
&ItemInfo, hmenu->Height, !(hmenu->Flags & MNF_POPUP),
|
||||||
ODA_SELECT);
|
ODA_SELECT);
|
||||||
}
|
}
|
||||||
if (sendMenuSelect)
|
if (sendMenuSelect)
|
||||||
{
|
{
|
||||||
SendMessageW(hwndOwner, WM_MENUSELECT,
|
WPARAM wParam = MAKELONG( ItemInfo.fType & MF_POPUP ? wIndex : ItemInfo.wID,
|
||||||
MAKELONG(ItemInfo.fType & MF_POPUP ? wIndex : ItemInfo.wID,
|
ItemInfo.fType | ItemInfo.fState |
|
||||||
ItemInfo.fType | ItemInfo.fState | MF_MOUSESELECT |
|
(hmenu->Flags & MNF_SYSDESKMN ? MF_SYSMENU : 0 ) );
|
||||||
(hmenu->Flags & MF_SYSMENU)), (LPARAM) hmenu->Self);
|
|
||||||
|
SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) hmenu->Self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1709,11 +1714,10 @@ static void FASTCALL MenuSelectItem(HWND hwndOwner, PROSMENUINFO hmenu, UINT wIn
|
||||||
if (MenuGetRosMenuInfo(&TopMenuInfo, topmenu)
|
if (MenuGetRosMenuInfo(&TopMenuInfo, topmenu)
|
||||||
&& MenuGetRosMenuItemInfo(topmenu, pos, &ItemInfo))
|
&& MenuGetRosMenuItemInfo(topmenu, pos, &ItemInfo))
|
||||||
{
|
{
|
||||||
SendMessageW(hwndOwner, WM_MENUSELECT,
|
WPARAM wParam = MAKELONG( Pos, ItemInfo.fType | ItemInfo.fState |
|
||||||
MAKELONG(Pos, ItemInfo.fType | ItemInfo.fState
|
(TopMenuInfo.Flags & MNF_SYSDESKMN ? MF_SYSMENU : 0 ) );
|
||||||
| MF_MOUSESELECT
|
|
||||||
| (TopMenuInfo.Flags & MF_SYSMENU)),
|
SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) topmenu);
|
||||||
(LPARAM) topmenu);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2341,7 +2345,7 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl
|
||||||
/* correct item if modified as a reaction to WM_INITMENUPOPUP message */
|
/* correct item if modified as a reaction to WM_INITMENUPOPUP message */
|
||||||
if (0 == (ItemInfo.fState & MF_HILITE))
|
if (0 == (ItemInfo.fState & MF_HILITE))
|
||||||
{
|
{
|
||||||
if (0 != (MenuInfo->Flags & MF_POPUP))
|
if (0 != (MenuInfo->Flags & MNF_POPUP))
|
||||||
{
|
{
|
||||||
Dc = GetDC(MenuInfo->Wnd);
|
Dc = GetDC(MenuInfo->Wnd);
|
||||||
}
|
}
|
||||||
|
@ -2355,7 +2359,7 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl
|
||||||
ItemInfo.fState |= MF_HILITE;
|
ItemInfo.fState |= MF_HILITE;
|
||||||
MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo);
|
MenuSetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo);
|
||||||
MenuDrawMenuItem(MenuInfo->Wnd, MenuInfo, WndOwner, Dc, &ItemInfo, MenuInfo->Height,
|
MenuDrawMenuItem(MenuInfo->Wnd, MenuInfo, WndOwner, Dc, &ItemInfo, MenuInfo->Height,
|
||||||
! (MenuInfo->Flags & MF_POPUP), ODA_DRAWENTIRE);
|
! (MenuInfo->Flags & MNF_POPUP), ODA_DRAWENTIRE);
|
||||||
ReleaseDC(MenuInfo->Wnd, Dc);
|
ReleaseDC(MenuInfo->Wnd, Dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2382,7 +2386,7 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GetWindowRect(MenuInfo->Wnd, &Rect);
|
GetWindowRect(MenuInfo->Wnd, &Rect);
|
||||||
if (0 != (MenuInfo->Flags & MF_POPUP))
|
if (0 != (MenuInfo->Flags & MNF_POPUP))
|
||||||
{
|
{
|
||||||
Rect.left += ItemInfo.Rect.right - GetSystemMetrics(SM_CXBORDER);
|
Rect.left += ItemInfo.Rect.right - GetSystemMetrics(SM_CXBORDER);
|
||||||
Rect.top += ItemInfo.Rect.top - 3;
|
Rect.top += ItemInfo.Rect.top - 3;
|
||||||
|
@ -2485,7 +2489,7 @@ MenuSwitchTracking(MTRACKER* Mt, PROSMENUINFO PtMenuInfo, UINT Index, UINT wFlag
|
||||||
|
|
||||||
if (MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu) &&
|
if (MenuGetRosMenuInfo(&TopMenuInfo, Mt->TopMenu) &&
|
||||||
Mt->TopMenu != PtMenuInfo->Self &&
|
Mt->TopMenu != PtMenuInfo->Self &&
|
||||||
0 == ((PtMenuInfo->Flags | TopMenuInfo.Flags) & MF_POPUP))
|
0 == ((PtMenuInfo->Flags | TopMenuInfo.Flags) & MNF_POPUP))
|
||||||
{
|
{
|
||||||
/* both are top level menus (system and menu-bar) */
|
/* both are top level menus (system and menu-bar) */
|
||||||
MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE, wFlags);
|
MenuHideSubPopups(Mt->OwnerWnd, &TopMenuInfo, FALSE, wFlags);
|
||||||
|
@ -2541,17 +2545,20 @@ MenuExecFocusedItem(MTRACKER *Mt, PROSMENUINFO MenuInfo, UINT Flags)
|
||||||
do not send a message to the owner */
|
do not send a message to the owner */
|
||||||
if (0 == (Flags & TPM_RETURNCMD))
|
if (0 == (Flags & TPM_RETURNCMD))
|
||||||
{
|
{
|
||||||
if (0 != (MenuInfo->Flags & MF_SYSMENU))
|
if (0 != (MenuInfo->Flags & MNF_SYSDESKMN))
|
||||||
{
|
{
|
||||||
PostMessageW(Mt->OwnerWnd, WM_SYSCOMMAND, ItemInfo.wID,
|
PostMessageW(Mt->OwnerWnd, WM_SYSCOMMAND, ItemInfo.wID,
|
||||||
MAKELPARAM((SHORT) Mt->Pt.x, (SHORT) Mt->Pt.y));
|
MAKELPARAM((SHORT) Mt->Pt.x, (SHORT) Mt->Pt.y));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (MenuInfo->dwStyle & MNS_NOTIFYBYPOS)
|
BOOL ret;
|
||||||
PostMessageW(Mt->OwnerWnd, WM_MENUCOMMAND,
|
ROSMENUINFO topmenuI;
|
||||||
MenuInfo->FocusedItem,
|
ret = MenuGetRosMenuInfo(&topmenuI, Mt->TopMenu);
|
||||||
(LPARAM)MenuInfo->Self);
|
DWORD dwStyle = MenuInfo->dwStyle | (ret ? topmenuI.dwStyle : 0);
|
||||||
|
|
||||||
|
if (dwStyle & MNS_NOTIFYBYPOS)
|
||||||
|
PostMessageW(Mt->OwnerWnd, WM_MENUCOMMAND, MenuInfo->FocusedItem, (LPARAM)MenuInfo->Self);
|
||||||
else
|
else
|
||||||
PostMessageW(Mt->OwnerWnd, WM_COMMAND, ItemInfo.wID, 0);
|
PostMessageW(Mt->OwnerWnd, WM_COMMAND, ItemInfo.wID, 0);
|
||||||
}
|
}
|
||||||
|
@ -2727,7 +2734,7 @@ MenuPtMenu(HMENU Menu, POINT Pt)
|
||||||
|
|
||||||
/* check the current window (avoiding WM_HITTEST) */
|
/* check the current window (avoiding WM_HITTEST) */
|
||||||
Ht = DefWndNCHitTest(MenuInfo.Wnd, Pt);
|
Ht = DefWndNCHitTest(MenuInfo.Wnd, Pt);
|
||||||
if (0 != (MenuInfo.Flags & MF_POPUP))
|
if (0 != (MenuInfo.Flags & MNF_POPUP))
|
||||||
{
|
{
|
||||||
if (HTNOWHERE != Ht && HTERROR != Ht)
|
if (HTNOWHERE != Ht && HTERROR != Ht)
|
||||||
{
|
{
|
||||||
|
@ -3013,7 +3020,7 @@ MenuKeyEscape(MTRACKER *Mt, UINT Flags)
|
||||||
if (Mt->CurrentMenu != Mt->TopMenu)
|
if (Mt->CurrentMenu != Mt->TopMenu)
|
||||||
{
|
{
|
||||||
if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)
|
if (MenuGetRosMenuInfo(&MenuInfo, Mt->CurrentMenu)
|
||||||
&& 0 != (MenuInfo.Flags & MF_POPUP))
|
&& 0 != (MenuInfo.Flags & MNF_POPUP))
|
||||||
{
|
{
|
||||||
MenuPrev = MenuTmp = Mt->TopMenu;
|
MenuPrev = MenuTmp = Mt->TopMenu;
|
||||||
|
|
||||||
|
@ -3085,7 +3092,7 @@ MenuKeyLeft(MTRACKER* Mt, UINT Flags)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((MenuPrev == Mt->TopMenu) && !(TopMenuInfo.Flags & MF_POPUP))
|
if ((MenuPrev == Mt->TopMenu) && !(TopMenuInfo.Flags & MNF_POPUP))
|
||||||
{
|
{
|
||||||
/* move menu bar selection if no more popups are left */
|
/* move menu bar selection if no more popups are left */
|
||||||
|
|
||||||
|
@ -3125,7 +3132,7 @@ static void FASTCALL MenuKeyRight(MTRACKER *Mt, UINT Flags)
|
||||||
Mt->CurrentMenu, Mt->TopMenu);
|
Mt->CurrentMenu, Mt->TopMenu);
|
||||||
|
|
||||||
if (! MenuGetRosMenuInfo(&MenuInfo, Mt->TopMenu)) return;
|
if (! MenuGetRosMenuInfo(&MenuInfo, Mt->TopMenu)) return;
|
||||||
if ((MenuInfo.Flags & MF_POPUP) || (Mt->CurrentMenu != Mt->TopMenu))
|
if ((MenuInfo.Flags & MNF_POPUP) || (Mt->CurrentMenu != Mt->TopMenu))
|
||||||
{
|
{
|
||||||
/* If already displaying a popup, try to display sub-popup */
|
/* If already displaying a popup, try to display sub-popup */
|
||||||
|
|
||||||
|
@ -3155,7 +3162,7 @@ static void FASTCALL MenuKeyRight(MTRACKER *Mt, UINT Flags)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(MenuInfo.Flags & MF_POPUP)) /* menu bar tracking */
|
if (!(MenuInfo.Flags & MNF_POPUP)) /* menu bar tracking */
|
||||||
{
|
{
|
||||||
if (Mt->CurrentMenu != Mt->TopMenu)
|
if (Mt->CurrentMenu != Mt->TopMenu)
|
||||||
{
|
{
|
||||||
|
@ -3266,7 +3273,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
|
||||||
}
|
}
|
||||||
if (!enterIdleSent)
|
if (!enterIdleSent)
|
||||||
{
|
{
|
||||||
HWND win = MenuInfo.Flags & MF_POPUP ? MenuInfo.Wnd : NULL;
|
HWND win = MenuInfo.Flags & MNF_POPUP ? MenuInfo.Wnd : NULL;
|
||||||
enterIdleSent = TRUE;
|
enterIdleSent = TRUE;
|
||||||
SendMessageW( mt.OwnerWnd, WM_ENTERIDLE, MSGF_MENU, (LPARAM) win);
|
SendMessageW( mt.OwnerWnd, WM_ENTERIDLE, MSGF_MENU, (LPARAM) win);
|
||||||
}
|
}
|
||||||
|
@ -3385,7 +3392,7 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
|
||||||
case VK_DOWN: /* If on menu bar, pull-down the menu */
|
case VK_DOWN: /* If on menu bar, pull-down the menu */
|
||||||
if (MenuGetRosMenuInfo(&MenuInfo, mt.CurrentMenu))
|
if (MenuGetRosMenuInfo(&MenuInfo, mt.CurrentMenu))
|
||||||
{
|
{
|
||||||
if (!(MenuInfo.Flags & MF_POPUP))
|
if (!(MenuInfo.Flags & MNF_POPUP))
|
||||||
{
|
{
|
||||||
if (MenuGetRosMenuInfo(&MenuInfo, mt.TopMenu))
|
if (MenuGetRosMenuInfo(&MenuInfo, mt.TopMenu))
|
||||||
mt.CurrentMenu = MenuShowSubPopup(mt.OwnerWnd, &MenuInfo, TRUE, wFlags);
|
mt.CurrentMenu = MenuShowSubPopup(mt.OwnerWnd, &MenuInfo, TRUE, wFlags);
|
||||||
|
@ -3508,16 +3515,15 @@ static INT FASTCALL MenuTrackMenu(HMENU hmenu, UINT wFlags, INT x, INT y,
|
||||||
{
|
{
|
||||||
MenuHideSubPopups(mt.OwnerWnd, &MenuInfo, FALSE, wFlags);
|
MenuHideSubPopups(mt.OwnerWnd, &MenuInfo, FALSE, wFlags);
|
||||||
|
|
||||||
if (MenuInfo.Flags & MF_POPUP)
|
if (MenuInfo.Flags & MNF_POPUP)
|
||||||
{
|
{
|
||||||
IntNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, MenuInfo.Wnd, OBJID_CLIENT, CHILDID_SELF, 0);
|
IntNotifyWinEvent(EVENT_SYSTEM_MENUPOPUPEND, MenuInfo.Wnd, OBJID_CLIENT, CHILDID_SELF, 0);
|
||||||
DestroyWindow(MenuInfo.Wnd);
|
DestroyWindow(MenuInfo.Wnd);
|
||||||
MenuInfo.Wnd = NULL;
|
MenuInfo.Wnd = NULL;
|
||||||
|
|
||||||
if (!(MenuInfo.Flags & TPM_NONOTIFY))
|
if (!(wFlags & TPM_NONOTIFY))
|
||||||
SendMessageW( mt.OwnerWnd, WM_UNINITMENUPOPUP, (WPARAM)mt.TopMenu,
|
SendMessageW( mt.OwnerWnd, WM_UNINITMENUPOPUP, (WPARAM)mt.TopMenu,
|
||||||
MAKELPARAM(0, IS_SYSTEM_MENU(&MenuInfo)) );
|
MAKELPARAM(0, IS_SYSTEM_MENU(&MenuInfo)) );
|
||||||
|
|
||||||
}
|
}
|
||||||
MenuSelectItem( mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM, FALSE, 0 );
|
MenuSelectItem( mt.OwnerWnd, &MenuInfo, NO_SELECTED_ITEM, FALSE, 0 );
|
||||||
}
|
}
|
||||||
|
@ -3585,7 +3591,7 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT
|
||||||
|
|
||||||
IntNotifyWinEvent( EVENT_SYSTEM_MENUSTART,
|
IntNotifyWinEvent( EVENT_SYSTEM_MENUSTART,
|
||||||
hWnd,
|
hWnd,
|
||||||
MenuInfo.Flags & MF_SYSMENU ? OBJID_SYSMENU : OBJID_MENU,
|
MenuInfo.Flags & MNF_SYSDESKMN ? OBJID_SYSMENU : OBJID_MENU,
|
||||||
CHILDID_SELF, 0);
|
CHILDID_SELF, 0);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue