Did you read this patch before committing it? Your last patch fixed tchar usage and then this next patch introduces new ones.
-----Original Message----- From: ros-diffs-bounces@reactos.org [mailto:ros-diffs-bounces@reactos.org] On Behalf Of mkupfer@svn.reactos.org Sent: 01 July 2009 22:57 To: ros-diffs@reactos.org Subject: [ros-diffs] [mkupfer] 41733: Mikhail Denisenko <denisenkom AT gmail DOT com> - Add symbols to system menu by using marlett font. - See issue #4450 for details.
Author: mkupfer Date: Thu Jul 2 01:56:44 2009 New Revision: 41733
URL: http://svn.reactos.org/svn/reactos?rev=41733&view=rev Log: Mikhail Denisenko <denisenkom AT gmail DOT com> - Add symbols to system menu by using marlett font. - See issue #4450 for details.
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] Thu Jul 2 01:56:44 2009 @@ -42,7 +42,6 @@ #define IS_SYSTEM_POPUP(MenuInfo) \ (0 != ((MenuInfo)->Flags & MF_POPUP) && 0 != ((MenuInfo)->Flags & MF_SYSMENU))
-#define IS_MAGIC_ITEM(Bmp) ((int) Bmp <12) #define IS_MAGIC_BITMAP(id) ((id) && ((INT_PTR)(id) < 12) && ((INT_PTR)(id) >= -1))
#define MENU_ITEM_HBMP_SPACE (5) @@ -307,7 +306,7 @@ Size->cx = Size->cy = 0;
/* check if there is a magic menu item associated with this item */ - if (0 != Bmp && IS_MAGIC_ITEM((INT)(Bmp))) + if (IS_MAGIC_BITMAP(Bmp)) { switch((INT_PTR) Bmp) { @@ -339,18 +338,15 @@ case (INT_PTR) HBMMENU_MBAR_CLOSE: case (INT_PTR) HBMMENU_MBAR_MINIMIZE_D: case (INT_PTR) HBMMENU_MBAR_CLOSE_D: + case (INT_PTR) HBMMENU_POPUP_CLOSE: + case (INT_PTR) HBMMENU_POPUP_RESTORE: + case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: + case (INT_PTR) HBMMENU_POPUP_MINIMIZE: /* FIXME: Why we need to subtract these magic values? */ /* to make them smaller than the menu bar? */ Size->cx = GetSystemMetrics(SM_CXSIZE) - 2; Size->cy = GetSystemMetrics(SM_CYSIZE) - 4; return; - case (INT_PTR) HBMMENU_POPUP_CLOSE: - case (INT_PTR) HBMMENU_POPUP_RESTORE: - case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: - case (INT_PTR) HBMMENU_POPUP_MINIMIZE: - default: - FIXME("Magic menu bitmap not implemented\n"); - return; } }
@@ -359,6 +355,70 @@ Size->cx = Bm.bmWidth; Size->cy = Bm.bmHeight; } +} + +/*********************************************************************** + * MenuDrawPopupGlyph + * + * Draws popup magic glyphs (can be found in system menu). + */ +static void FASTCALL +MenuDrawPopupGlyph(HDC dc, LPRECT r, INT_PTR popupMagic, BOOL inactive, BOOL hilite) +{ + LOGFONTW lf; + HFONT hFont, hOldFont; + COLORREF clrsave; + INT bkmode; + TCHAR symbol; + switch (popupMagic) + { + case (INT_PTR) HBMMENU_POPUP_RESTORE: + symbol = '2'; + break; + case (INT_PTR) HBMMENU_POPUP_MINIMIZE: + symbol = '0'; + break; + case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: + symbol = '1'; + break; + case (INT_PTR) HBMMENU_POPUP_CLOSE: + symbol = 'r'; + break; + default: + ERR("Invalid popup magic bitmap %d\n", (int)popupMagic); + return; + } + ZeroMemory(&lf, sizeof(LOGFONTW)); + InflateRect(r, -2, -2); + lf.lfHeight = r->bottom - r->top; + lf.lfWidth = 0; + lf.lfWeight = FW_NORMAL; + lf.lfCharSet = DEFAULT_CHARSET; + lstrcpy(lf.lfFaceName, TEXT("Marlett")); + hFont = CreateFontIndirect(&lf); + /* save font and text color */ + hOldFont = SelectObject(dc, hFont); + clrsave = GetTextColor(dc); + bkmode = GetBkMode(dc); + /* set color and drawing mode */ + SetBkMode(dc, TRANSPARENT); + if (inactive) + { + /* draw shadow */ + if (!hilite) + { + SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT)); + TextOut(dc, r->left + 1, r->top + 1, &symbol, 1); + } + } + SetTextColor(dc, GetSysColor(inactive ? COLOR_GRAYTEXT : (hilite ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT))); + /* draw selected symbol */ + TextOut(dc, r->left, r->top, &symbol, 1); + /* restore previous settings */ + SetTextColor(dc, clrsave); + SelectObject(dc, hOldFont); + SetBkMode(dc, bkmode); + DeleteObject(hFont); }
/*********************************************************************** @@ -382,7 +442,7 @@ Bmp = hbmpToDraw;
/* Check if there is a magic menu item associated with this item */ - if (IS_MAGIC_ITEM(hbmpToDraw)) + if (IS_MAGIC_BITMAP(hbmpToDraw)) { UINT Flags = 0; RECT r; @@ -459,8 +519,7 @@ case (INT_PTR) HBMMENU_POPUP_RESTORE: case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: case (INT_PTR) HBMMENU_POPUP_MINIMIZE: - default: - FIXME("Magic menu bitmap not implemented\n"); + MenuDrawPopupGlyph(Dc, &r, (INT_PTR)hbmpToDraw, Item->fState & MF_GRAYED, Item->fState & MF_HILITE); return; } InflateRect(&r, -1, -1); @@ -736,9 +795,17 @@ checked = TRUE; } } - if ((Item->hbmpItem)&& !( checked && (MenuInfo->dwStyle & MNS_CHECKORBMP))) + if (Item->hbmpItem) { - MenuDrawBitmapItem(Dc, Item, &Rect, MenuInfo->Self, WndOwner, Action, MenuBar); + RECT bmpRect; + CopyRect(&bmpRect, &Rect); + if (!(MenuInfo->dwStyle & MNS_CHECKORBMP) && !(MenuInfo->dwStyle & MNS_NOCHECK)) + bmpRect.left += CheckBitmapWidth + 2; + if (!(checked && (MenuInfo->dwStyle & MNS_CHECKORBMP))) + { + bmpRect.right = bmpRect.left + MenuInfo->maxBmpSize.cx; + MenuDrawBitmapItem(Dc, Item, &bmpRect, MenuInfo->Self, WndOwner, Action, MenuBar); + } } /* Draw the popup-menu arrow */ if (0 != (Item->fType & MF_POPUP)) @@ -767,7 +834,9 @@ UINT uFormat = MenuBar ? DT_CENTER | DT_VCENTER | DT_SINGLELINE : DT_LEFT | DT_VCENTER | DT_SINGLELINE;
- if( !(MenuInfo->dwStyle & MNS_CHECKORBMP)) + if(MenuInfo->dwStyle & MNS_CHECKORBMP) + Rect.left += max(0, MenuInfo->maxBmpSize.cx - GetSystemMetrics(SM_CXMENUCHECK)); + else Rect.left += MenuInfo->maxBmpSize.cx;
if (0 != (Item->fState & MFS_DEFAULT)) @@ -779,11 +848,6 @@ { Rect.left += MENU_BAR_ITEMS_SPACE / 2; Rect.right -= MENU_BAR_ITEMS_SPACE / 2; - } - if (Item->hbmpItem == HBMMENU_CALLBACK || MenuInfo->maxBmpSize.cx != 0 ) - { - Rect.left += MenuInfo->maxBmpSize.cx; - Rect.right -= MenuInfo->maxBmpSize.cx; }
Text = (PWCHAR) Item->dwTypeData; @@ -1103,8 +1167,30 @@ NTSTATUS WINAPI User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength) { - LRESULT Result; - Result = (LRESULT)LoadMenuW(User32Instance, L"SYSMENU"); + HMENU hmenu = LoadMenuW(User32Instance, L"SYSMENU"); + LRESULT Result = (LRESULT)hmenu; + + // removing space for checkboxes from menu + MENUINFO menuinfo = {0}; + menuinfo.cbSize = sizeof(menuinfo); + menuinfo.fMask = MIM_STYLE; + GetMenuInfo(hmenu, &menuinfo); + menuinfo.dwStyle |= MNS_NOCHECK; + SetMenuInfo(hmenu, &menuinfo); + + // adding bitmaps to menu items + MENUITEMINFOW info = {0}; + info.cbSize = sizeof(info); + info.fMask |= MIIM_BITMAP; + info.hbmpItem = HBMMENU_POPUP_MINIMIZE; + SetMenuItemInfoW(hmenu, SC_MINIMIZE, FALSE, &info); + info.hbmpItem = HBMMENU_POPUP_RESTORE; + SetMenuItemInfoW(hmenu, SC_RESTORE, FALSE, &info); + info.hbmpItem = HBMMENU_POPUP_MAXIMIZE; + SetMenuItemInfoW(hmenu, SC_MAXIMIZE, FALSE, &info); + info.hbmpItem = HBMMENU_POPUP_CLOSE; + SetMenuItemInfoW(hmenu, SC_CLOSE, FALSE, &info); + return(ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS)); }
@@ -1247,7 +1333,6 @@ MenuInfo->maxBmpSize.cy = abs(Size.cy); } MenuSetRosMenuInfo(MenuInfo); - ItemInfo->Rect.right += Size.cx + 2; itemheight = Size.cy + 2;
if( !(MenuInfo->dwStyle & MNS_NOCHECK))
Hi!
On Wed, Jul 1, 2009 at 5:10 PM, Gedgedmurphy@gmail.com wrote:
Did you read this patch before committing it? Your last patch fixed tchar usage and then this next patch introduces new ones.
Looks okay, interesting way for setting up the system menu for kernel space. Need to test this with every application in our test library to make sure this all works!
@@ -1103,8 +1167,30 @@ NTSTATUS WINAPI User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength) {
- LRESULT Result;
- Result = (LRESULT)LoadMenuW(User32Instance, L"SYSMENU");
- HMENU hmenu = LoadMenuW(User32Instance, L"SYSMENU");
- LRESULT Result = (LRESULT)hmenu;
- // removing space for checkboxes from menu
- MENUINFO menuinfo = {0};
- menuinfo.cbSize = sizeof(menuinfo);
- menuinfo.fMask = MIM_STYLE;
- GetMenuInfo(hmenu, &menuinfo);
- menuinfo.dwStyle |= MNS_NOCHECK;
- SetMenuInfo(hmenu, &menuinfo);
- // adding bitmaps to menu items
- MENUITEMINFOW info = {0};
- info.cbSize = sizeof(info);
- info.fMask |= MIIM_BITMAP;
- info.hbmpItem = HBMMENU_POPUP_MINIMIZE;
- SetMenuItemInfoW(hmenu, SC_MINIMIZE, FALSE, &info);
- info.hbmpItem = HBMMENU_POPUP_RESTORE;
- SetMenuItemInfoW(hmenu, SC_RESTORE, FALSE, &info);
- info.hbmpItem = HBMMENU_POPUP_MAXIMIZE;
- SetMenuItemInfoW(hmenu, SC_MAXIMIZE, FALSE, &info);
- info.hbmpItem = HBMMENU_POPUP_CLOSE;
- SetMenuItemInfoW(hmenu, SC_CLOSE, FALSE, &info);
- return(ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS));
}