diff --git a/reactos/subsys/win32k/include/menu.h b/reactos/subsys/win32k/include/menu.h new file mode 100644 index 00000000000..e24b3518710 --- /dev/null +++ b/reactos/subsys/win32k/include/menu.h @@ -0,0 +1,171 @@ +#ifndef __WIN32K_MENU_H +#define __WIN32K_MENU_H + +#include +#include + +#define IS_ATOM(x) \ + (((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000)) + +typedef struct _MENU_OBJECT +{ + HANDLE Self; + FAST_MUTEX MenuItemsLock; + LIST_ENTRY MenuItemsHead; + BOOL RtoL; + DWORD dwStyle; + UINT cyMax; + HBRUSH hbrBack; + DWORD dwContextHelpID; + ULONG_PTR dwMenuData; +} MENU_OBJECT, *PMENU_OBJECT; + +NTSTATUS FASTCALL +InitMenuImpl(VOID); + +NTSTATUS FASTCALL +CleanupMenuImpl(VOID); + +DWORD +STDCALL +NtUserCheckMenuItem( + HMENU hmenu, + UINT uIDCheckItem, + UINT uCheck); + +HMENU +STDCALL +NtUserCreateMenu(VOID); + +BOOL +STDCALL +NtUserDeleteMenu( +HMENU hMenu, + UINT uPosition, + UINT uFlags); + +BOOL +STDCALL +NtUserDestroyMenu( + HMENU hMenu); + +DWORD +STDCALL +NtUserDrawMenuBarTemp( + DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2, + DWORD Unknown3, + DWORD Unknown4); + +BOOL +STDCALL +NtUserEnableMenuItem( + HMENU hMenu, + UINT uIDEnableItem, + UINT uEnable); + +/*DWORD +STDCALL +NtUserInsertMenuItem( + HMENU hMenu, + UINT uItem, + WINBOOL fByPosition, + LPCMENUITEMINFO lpmii);*/ + +BOOL +STDCALL +NtUserEndMenu(VOID); + +BOOL +STDCALL +NtUserGetMenuBarInfo( + HWND hwnd, + LONG idObject, + LONG idItem, + PMENUBARINFO pmbi); + +DWORD +STDCALL +NtUserGetMenuIndex( + DWORD Unknown0, + DWORD Unknown1); + +BOOL +STDCALL +NtUserGetMenuItemRect( + HWND hWnd, + HMENU hMenu, + UINT uItem, + LPRECT lprcItem); + +BOOL +STDCALL +NtUserHiliteMenuItem( + HWND hwnd, + HMENU hmenu, + UINT uItemHilite, + UINT uHilite); + +int +STDCALL +NtUserMenuItemFromPoint( + HWND hWnd, + HMENU hMenu, + DWORD X, + DWORD Y); + +BOOL +STDCALL +NtUserRemoveMenu( + HMENU hMenu, + UINT uPosition, + UINT uFlags); + +BOOL +STDCALL +NtUserSetMenuContextHelpId( + HMENU hmenu, + DWORD dwContextHelpId); + +BOOL +STDCALL +NtUserSetMenuDefaultItem( + HMENU hMenu, + UINT uItem, + UINT fByPos); + +BOOL +STDCALL +NtUserSetMenuFlagRtoL( + HMENU hMenu); + +DWORD +STDCALL +NtUserThunkedMenuInfo( + DWORD Unknown0, + DWORD Unknown1); + +DWORD +STDCALL +NtUserThunkedMenuItemInfo( + DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2, + DWORD Unknown3, + DWORD Unknown4, + DWORD Unknown5); + +BOOL +STDCALL +NtUserTrackPopupMenuEx( + HMENU hmenu, + UINT fuFlags, + int x, + int y, + HWND hwnd, + LPTPMPARAMS lptpm); + +#endif /* __WIN32K_MENU_H */ + +/* EOF */ diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c new file mode 100644 index 00000000000..e2ad8e30c56 --- /dev/null +++ b/reactos/subsys/win32k/ntuser/menu.c @@ -0,0 +1,488 @@ +/* + * ReactOS W32 Subsystem + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* $Id: menu.c,v 1.1 2003/07/31 23:13:55 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Menus + * FILE: subsys/win32k/ntuser/menu.c + * PROGRAMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) + * REVISION HISTORY: + * 07/30/2003 CSH Created + */ +/* INCLUDES ******************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NDEBUG +#include + +/* INTERNAL ******************************************************************/ + +NTSTATUS FASTCALL +InitMenuImpl(VOID) +{ + return(STATUS_SUCCESS); +} + +NTSTATUS FASTCALL +CleanupMenuImpl(VOID) +{ + return(STATUS_SUCCESS); +} + +PMENU_OBJECT FASTCALL +W32kGetMenuObject(HMENU hMenu) +{ + PMENU_OBJECT MenuObject; + NTSTATUS Status = ObmReferenceObjectByHandle(PsGetWin32Process()-> + WindowStation->HandleTable, hMenu, otMenu, + (PVOID*)&MenuObject); + if (!NT_SUCCESS(Status)) + { + return(NULL); + } + return MenuObject; +} + +VOID FASTCALL +W32kReleaseMenuObject(PMENU_OBJECT MenuObject) +{ + ObmDereferenceObject(MenuObject); +} + +BOOL FASTCALL +W32kDestroyMenuObject(PMENU_OBJECT MenuObject) +{ + if(MenuObject) + { + /* remove all menu items */ + ExAcquireFastMutexUnsafe (&MenuObject->MenuItemsLock); + RemoveEntryList(&MenuObject->MenuItemsHead); + ExReleaseFastMutexUnsafe (&MenuObject->MenuItemsLock); + + W32kReleaseMenuObject(MenuObject); + + ObmCloseHandle(PsGetWin32Process()->WindowStation->HandleTable, MenuObject->Self); + + return TRUE; + } + return FALSE; +} + +PMENU_OBJECT FASTCALL +W32kCreateMenu(PHANDLE Handle) +{ + PMENU_OBJECT MenuObject = (PMENU_OBJECT)ObmCreateObject( + PsGetWin32Process()->WindowStation->HandleTable, Handle, + otMenu, sizeof(MENU_OBJECT)); + + if(!MenuObject) + { + *Handle = 0; + return NULL; + } + + MenuObject->Self = *Handle; + MenuObject->RtoL = FALSE; /* default */ + MenuObject->dwStyle = 0; /* FIXME */ + MenuObject->cyMax = 0; /* default */ + MenuObject->hbrBack = W32kGetSysColorBrush(COLOR_MENU); /*default background color */ + MenuObject->dwContextHelpID = 0; /* default */ + MenuObject->dwMenuData = 0; /* default */ + + InitializeListHead(&MenuObject->MenuItemsHead); + ExInitializeFastMutex(&MenuObject->MenuItemsLock); + + return MenuObject; +} + +BOOL FASTCALL +W32kSetMenuFlagRtoL(PMENU_OBJECT MenuObject) +{ + if(MenuObject) + { + MenuObject->RtoL = TRUE; + return TRUE; + } + return FALSE; +} + +BOOL FASTCALL +W32kSetMenuContextHelpId(PMENU_OBJECT MenuObject, DWORD dwContextHelpId) +{ + if(MenuObject) + { + MenuObject->dwContextHelpID = dwContextHelpId; + return TRUE; + } + return FALSE; +} + + +/* FUNCTIONS *****************************************************************/ + + +/* + * @unimplemented + */ +DWORD STDCALL +NtUserCheckMenuItem( + HMENU hmenu, + UINT uIDCheckItem, + UINT uCheck) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @implemented + */ +HMENU STDCALL +NtUserCreateMenu(VOID) +{ + PWINSTATION_OBJECT WinStaObject; + HANDLE Handle; + + NTSTATUS Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(WinStaObject); + DPRINT("Validation of window station handle (0x%X) failed\n", + PROCESS_WINDOW_STATION()); + SetLastNtError(Status); + return (HMENU)0; + } + + W32kCreateMenu(&Handle); + return (HMENU)Handle; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserDeleteMenu( + HMENU hMenu, + UINT uPosition, + UINT uFlags) +{ + + UNIMPLEMENTED + + return 0; +} + + +/* + * @implemented + */ +BOOL STDCALL +NtUserDestroyMenu( + HMENU hMenu) +{ + /* FIXME, check if menu belongs to the process */ + + PMENU_OBJECT MenuObject = W32kGetMenuObject(hMenu); + if(!MenuObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + return W32kDestroyMenuObject(MenuObject); +} + + +/* + * @unimplemented + */ +DWORD STDCALL +NtUserDrawMenuBarTemp( + DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2, + DWORD Unknown3, + DWORD Unknown4) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserEnableMenuItem( + HMENU hMenu, + UINT uIDEnableItem, + UINT uEnable) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +/*DWORD STDCALL +NtUserInsertMenuItem( + HMENU hMenu, + UINT uItem, + WINBOOL fByPosition, + LPCMENUITEMINFO lpmii) +{ + UNIMPLEMENTED + + return 0; +}*/ + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserEndMenu(VOID) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserGetMenuBarInfo( + HWND hwnd, + LONG idObject, + LONG idItem, + PMENUBARINFO pmbi) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +DWORD STDCALL +NtUserGetMenuIndex( + DWORD Unknown0, + DWORD Unknown1) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserGetMenuItemRect( + HWND hWnd, + HMENU hMenu, + UINT uItem, + LPRECT lprcItem) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserHiliteMenuItem( + HWND hwnd, + HMENU hmenu, + UINT uItemHilite, + UINT uHilite) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +int STDCALL +NtUserMenuItemFromPoint( + HWND hWnd, + HMENU hMenu, + DWORD X, + DWORD Y) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserRemoveMenu( + HMENU hMenu, + UINT uPosition, + UINT uFlags) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @implemented + */ +BOOL STDCALL +NtUserSetMenuContextHelpId( + HMENU hmenu, + DWORD dwContextHelpId) +{ + PMENU_OBJECT MenuObject = W32kGetMenuObject(hmenu); + if(!MenuObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + BOOL res = W32kSetMenuContextHelpId(MenuObject, dwContextHelpId); + W32kReleaseMenuObject(MenuObject); + return res; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserSetMenuDefaultItem( + HMENU hMenu, + UINT uItem, + UINT fByPos) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @implemented + */ +BOOL STDCALL +NtUserSetMenuFlagRtoL( + HMENU hMenu) +{ + PMENU_OBJECT MenuObject = W32kGetMenuObject(hMenu); + if(!MenuObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + BOOL res = W32kSetMenuFlagRtoL(MenuObject); + W32kReleaseMenuObject(MenuObject); + return res; +} + + +/* + * @unimplemented + */ +DWORD STDCALL +NtUserThunkedMenuInfo( + DWORD Unknown0, + DWORD Unknown1) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +DWORD STDCALL +NtUserThunkedMenuItemInfo( + DWORD Unknown0, + DWORD Unknown1, + DWORD Unknown2, + DWORD Unknown3, + DWORD Unknown4, + DWORD Unknown5) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL STDCALL +NtUserTrackPopupMenuEx( + HMENU hmenu, + UINT fuFlags, + int x, + int y, + HWND hwnd, + LPTPMPARAMS lptpm) +{ + UNIMPLEMENTED + + return 0; +} + +/* EOF */