https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5239a0ca4d37cebfbe3029323b6e006e71b39137

commit 5239a0ca4d37cebfbe3029323b6e006e71b39137
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Mon Feb 14 16:58:06 2022 +0100
Commit:     Hermès Bélusca-Maïto <[email protected]>
CommitDate: Mon Feb 21 02:53:58 2022 +0100

    [FREELDR:UI] Improve how menu line separators are drawn.
    
    When the menu is not boxed, do not draw the specific "T"-shaped box
    corners for the separators.
---
 boot/freeldr/freeldr/ui/tuimenu.c | 114 ++++++++++++++++++++------------------
 1 file changed, 61 insertions(+), 53 deletions(-)

diff --git a/boot/freeldr/freeldr/ui/tuimenu.c 
b/boot/freeldr/freeldr/ui/tuimenu.c
index 1e4a2c64d18..500a8995467 100644
--- a/boot/freeldr/freeldr/ui/tuimenu.c
+++ b/boot/freeldr/freeldr/ui/tuimenu.c
@@ -349,39 +349,61 @@ TuiDrawMenuBox(
                        ATTR(UiMenuFgColor, UiMenuBgColor));
         }
     }
+}
 
-    /* Loop each item */
-    for (i = 0; i < MenuInfo->MenuItemCount; i++)
+VOID
+TuiDrawMenuItem(
+    _In_ PUI_MENU_INFO MenuInfo,
+    _In_ ULONG MenuItemNumber)
+{
+    ULONG SpaceLeft;
+    ULONG SpaceRight;
+    UCHAR Attribute;
+    CHAR MenuLineText[80];
+
+    /* If this is a separator */
+    if (MenuInfo->MenuItemList[MenuItemNumber] == NULL)
     {
-        /* Check if it's a separator */
-        if (MenuInfo->MenuItemList[i] == NULL)
+#ifndef _M_ARM // FIXME: Theme-specific
+        /* Draw its left box corner */
+        if (UiMenuBox)
         {
-            /* Draw the separator line */
             UiDrawText(MenuInfo->Left,
-                       MenuInfo->Top + i + 1,
+                       MenuInfo->Top + 1 + MenuItemNumber,
                        "\xC7",
                        ATTR(UiMenuFgColor, UiMenuBgColor));
+        }
+#endif
+
+        /* Make it a separator line and use menu colors */
+        RtlZeroMemory(MenuLineText, sizeof(MenuLineText));
+        RtlFillMemory(MenuLineText,
+                      min(sizeof(MenuLineText), (MenuInfo->Right - 
MenuInfo->Left - 1)),
+                      0xC4);
+
+        /* Draw the item */
+        UiDrawText(MenuInfo->Left + 1,
+                   MenuInfo->Top + 1 + MenuItemNumber,
+                   MenuLineText,
+                   ATTR(UiMenuFgColor, UiMenuBgColor));
+
+#ifndef _M_ARM // FIXME: Theme-specific
+        /* Draw its right box corner */
+        if (UiMenuBox)
+        {
             UiDrawText(MenuInfo->Right,
-                       MenuInfo->Top + i + 1,
+                       MenuInfo->Top + 1 + MenuItemNumber,
                        "\xB6",
                        ATTR(UiMenuFgColor, UiMenuBgColor));
         }
+#endif
+
+        /* We are done */
+        return;
     }
-}
 
-VOID
-TuiDrawMenuItem(
-    _In_ PUI_MENU_INFO MenuInfo,
-    _In_ ULONG MenuItemNumber)
-{
-#ifndef _M_ARM
-    ULONG i;
-    ULONG SpaceTotal;
-    ULONG SpaceLeft;
-    ULONG SpaceRight = 0;
-#endif
-    UCHAR Attribute = ATTR(UiTextColor, UiMenuBgColor);
-    CHAR MenuLineText[80];
+    /* This is not a separator */
+    ASSERT(MenuInfo->MenuItemList[MenuItemNumber]);
 
 #ifndef _M_ARM
     /* Check if using centered menu */
@@ -391,51 +413,37 @@ TuiDrawMenuItem(
          * We will want the string centered so calculate
          * how many spaces will be to the left and right.
          */
-        SpaceTotal = (MenuInfo->Right - MenuInfo->Left - 2) -
-                     (ULONG)(MenuInfo->MenuItemList[MenuItemNumber] ?
-                             strlen(MenuInfo->MenuItemList[MenuItemNumber]) : 
0);
-        SpaceLeft = (SpaceTotal / 2) + 1;
+        ULONG SpaceTotal =
+            (MenuInfo->Right - MenuInfo->Left - 2) -
+            (ULONG)strlen(MenuInfo->MenuItemList[MenuItemNumber]);
+        SpaceLeft  = (SpaceTotal / 2) + 1;
         SpaceRight = (SpaceTotal - SpaceLeft) + 1;
-
-        /* Insert the spaces on the left */
-        for (i = 0; i < SpaceLeft; i++)
-            MenuLineText[i] = ' ';
-        MenuLineText[i] = '\0';
     }
     else
 #endif
     {
         /* Simply left-align it */
-        MenuLineText[0] = '\0';
-        strcat(MenuLineText, "    ");
+        SpaceLeft  = 4;
+        SpaceRight = 0;
     }
 
-    /* Now append the text string */
-    if (MenuInfo->MenuItemList[MenuItemNumber])
-        strcat(MenuLineText, MenuInfo->MenuItemList[MenuItemNumber]);
-
-#ifndef _M_ARM
-    /* Check if using centered menu, and add spaces on the right if so */
-    if (UiCenterMenu)
-    {
-        for (i = 0; i < SpaceRight; i++)
-            strcat(MenuLineText, " ");
-    }
-#endif
+    /* Format the item text string */
+    RtlStringCbPrintfA(MenuLineText, sizeof(MenuLineText),
+                       "%*s%s%*s",
+                       SpaceLeft, "",   // Left padding
+                       MenuInfo->MenuItemList[MenuItemNumber],
+                       SpaceRight, ""); // Right padding
 
-    /* If it is a separator */
-    if (MenuInfo->MenuItemList[MenuItemNumber] == NULL)
-    {
-        /* Make it a separator line and use menu colors */
-        memset(MenuLineText, 0, sizeof(MenuLineText));
-        memset(MenuLineText, 0xC4, (MenuInfo->Right - MenuInfo->Left - 1));
-        Attribute = ATTR(UiMenuFgColor, UiMenuBgColor);
-    }
-    else if (MenuItemNumber == MenuInfo->SelectedMenuItem)
+    if (MenuItemNumber == MenuInfo->SelectedMenuItem)
     {
         /* If this is the selected item, use the selected colors */
         Attribute = ATTR(UiSelectedTextColor, UiSelectedTextBgColor);
     }
+    else
+    {
+        /* Normal item colors */
+        Attribute = ATTR(UiTextColor, UiMenuBgColor);
+    }
 
     /* Draw the item */
     UiDrawText(MenuInfo->Left + 1,

Reply via email to