Jacek Caban : win32u: Move NtUserGetMenuItemRect implementation from user32.
Alexandre Julliard
julliard at winehq.org
Wed Apr 20 16:49:49 CDT 2022
Module: wine
Branch: master
Commit: 19a2af27673271a464172fb8f115ca4f811325e2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=19a2af27673271a464172fb8f115ca4f811325e2
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Apr 20 15:57:02 2022 +0200
win32u: Move NtUserGetMenuItemRect implementation from user32.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/menu.c | 49 ++-----------------------------------------------
dlls/user32/user32.spec | 2 +-
dlls/win32u/menu.c | 40 ++++++++++++++++++++++++++++++++++++++++
dlls/win32u/syscall.c | 1 +
dlls/win32u/win32u.spec | 2 +-
dlls/wow64win/syscall.h | 1 +
dlls/wow64win/user.c | 10 ++++++++++
include/ntuser.h | 1 +
8 files changed, 57 insertions(+), 49 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 8df665c9132..c62e0818e60 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -4262,13 +4262,13 @@ BOOL WINAPI GetMenuBarInfo( HWND hwnd, LONG idObject, LONG idItem, PMENUBARINFO
}
else if (idItem == 0)
{
- GetMenuItemRect(hwnd, hmenu, 0, &pmbi->rcBar);
+ NtUserGetMenuItemRect( hwnd, hmenu, 0, &pmbi->rcBar );
pmbi->rcBar.right = pmbi->rcBar.left + menu->Width;
pmbi->rcBar.bottom = pmbi->rcBar.top + menu->Height;
}
else
{
- GetMenuItemRect(hwnd, hmenu, idItem - 1, &pmbi->rcBar);
+ NtUserGetMenuItemRect( hwnd, hmenu, idItem - 1, &pmbi->rcBar );
}
pmbi->hMenu = hmenu;
@@ -5120,51 +5120,6 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMenu, UINT first, UINT last,
}
-/**********************************************************************
- * GetMenuItemRect (USER32.@)
- *
- * ATTENTION: Here, the returned values in rect are the screen
- * coordinates of the item just like if the menu was
- * always on the upper left side of the application.
- *
- */
-BOOL WINAPI GetMenuItemRect(HWND hwnd, HMENU hMenu, UINT uItem, RECT *rect)
-{
- POPUPMENU *menu;
- UINT pos;
- RECT window_rect;
-
- TRACE("(%p,%p,%d,%p)\n", hwnd, hMenu, uItem, rect);
-
- if (!rect)
- return FALSE;
-
- if (!(menu = find_menu_item(hMenu, uItem, MF_BYPOSITION, &pos)))
- return FALSE;
-
- if (!hwnd) hwnd = menu->hWnd;
- if (!hwnd)
- {
- release_menu_ptr(menu);
- return FALSE;
- }
-
- *rect = menu->items[pos].rect;
- OffsetRect(rect, menu->items_rect.left, menu->items_rect.top);
-
- /* Popup menu item draws in the client area */
- if (menu->wFlags & MF_POPUP) MapWindowPoints(hwnd, 0, (POINT *)rect, 2);
- else
- {
- /* Sysmenu draws in the non-client area */
- GetWindowRect(hwnd, &window_rect);
- OffsetRect(rect, window_rect.left, window_rect.top);
- }
-
- release_menu_ptr(menu);
- return TRUE;
-}
-
/**********************************************************************
* SetMenuInfo (USER32.@)
*
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 8af07c49e98..6c54957795b 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -338,7 +338,7 @@
@ stdcall GetMenuItemID(long long)
@ stdcall GetMenuItemInfoA(long long long ptr)
@ stdcall GetMenuItemInfoW(long long long ptr)
-@ stdcall GetMenuItemRect(long long long ptr)
+@ stdcall GetMenuItemRect(long long long ptr) NtUserGetMenuItemRect
@ stdcall GetMenuState(long long long)
@ stdcall GetMenuStringA(long long ptr long long)
@ stdcall GetMenuStringW(long long ptr long long)
diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c
index fcb6b83b2e8..ef539d1ffdd 100644
--- a/dlls/win32u/menu.c
+++ b/dlls/win32u/menu.c
@@ -348,6 +348,46 @@ BOOL draw_menu_bar( HWND hwnd )
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
}
+/**********************************************************************
+ * NtUserGetMenuItemRect (win32u.@)
+ */
+BOOL WINAPI NtUserGetMenuItemRect( HWND hwnd, HMENU handle, UINT item, RECT *rect )
+{
+ POPUPMENU *menu;
+ UINT pos;
+ RECT window_rect;
+
+ TRACE( "(%p,%p,%d,%p)\n", hwnd, handle, item, rect );
+
+ if (!rect)
+ return FALSE;
+
+ if (!(menu = find_menu_item( handle, item, MF_BYPOSITION, &pos )))
+ return FALSE;
+
+ if (!hwnd) hwnd = menu->hWnd;
+ if (!hwnd)
+ {
+ release_menu_ptr( menu );
+ return FALSE;
+ }
+
+ *rect = menu->items[pos].rect;
+ OffsetRect( rect, menu->items_rect.left, menu->items_rect.top );
+
+ /* Popup menu item draws in the client area */
+ if (menu->wFlags & MF_POPUP) map_window_points( hwnd, 0, (POINT *)rect, 2, get_thread_dpi() );
+ else
+ {
+ /* Sysmenu draws in the non-client area */
+ get_window_rect( hwnd, &window_rect, get_thread_dpi() );
+ OffsetRect( rect, window_rect.left, window_rect.top );
+ }
+
+ release_menu_ptr(menu);
+ return TRUE;
+}
+
/**********************************************************************
* NtUserSetMenuContextHelpId (win32u.@)
*/
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 18204a34379..3ac03cef0d9 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -136,6 +136,7 @@ static void * const syscalls[] =
NtUserGetKeyboardLayoutName,
NtUserGetKeyboardState,
NtUserGetLayeredWindowAttributes,
+ NtUserGetMenuItemRect,
NtUserGetMouseMovePointsEx,
NtUserGetObjectInformation,
NtUserGetOpenClipboardWindow,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index 4acb1dae455..44094a55b13 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -954,7 +954,7 @@
@ stub NtUserGetListBoxInfo
@ stub NtUserGetMenuBarInfo
@ stub NtUserGetMenuIndex
-@ stub NtUserGetMenuItemRect
+@ stdcall -syscall NtUserGetMenuItemRect(long long long ptr)
@ stdcall NtUserGetMessage(ptr long long long)
@ stdcall -syscall NtUserGetMouseMovePointsEx(long ptr ptr long long)
@ stdcall -syscall NtUserGetObjectInformation(long long long long ptr)
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index fe1b2a2e2e1..52df3a4d67c 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -123,6 +123,7 @@
SYSCALL_ENTRY( NtUserGetKeyboardLayoutName ) \
SYSCALL_ENTRY( NtUserGetKeyboardState ) \
SYSCALL_ENTRY( NtUserGetLayeredWindowAttributes ) \
+ SYSCALL_ENTRY( NtUserGetMenuItemRect ) \
SYSCALL_ENTRY( NtUserGetMouseMovePointsEx ) \
SYSCALL_ENTRY( NtUserGetObjectInformation ) \
SYSCALL_ENTRY( NtUserGetOpenClipboardWindow ) \
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 08c65e8a3df..f964b2d1b11 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -642,6 +642,16 @@ NTSTATUS WINAPI wow64_NtUserCheckMenuItem( UINT *args )
return NtUserCheckMenuItem( handle, id, flags );
}
+NTSTATUS WINAPI wow64_NtUserGetMenuItemRect( UINT *args )
+{
+ HWND hwnd = get_handle( &args );
+ HMENU handle = get_handle( &args );
+ UINT item = get_ulong( &args );
+ RECT *rect = get_ptr( &args );
+
+ return NtUserGetMenuItemRect( hwnd, handle, item, rect );
+}
+
NTSTATUS WINAPI wow64_NtUserSetMenuContextHelpId( UINT *args )
{
HMENU menu = get_handle( &args );
diff --git a/include/ntuser.h b/include/ntuser.h
index 7084dec19eb..47b6900619e 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -492,6 +492,7 @@ UINT WINAPI NtUserGetKeyboardLayoutList( INT size, HKL *layouts );
BOOL WINAPI NtUserGetKeyboardLayoutName( WCHAR *name );
BOOL WINAPI NtUserGetKeyboardState( BYTE *state );
BOOL WINAPI NtUserGetLayeredWindowAttributes( HWND hwnd, COLORREF *key, BYTE *alpha, DWORD *flags );
+BOOL WINAPI NtUserGetMenuItemRect( HWND hwnd, HMENU menu, UINT item, RECT *rect );
BOOL WINAPI NtUserGetMessage( MSG *msg, HWND hwnd, UINT first, UINT last );
int WINAPI NtUserGetMouseMovePointsEx( UINT size, MOUSEMOVEPOINT *ptin, MOUSEMOVEPOINT *ptout,
int count, DWORD resolution );
More information about the wine-cvs
mailing list