diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index 4e5c797f8d7..bf20483dc1b 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -16,7 +16,7 @@ * 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.38 2003/12/24 21:10:16 navaraf Exp $ +/* $Id: menu.c,v 1.39 2003/12/28 00:19:24 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -65,6 +65,8 @@ #define POPUPMENU_CLASS_ATOMA MAKEINTATOMA(32768) /* PopupMenu */ #define POPUPMENU_CLASS_ATOMW MAKEINTATOMW(32768) /* PopupMenu */ +static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + /********************************************************************* * PopupMenu class descriptor */ @@ -72,11 +74,11 @@ const struct builtin_class_descr POPUPMENU_builtin_class = { POPUPMENU_CLASS_ATOMW, /* name */ CS_GLOBALCLASS | CS_SAVEBITS | CS_DBLCLKS, /* style */ - (WNDPROC) NULL, /* FIXME - procW */ + (WNDPROC) PopupMenuWndProcW, /* FIXME - procW */ (WNDPROC) NULL, /* FIXME - procA */ sizeof(MENUINFO *), /* extra */ (LPCWSTR) IDC_ARROW, /* cursor */ - (HBRUSH)COLOR_MENU /* brush */ + (HBRUSH)(COLOR_MENU + 1) /* brush */ }; @@ -97,6 +99,16 @@ const struct builtin_class_descr POPUPMENU_builtin_class = HFONT hMenuFont = NULL; HFONT hMenuFontBold = NULL; +static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch(message) + { + default: + return DefWindowProcW(hwnd, message, wParam, lParam); + } + return 0; +} + /********************************************************************** * MENUEX_ParseResource * @@ -593,14 +605,18 @@ EnableMenuItem(HMENU hMenu, } /* - * @unimplemented + * @implemented */ WINBOOL STDCALL EndMenu(VOID) { - UNIMPLEMENTED; - /* FIXME - return NtUserEndMenu(); */ - return FALSE; + GUITHREADINFO guii; + guii.cbSize = sizeof(GUITHREADINFO); + if(GetGUIThreadInfo(GetCurrentThreadId(), &guii) && guii.hwndMenuOwner) + { + PostMessageW(guii.hwndMenuOwner, WM_CANCELMODE, 0, 0); + } + return TRUE; } @@ -1293,7 +1309,7 @@ SetMenuItemInfoW( /* - * @unimplemented + * @implemented */ WINBOOL STDCALL @@ -1306,13 +1322,21 @@ TrackPopupMenu( HWND hWnd, CONST RECT *prcRect) { - UNIMPLEMENTED; - return FALSE; + TPMPARAMS tpm; + + if(prcRect) + { + tpm.cbSize = sizeof(TPMPARAMS); + tpm.rcExclude = *prcRect; + } + + return (WINBOOL)NtUserTrackPopupMenuEx(hMenu, uFlags, x, y, hWnd, + (prcRect ? &tpm : NULL)); } /* - * @unimplemented + * @implemented */ WINBOOL STDCALL @@ -1324,8 +1348,7 @@ TrackPopupMenuEx( HWND hwnd, LPTPMPARAMS lptpm) { - UNIMPLEMENTED; - return FALSE; + return (WINBOOL)NtUserTrackPopupMenuEx(hmenu, fuFlags, x, y, hwnd, lptpm); } diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index 3308e4ad04d..f161df805c5 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.c @@ -16,7 +16,7 @@ * 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.36 2003/12/22 15:30:21 navaraf Exp $ +/* $Id: menu.c,v 1.37 2003/12/28 00:19:24 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -38,6 +38,7 @@ #include #include #include +#include #define NDEBUG #include @@ -1035,6 +1036,16 @@ IntGetMenuDefaultItem(PMENU_OBJECT MenuObject, UINT fByPos, UINT gmdiFlags, return res; } + +BOOL FASTCALL +IntTrackPopupMenu(PMENU_OBJECT MenuObject, PWINDOW_OBJECT WindowObject, + UINT Flags, POINT *Pos, UINT MenuPos, RECT *ExcludeRect) +{ + + return FALSE; +} + + /*! * Internal function. Called when the process is destroyed to free the remaining menu handles. */ @@ -1607,7 +1618,7 @@ NtUserThunkedMenuItemInfo( /* - * @unimplemented + * @implemented */ BOOL STDCALL NtUserTrackPopupMenuEx( @@ -1618,9 +1629,57 @@ NtUserTrackPopupMenuEx( HWND hwnd, LPTPMPARAMS lptpm) { - UNIMPLEMENTED - - return 0; + PMENU_OBJECT MenuObject; + PWINDOW_OBJECT WindowObject; + TPMPARAMS Safetpm; + NTSTATUS Status; + POINT Pos; + BOOL Ret; + + MenuObject = IntGetMenuObject(hmenu); + if(!MenuObject) + { + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); + return FALSE; + } + + WindowObject = IntGetWindowObject(hwnd); + if(!WindowObject) + { + IntReleaseMenuObject(MenuObject); + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + if(lptpm) + { + Status = MmCopyFromCaller(&Safetpm, lptpm, sizeof(TPMPARAMS)); + if(!NT_SUCCESS(Status)) + { + IntReleaseWindowObject(WindowObject); + IntReleaseMenuObject(MenuObject); + SetLastNtError(Status); + return FALSE; + } + if(Safetpm.cbSize != sizeof(TPMPARAMS)) + { + IntReleaseWindowObject(WindowObject); + IntReleaseMenuObject(MenuObject); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + } + + Pos.x = x; + Pos.y = y; + + Ret = IntTrackPopupMenu(MenuObject, WindowObject, fuFlags, &Pos, 0, + (lptpm ? &Safetpm.rcExclude : NULL)); + + IntReleaseWindowObject(WindowObject); + IntReleaseMenuObject(MenuObject); + + return Ret; }