[patch 1/3] user32: put some repeated code for checking and extending of a MENUITEMINFO structure in a separate function.
Rein Klazes
wijn at online.nl
Thu Jul 23 00:56:06 CDT 2009
Note: this is the first patch of three to put all updating of menu
item to a single place. Now there are two internal routines that do
essentially the same thing. Of the two SetMenuItemInfo_common duplicates
code depending if the MIIM_TYPE flag is used or the newer (winver >= 5)
menuiteminfo flags. Cleaning this up should make it makes it easier to
fix issues with menu loop prevention and menu locking.
---
dlls/user32/menu.c | 91 +++++++++++++++++++++++----------------------------
1 files changed, 41 insertions(+), 50 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index f68393d..07447ad 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -4769,27 +4769,44 @@ static BOOL SetMenuItemInfo_common(MENUITEM * menu,
}
/**********************************************************************
+ * MENU_NormalizeMenuItemInfoStruct
+ *
+ * Helper for SetMenuItemInfo and InsertMenuItemInfo:
+ * check, copy and extend the MENUITEMINFO struct from the version that the application
+ * supplied to the version used by wine source. */
+static BOOL MENU_NormalizeMenuItemInfoStruct( const MENUITEMINFOW *pmii_in,
+ MENUITEMINFOW *pmii_out)
+{
+ /* do we recognized the size? */
+ if( pmii_in->cbSize != sizeof( MENUITEMINFOW) &&
+ pmii_in->cbSize != sizeof( MENUITEMINFOW) - sizeof( pmii_in->hbmpItem)) {
+ SetLastError( ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ /* copy the fields that we have */
+ memcpy( pmii_out, pmii_in, pmii_in->cbSize);
+ /* if the hbmpItem member is missing then extend */
+ if( pmii_in->cbSize != sizeof( MENUITEMINFOW)) {
+ pmii_out->cbSize = sizeof( MENUITEMINFOW);
+ pmii_out->hbmpItem = NULL;
+ }
+ return TRUE;
+}
+
+/**********************************************************************
* SetMenuItemInfoA (USER32.@)
*/
BOOL WINAPI SetMenuItemInfoA(HMENU hmenu, UINT item, BOOL bypos,
const MENUITEMINFOA *lpmii)
{
- MENUITEMINFOA mii;
+ MENUITEMINFOW mii;
TRACE("hmenu %p, item %u, by pos %d, info %p\n", hmenu, item, bypos, lpmii);
- if( lpmii->cbSize != sizeof( mii) &&
- lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
- SetLastError( ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- memcpy( &mii, lpmii, lpmii->cbSize);
- if( lpmii->cbSize != sizeof( mii)) {
- mii.cbSize = sizeof( mii);
- mii.hbmpItem = NULL;
- }
- return SetMenuItemInfo_common(MENU_FindItem(&hmenu, &item, bypos? MF_BYPOSITION : 0),
- (const MENUITEMINFOW *)&mii, FALSE);
+ if( MENU_NormalizeMenuItemInfoStruct( (MENUITEMINFOW *)lpmii, &mii))
+ return SetMenuItemInfo_common( MENU_FindItem(&hmenu,
+ &item, bypos? MF_BYPOSITION : 0), &mii, FALSE);
+ return FALSE;
}
/**********************************************************************
@@ -4802,18 +4819,10 @@ BOOL WINAPI SetMenuItemInfoW(HMENU hmenu, UINT item, BOOL bypos,
TRACE("hmenu %p, item %u, by pos %d, info %p\n", hmenu, item, bypos, lpmii);
- if( lpmii->cbSize != sizeof( mii) &&
- lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
- SetLastError( ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- memcpy( &mii, lpmii, lpmii->cbSize);
- if( lpmii->cbSize != sizeof( mii)) {
- mii.cbSize = sizeof( mii);
- mii.hbmpItem = NULL;
- }
- return SetMenuItemInfo_common(MENU_FindItem(&hmenu,
- &item, bypos? MF_BYPOSITION : 0), &mii, TRUE);
+ if( MENU_NormalizeMenuItemInfoStruct( lpmii, &mii))
+ return SetMenuItemInfo_common(MENU_FindItem(&hmenu,
+ &item, bypos? MF_BYPOSITION : 0), &mii, TRUE);
+ return FALSE;
}
/**********************************************************************
@@ -4914,23 +4923,14 @@ BOOL WINAPI InsertMenuItemA(HMENU hMenu, UINT uItem, BOOL bypos,
const MENUITEMINFOA *lpmii)
{
MENUITEM *item;
- MENUITEMINFOA mii;
+ MENUITEMINFOW mii;
TRACE("hmenu %p, item %04x, by pos %d, info %p\n", hMenu, uItem, bypos, lpmii);
- if( lpmii->cbSize != sizeof( mii) &&
- lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
- SetLastError( ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- memcpy( &mii, lpmii, lpmii->cbSize);
- if( lpmii->cbSize != sizeof( mii)) {
- mii.cbSize = sizeof( mii);
- mii.hbmpItem = NULL;
- }
-
item = MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0 );
- return SetMenuItemInfo_common(item, (const MENUITEMINFOW *)&mii, FALSE);
+ if( MENU_NormalizeMenuItemInfoStruct( (MENUITEMINFOW *)lpmii, &mii))
+ return SetMenuItemInfo_common(item, &mii, FALSE);
+ return FALSE;
}
@@ -4945,19 +4945,10 @@ BOOL WINAPI InsertMenuItemW(HMENU hMenu, UINT uItem, BOOL bypos,
TRACE("hmenu %p, item %04x, by pos %d, info %p\n", hMenu, uItem, bypos, lpmii);
- if( lpmii->cbSize != sizeof( mii) &&
- lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
- SetLastError( ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- memcpy( &mii, lpmii, lpmii->cbSize);
- if( lpmii->cbSize != sizeof( mii)) {
- mii.cbSize = sizeof( mii);
- mii.hbmpItem = NULL;
- }
-
item = MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0 );
- return SetMenuItemInfo_common(item, &mii, TRUE);
+ if( MENU_NormalizeMenuItemInfoStruct( lpmii, &mii))
+ return SetMenuItemInfo_common(item, &mii, TRUE);
+ return FALSE;
}
/**********************************************************************
--
1.6.3.3
More information about the wine-patches
mailing list