Author: janderwald Date: Sun May 18 09:18:00 2008 New Revision: 33578
URL: http://svn.reactos.org/svn/reactos?rev=33578&view=rev Log: - default to seperator item type - add the styles grayed and disabled in case they have not been added - initialize allocated user buffer to zero - allow support for bitmap items with MF_HELP style - check result of WideCharToMultiByte - always zero terminate a string buffer when enough space is available
Modified: trunk/reactos/dll/win32/user32/windows/menu.c
Modified: trunk/reactos/dll/win32/user32/windows/menu.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/me... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/menu.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/windows/menu.c [iso-8859-1] Sun May 18 09:18:00 2008 @@ -1109,8 +1109,15 @@ } else /* Not a popup */ { - if (flags == 0 && id == 0 && *str == 0) - flags = MF_SEPARATOR | MF_GRAYED; + if (*str == 0) + flags = MF_SEPARATOR; + + if (flags & MF_SEPARATOR) + { + if (!(flags & (MF_GRAYED | MF_DISABLED))) + flags |= MF_GRAYED | MF_DISABLED; + } + if(!unicode) AppendMenuA(hMenu, flags, id, *str ? str : NULL); else @@ -3705,19 +3712,38 @@ */ if(Flags & MF_BITMAP) { - mii->fMask |= MIIM_BITMAP; /* Use the new way of seting hbmpItem.*/ - mii->hbmpItem = (HBITMAP) NewItem; - mii->fType &= ~MFT_BITMAP; /* just incase, Kill the old way */ + if (mii->fType & MFT_BITMAP) + { + /* use old way of storing bitmap */ + mii->fMask |= (MIIM_TYPE | MIIM_FTYPE); + mii->fType |= MF_BITMAP; + mii->dwTypeData = (LPWSTR)NewItem; + } + else + { + /* use new way of storing type */ + mii->hbmpItem = (HBITMAP) NewItem; + mii->fType |= MFT_BITMAP; + mii->fMask |= MIIM_BITMAP; + } + + if (Flags & MF_HELP) + { + /* increase ident */ + mii->fType |= MF_HELP; + } } else if(Flags & MF_OWNERDRAW) { mii->fType |= MFT_OWNERDRAW; - mii->fMask |= MIIM_DATA; - mii->dwItemData = (DWORD) NewItem; + mii->fMask |= (MIIM_TYPE | MIIM_FTYPE); + mii->dwTypeData = (LPWSTR) NewItem; } else if (Flags & MF_SEPARATOR) { mii->fType |= MFT_SEPARATOR; + if (!(Flags & (MF_GRAYED|MF_DISABLED))) + Flags |= MF_GRAYED|MF_DISABLED; } else /* Default action MF_STRING. */ { @@ -3742,15 +3768,23 @@ NewItem = (LPCWSTR) NewItemA; } } - } - mii->fMask |= MIIM_STRING; - mii->fType |= MFT_STRING; /* Zero */ - mii->dwTypeData = (LPWSTR)NewItem; - if (Unicode) - mii->cch = (NULL == NewItem ? 0 : strlenW(NewItem)); + + if (Flags & MF_HELP) + mii->fType |= MF_HELP; + mii->fMask |= MIIM_STRING; + mii->fType |= MFT_STRING; /* Zero */ + mii->dwTypeData = (LPWSTR)NewItem; + if (Unicode) + mii->cch = (NULL == NewItem ? 0 : strlenW(NewItem)); + else + mii->cch = (NULL == NewItem ? 0 : strlen((LPCSTR)NewItem)); + } else - mii->cch = (NULL == NewItem ? 0 : strlen((LPCSTR)NewItem)); - mii->hbmpItem = NULL; + { + mii->fType |= MFT_SEPARATOR; + if (!(Flags & (MF_GRAYED|MF_DISABLED))) + Flags |= MF_GRAYED|MF_DISABLED; + } }
if(Flags & MF_RIGHTJUSTIFY) /* Same as MF_HELP */ @@ -3767,14 +3801,14 @@ mii->fType |= MFT_MENUBARBREAK; }
- if(Flags & MF_GRAYED) + if(Flags & MF_GRAYED || Flags & MF_DISABLED) { - mii->fState |= MFS_GRAYED; - mii->fMask |= MIIM_STATE; - } - else if(Flags & MF_DISABLED) - { - mii->fState |= MFS_DISABLED; + if (Flags & MF_GRAYED) + mii->fState |= MF_GRAYED; + + if (Flags & MF_DISABLED) + mii->fState |= MF_DISABLED; + mii->fMask |= MIIM_STATE; } else if (Flags & MF_HILITE) @@ -4213,6 +4247,7 @@ miiW.dwTypeData = RtlAllocateHeap(GetProcessHeap(), 0, miiW.cch * sizeof(WCHAR)); if (miiW.dwTypeData == NULL) return FALSE; + miiW.dwTypeData[0] = 0; }
if (!NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO)&miiW, FALSE)) @@ -4233,13 +4268,27 @@
if ((miiW.fMask & MIIM_STRING) || (IS_STRING_ITEM(miiW.fType))) { - WideCharToMultiByte(CP_ACP, 0, miiW.dwTypeData, miiW.cch, AnsiBuffer, - mii->cch, NULL, NULL); + if (miiW.cch) + { + if (!WideCharToMultiByte(CP_ACP, 0, miiW.dwTypeData, miiW.cch, AnsiBuffer, mii->cch, NULL, NULL)) + { + AnsiBuffer[0] = 0; + } + if (Count > miiW.cch) + { + AnsiBuffer[miiW.cch] = 0; + } + mii->cch = mii->cch; + } + } + else + { + AnsiBuffer[0] = 0; }
RtlFreeHeap(GetProcessHeap(), 0, miiW.dwTypeData); mii->dwTypeData = AnsiBuffer; - mii->cch = strlen(AnsiBuffer); + return TRUE; }
@@ -4281,6 +4330,7 @@ miiW.dwTypeData = RtlAllocateHeap(GetProcessHeap(), 0, miiW.cch * sizeof(WCHAR)); if (miiW.dwTypeData == NULL) return FALSE; + miiW.dwTypeData[0] = 0; }
if (!NtUserMenuItemInfo(Menu, Item, ByPosition, (PROSMENUITEMINFO) &miiW, FALSE))