https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a7e358406575d555b6ae8…
commit a7e358406575d555b6ae82aca45e5b8758049dc9
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Fri Jan 7 22:49:06 2022 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Wed Feb 16 00:49:48 2022 +0100
[FREELDR:UI] Cleanup for the DrawMenu* functions.
- Remove duplicated code from directui.c and use the one from
TUI instead, with the latter properly #ifdef'ed for _M_ARM.
- Add SAL annotations.
---
boot/freeldr/freeldr/include/ui/minitui.h | 16 +-
boot/freeldr/freeldr/include/ui/noui.h | 16 +-
boot/freeldr/freeldr/include/ui/tui.h | 31 ++-
boot/freeldr/freeldr/ui/directui.c | 379 ++----------------------------
boot/freeldr/freeldr/ui/minitui.c | 11 +-
boot/freeldr/freeldr/ui/noui.c | 4 +-
boot/freeldr/freeldr/ui/tuimenu.c | 110 +++++++--
7 files changed, 144 insertions(+), 423 deletions(-)
diff --git a/boot/freeldr/freeldr/include/ui/minitui.h
b/boot/freeldr/freeldr/include/ui/minitui.h
index eba12bc1ec6..4a710cd8b6f 100644
--- a/boot/freeldr/freeldr/include/ui/minitui.h
+++ b/boot/freeldr/freeldr/include/ui/minitui.h
@@ -8,11 +8,7 @@
#pragma once
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// Textual User Interface Functions
-//
-///////////////////////////////////////////////////////////////////////////////////////
+/* Textual User Interface Functions ******************************************/
VOID MiniTuiDrawBackdrop(VOID);
VOID MiniTuiDrawStatusText(PCSTR StatusText);
@@ -35,12 +31,10 @@ MiniTuiDrawProgressBar(
_In_ ULONG Range,
_Inout_z_ PSTR ProgressText);
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// Menu Functions
-//
-///////////////////////////////////////////////////////////////////////////////////////
+/* Menu Functions ************************************************************/
-VOID MiniTuiDrawMenu(PUI_MENU_INFO MenuInfo);
+VOID
+MiniTuiDrawMenu(
+ _In_ PUI_MENU_INFO MenuInfo);
extern const UIVTBL MiniTuiVtbl;
diff --git a/boot/freeldr/freeldr/include/ui/noui.h
b/boot/freeldr/freeldr/include/ui/noui.h
index 1bd560ad25d..dca5db172e0 100644
--- a/boot/freeldr/freeldr/include/ui/noui.h
+++ b/boot/freeldr/freeldr/include/ui/noui.h
@@ -8,11 +8,7 @@
#pragma once
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// No User Interface Functions
-//
-///////////////////////////////////////////////////////////////////////////////////////
+/* No User Interface Functions ***********************************************/
BOOLEAN NoUiInitialize(VOID);
VOID NoUiUnInitialize(VOID);
@@ -78,11 +74,7 @@ UCHAR NoUiTextToFillStyle(PCSTR FillStyleText);
VOID NoUiFadeInBackdrop(VOID);
VOID NoUiFadeOut(VOID);
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// Menu Functions
-//
-///////////////////////////////////////////////////////////////////////////////////////
+/* Menu Functions ************************************************************/
BOOLEAN
NoUiDisplayMenu(
@@ -98,4 +90,6 @@ NoUiDisplayMenu(
IN UiMenuKeyPressFilterCallback KeyPressFilter OPTIONAL,
IN PVOID Context OPTIONAL);
-VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo);
+VOID
+NoUiDrawMenu(
+ _In_ PUI_MENU_INFO MenuInfo);
diff --git a/boot/freeldr/freeldr/include/ui/tui.h
b/boot/freeldr/freeldr/include/ui/tui.h
index a486ef5cdec..27918f47bd7 100644
--- a/boot/freeldr/freeldr/include/ui/tui.h
+++ b/boot/freeldr/freeldr/include/ui/tui.h
@@ -28,11 +28,7 @@ TuiPrintf(
#define TUI_TITLE_BOX_CHAR_HEIGHT 5
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// Textual User Interface Functions
-//
-///////////////////////////////////////////////////////////////////////////////////////
+/* Textual User Interface Functions ******************************************/
BOOLEAN TuiInitialize(VOID); // Initialize
User-Interface
VOID TuiUnInitialize(VOID); // Un-initialize
User-Interface
@@ -101,17 +97,20 @@ UCHAR TuiTextToFillStyle(PCSTR FillStyleText); //
Converts the
VOID TuiFadeInBackdrop(VOID); // Draws the backdrop and
fades the screen in
VOID TuiFadeOut(VOID); // Fades the screen out
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// Menu Functions
-//
-///////////////////////////////////////////////////////////////////////////////////////
-
-VOID TuiCalcMenuBoxSize(PUI_MENU_INFO MenuInfo);
-VOID TuiDrawMenu(PUI_MENU_INFO MenuInfo);
-VOID TuiDrawMenuBox(PUI_MENU_INFO MenuInfo);
-VOID TuiDrawMenuItem(PUI_MENU_INFO MenuInfo, ULONG MenuItemNumber);
-ULONG TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo, UiMenuKeyPressFilterCallback
KeyPressFilter);
+/* Menu Functions ************************************************************/
+
+VOID
+TuiDrawMenu(
+ _In_ PUI_MENU_INFO MenuInfo);
+
+VOID
+TuiDrawMenuBox(
+ _In_ PUI_MENU_INFO MenuInfo);
+
+VOID
+TuiDrawMenuItem(
+ _In_ PUI_MENU_INFO MenuInfo,
+ _In_ ULONG MenuItemNumber);
BOOLEAN
TuiDisplayMenu(
diff --git a/boot/freeldr/freeldr/ui/directui.c b/boot/freeldr/freeldr/ui/directui.c
index 7021a86cdbc..dbd2ed41902 100644
--- a/boot/freeldr/freeldr/ui/directui.c
+++ b/boot/freeldr/freeldr/ui/directui.c
@@ -158,279 +158,10 @@ UiTruncateStringEllipsis(IN PCHAR StringText,
}
VOID
-UiDrawMenuBox(IN PUI_MENU_INFO MenuInfo)
+UiDrawMenu(
+ _In_ PUI_MENU_INFO MenuInfo)
{
- CHAR MenuLineText[80], TempString[80];
- ULONG i;
-
- /* If there is a timeout draw the time remaining */
- if (MenuInfo->MenuTimeRemaining >= 0)
- {
- /* Copy the integral time text string, and remove the last 2 chars */
- strcpy(TempString, UiTimeText);
- i = strlen(TempString);
- TempString[i - 2] = 0;
-
- /* Display the first part of the string and the remaining time */
- strcpy(MenuLineText, TempString);
- _itoa(MenuInfo->MenuTimeRemaining, TempString, 10);
- strcat(MenuLineText, TempString);
-
- /* Add the last 2 chars */
- strcat(MenuLineText, &UiTimeText[i - 2]);
-
- /* Display under the menu directly */
- UiDrawText(0,
- MenuInfo->Bottom + 4,
- MenuLineText,
- ATTR(UiMenuFgColor, UiMenuBgColor));
- }
- else
- {
- /* Erase the timeout string with spaces, and 0-terminate for sure */
- for (i=0; i<sizeof(MenuLineText)-1; i++)
- {
- MenuLineText[i] = ' ';
- }
- MenuLineText[sizeof(MenuLineText)-1] = 0;
-
- /* Draw this "empty" string to erase */
- UiDrawText(0,
- MenuInfo->Bottom + 4,
- MenuLineText,
- ATTR(UiMenuFgColor, UiMenuBgColor));
- }
-
- /* Loop each item */
- for (i = 0; i < MenuInfo->MenuItemCount; i++)
- {
- /* Check if it's a separator */
- if (MenuInfo->MenuItemList[i] == NULL)
- {
- /* Draw the separator line */
- UiDrawText(MenuInfo->Left,
- MenuInfo->Top + i + 1,
- "\xC7",
- ATTR(UiMenuFgColor, UiMenuBgColor));
- UiDrawText(MenuInfo->Right,
- MenuInfo->Top + i + 1,
- "\xB6",
- ATTR(UiMenuFgColor, UiMenuBgColor));
- }
- }
-}
-
-VOID
-UiDrawMenuItem(IN PUI_MENU_INFO MenuInfo,
- IN ULONG MenuItemNumber)
-{
- CHAR MenuLineText[80];
- UCHAR Attribute = ATTR(UiTextColor, UiMenuBgColor);
-
- /* Simply left-align it */
- MenuLineText[0] = '\0';
- strcat(MenuLineText, " ");
-
- /* Now append the text string */
- if (MenuInfo->MenuItemList[MenuItemNumber])
- strcat(MenuLineText, MenuInfo->MenuItemList[MenuItemNumber]);
-
- /* 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 this is the selected item, use the selected colors */
- Attribute = ATTR(UiSelectedTextColor, UiSelectedTextBgColor);
- }
-
- /* Draw the item */
- UiDrawText(MenuInfo->Left + 1,
- MenuInfo->Top + 1 + MenuItemNumber,
- MenuLineText,
- Attribute);
-}
-
-VOID
-UiDrawMenu(IN PUI_MENU_INFO MenuInfo)
-{
- ULONG i;
-
- /* No GUI status bar text, just minimal text. Show the menu header. */
- if (MenuInfo->MenuHeader)
- {
- UiDrawText(0,
- MenuInfo->Top - 2,
- MenuInfo->MenuHeader,
- ATTR(UiMenuFgColor, UiMenuBgColor));
- }
-
- /* Now tell the user how to choose */
- UiDrawText(0,
- MenuInfo->Bottom + 1,
- "Use \x18 and \x19 to move the highlight to your choice.",
- ATTR(UiMenuFgColor, UiMenuBgColor));
- UiDrawText(0,
- MenuInfo->Bottom + 2,
- "Press ENTER to choose.",
- ATTR(UiMenuFgColor, UiMenuBgColor));
-
- /* And show the menu footer */
- if (MenuInfo->MenuFooter)
- {
- UiDrawText(0,
- UiScreenHeight - 4,
- MenuInfo->MenuFooter,
- ATTR(UiMenuFgColor, UiMenuBgColor));
- }
-
- /* Draw the menu box */
- UiDrawMenuBox(MenuInfo);
-
- /* Draw each line of the menu */
- for (i = 0; i < MenuInfo->MenuItemCount; i++)
- {
- UiDrawMenuItem(MenuInfo, i);
- }
-
- /* Display the boot options if needed */
- if (MenuInfo->ShowBootOptions)
- {
- DisplayBootTimeOptions();
- }
-}
-
-ULONG
-UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo,
- IN UiMenuKeyPressFilterCallback KeyPressFilter)
-{
- ULONG KeyEvent = 0;
- ULONG Selected, Count;
-
- /* Check for a keypress */
- if (!MachConsKbHit())
- return 0; // None, bail out
-
- /* Check if the timeout is not already complete */
- if (MenuInfo->MenuTimeRemaining != -1)
- {
- /* Cancel it and remove it */
- MenuInfo->MenuTimeRemaining = -1;
- UiDrawMenuBox(MenuInfo);
- }
-
- /* Get the key (get the extended key if needed) */
- KeyEvent = MachConsGetCh();
- if (KeyEvent == KEY_EXTENDED)
- KeyEvent = MachConsGetCh();
-
- /*
- * Call the supplied key filter callback function to see
- * if it is going to handle this keypress.
- */
- if (KeyPressFilter &&
- KeyPressFilter(KeyEvent, MenuInfo->SelectedMenuItem, MenuInfo->Context))
- {
- /* It processed the key character, so redraw and exit */
- UiDrawMenu(MenuInfo);
- return 0;
- }
-
- /* Process the key */
- if ((KeyEvent == KEY_UP ) || (KeyEvent == KEY_DOWN) ||
- (KeyEvent == KEY_HOME) || (KeyEvent == KEY_END ))
- {
- /* Get the current selected item and count */
- Selected = MenuInfo->SelectedMenuItem;
- Count = MenuInfo->MenuItemCount - 1;
-
- /* Check the key and change the selected menu item */
- if ((KeyEvent == KEY_UP) && (Selected > 0))
- {
- /* Deselect previous item and go up */
- MenuInfo->SelectedMenuItem--;
- UiDrawMenuItem(MenuInfo, Selected);
- Selected--;
-
- // Skip past any separators
- if ((Selected > 0) &&
- (MenuInfo->MenuItemList[Selected] == NULL))
- {
- MenuInfo->SelectedMenuItem--;
- }
- }
- else if ( ((KeyEvent == KEY_UP) && (Selected == 0)) ||
- (KeyEvent == KEY_END) )
- {
- /* Go to the end */
- MenuInfo->SelectedMenuItem = Count;
- UiDrawMenuItem(MenuInfo, Selected);
- }
- else if ((KeyEvent == KEY_DOWN) && (Selected < Count))
- {
- /* Deselect previous item and go down */
- MenuInfo->SelectedMenuItem++;
- UiDrawMenuItem(MenuInfo, Selected);
- Selected++;
-
- // Skip past any separators
- if ((Selected < Count) &&
- (MenuInfo->MenuItemList[Selected] == NULL))
- {
- MenuInfo->SelectedMenuItem++;
- }
- }
- else if ( ((KeyEvent == KEY_DOWN) && (Selected == Count)) ||
- (KeyEvent == KEY_HOME) )
- {
- /* Go to the beginning */
- MenuInfo->SelectedMenuItem = 0;
- UiDrawMenuItem(MenuInfo, Selected);
- }
-
- /* Select new item and update video buffer */
- UiDrawMenuItem(MenuInfo, MenuInfo->SelectedMenuItem);
- }
-
- /* Return the pressed key */
- return KeyEvent;
-}
-
-VOID
-UiCalcMenuBoxSize(IN PUI_MENU_INFO MenuInfo)
-{
- ULONG i, Width = 0, Height, Length;
-
- /* Height is the menu item count plus 2 (top border & bottom border) */
- Height = MenuInfo->MenuItemCount + 2;
- Height -= 1; // Height is zero-based
-
- /* Loop every item */
- for (i = 0; i < MenuInfo->MenuItemCount; i++)
- {
- /* Get the string length and make it become the new width if necessary */
- if (MenuInfo->MenuItemList[i])
- {
- Length = (ULONG)strlen(MenuInfo->MenuItemList[i]);
- if (Length > Width) Width = Length;
- }
- }
-
- /* Allow room for left & right borders, plus 8 spaces on each side */
- Width += 18;
-
- /* Put the menu in the default left-corner position */
- MenuInfo->Left = -1;
- MenuInfo->Top = 4;
-
- /* The other margins are the same */
- MenuInfo->Right = (MenuInfo->Left) + Width;
- MenuInfo->Bottom = (MenuInfo->Top) + Height;
+ MiniTuiDrawMenu(MenuInfo);
}
BOOLEAN
@@ -447,99 +178,17 @@ UiDisplayMenu(
IN UiMenuKeyPressFilterCallback KeyPressFilter OPTIONAL,
IN PVOID Context OPTIONAL)
{
- UI_MENU_INFO MenuInformation;
- ULONG LastClockSecond;
- ULONG CurrentClockSecond;
- ULONG KeyPress;
-
- /*
- * Before taking any default action if there is no timeout,
- * check whether the supplied key filter callback function
- * may handle a specific user keypress. If it does, the
- * timeout is cancelled.
- */
- if (!MenuTimeOut && KeyPressFilter && MachConsKbHit())
- {
- /* Get the key (get the extended key if needed) */
- KeyPress = MachConsGetCh();
- if (KeyPress == KEY_EXTENDED)
- KeyPress = MachConsGetCh();
-
- /*
- * Call the supplied key filter callback function to see
- * if it is going to handle this keypress.
- */
- if (KeyPressFilter(KeyPress, DefaultMenuItem, Context))
- {
- /* It processed the key character, cancel the timeout */
- MenuTimeOut = -1;
- }
- }
-
- /* Check if there's no timeout */
- if (!MenuTimeOut)
- {
- /* Return the default selected item */
- if (SelectedMenuItem) *SelectedMenuItem = DefaultMenuItem;
- return TRUE;
- }
-
- /* Setup the MENU_INFO structure */
- MenuInformation.MenuHeader = MenuHeader;
- MenuInformation.MenuFooter = MenuFooter;
- MenuInformation.ShowBootOptions = ShowBootOptions;
- MenuInformation.MenuItemList = MenuItemList;
- MenuInformation.MenuItemCount = MenuItemCount;
- MenuInformation.MenuTimeRemaining = MenuTimeOut;
- MenuInformation.SelectedMenuItem = DefaultMenuItem;
- MenuInformation.Context = Context;
-
- /* Calculate the size of the menu box */
- UiCalcMenuBoxSize(&MenuInformation);
-
- /* Draw the menu */
- UiDrawMenu(&MenuInformation);
-
- /* Get the current second of time */
- LastClockSecond = ArcGetTime()->Second;
-
- /* Process keys */
- while (TRUE)
- {
- /* Process key presses */
- KeyPress = UiProcessMenuKeyboardEvent(&MenuInformation, KeyPressFilter);
-
- /* Check for ENTER or ESC */
- if (KeyPress == KEY_ENTER) break;
- if (CanEscape && KeyPress == KEY_ESC) return FALSE;
-
- /* Check if there is a countdown */
- if (MenuInformation.MenuTimeRemaining > 0)
- {
- /* Get the updated time, seconds only */
- CurrentClockSecond = ArcGetTime()->Second;
-
- /* Check if more then a second has now elapsed */
- if (CurrentClockSecond != LastClockSecond)
- {
- /* Update the time information */
- LastClockSecond = CurrentClockSecond;
- MenuInformation.MenuTimeRemaining--;
-
- /* Update the menu */
- UiDrawMenuBox(&MenuInformation);
- }
- }
- else if (MenuInformation.MenuTimeRemaining == 0)
- {
- /* A time out occurred, exit this loop and return default OS */
- break;
- }
- }
-
- /* Return the selected item */
- if (SelectedMenuItem) *SelectedMenuItem = MenuInformation.SelectedMenuItem;
- return TRUE;
+ return TuiDisplayMenu(MenuHeader,
+ MenuFooter,
+ ShowBootOptions,
+ MenuItemList,
+ MenuItemCount,
+ DefaultMenuItem,
+ MenuTimeOut,
+ SelectedMenuItem,
+ CanEscape,
+ KeyPressFilter,
+ Context);
}
#endif // _M_ARM
diff --git a/boot/freeldr/freeldr/ui/minitui.c b/boot/freeldr/freeldr/ui/minitui.c
index 6c231af8b11..373605a8b1b 100644
--- a/boot/freeldr/freeldr/ui/minitui.c
+++ b/boot/freeldr/freeldr/ui/minitui.c
@@ -114,15 +114,16 @@ MiniTuiDrawProgressBar(
#endif
}
-#ifndef _M_ARM
-
VOID
-MiniTuiDrawMenu(PUI_MENU_INFO MenuInfo)
+MiniTuiDrawMenu(
+ _In_ PUI_MENU_INFO MenuInfo)
{
ULONG i;
+#ifndef _M_ARM
/* Draw the backdrop */
UiDrawBackdrop();
+#endif
/* No GUI status bar text, just minimal text. Show the menu header. */
if (MenuInfo->MenuHeader)
@@ -167,9 +168,13 @@ MiniTuiDrawMenu(PUI_MENU_INFO MenuInfo)
DisplayBootTimeOptions();
}
+#ifndef _M_ARM
VideoCopyOffScreenBufferToVRAM();
+#endif
}
+#ifndef _M_ARM
+
const UIVTBL MiniTuiVtbl =
{
TuiInitialize,
diff --git a/boot/freeldr/freeldr/ui/noui.c b/boot/freeldr/freeldr/ui/noui.c
index e0e1b4b97e4..5e083dd8be0 100644
--- a/boot/freeldr/freeldr/ui/noui.c
+++ b/boot/freeldr/freeldr/ui/noui.c
@@ -167,7 +167,9 @@ NoUiDisplayMenu(
return TRUE;
}
-VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo)
+VOID
+NoUiDrawMenu(
+ _In_ PUI_MENU_INFO MenuInfo)
{
}
diff --git a/boot/freeldr/freeldr/ui/tuimenu.c b/boot/freeldr/freeldr/ui/tuimenu.c
index f1c229e947b..1e4a2c64d18 100644
--- a/boot/freeldr/freeldr/ui/tuimenu.c
+++ b/boot/freeldr/freeldr/ui/tuimenu.c
@@ -9,11 +9,19 @@
/* INCLUDES ******************************************************************/
-#ifndef _M_ARM
#include <freeldr.h>
/* FUNCTIONS *****************************************************************/
+static VOID
+TuiCalcMenuBoxSize(
+ _In_ PUI_MENU_INFO MenuInfo);
+
+static ULONG
+TuiProcessMenuKeyboardEvent(
+ _In_ PUI_MENU_INFO MenuInfo,
+ _In_ UiMenuKeyPressFilterCallback KeyPressFilter);
+
BOOLEAN
TuiDisplayMenu(
IN PCSTR MenuHeader,
@@ -79,7 +87,11 @@ TuiDisplayMenu(
TuiCalcMenuBoxSize(&MenuInformation);
/* Draw the menu */
+#ifdef _M_ARM
+ UiDrawMenu(&MenuInformation);
+#else
UiVtbl.DrawMenu(&MenuInformation);
+#endif
/* Get the current second of time */
LastClockSecond = ArcGetTime()->Second;
@@ -94,9 +106,11 @@ TuiDisplayMenu(
if (KeyPress == KEY_ENTER) break;
if (CanEscape && KeyPress == KEY_ESC) return FALSE;
+#ifndef _M_ARM // FIXME: Theme-specific
/* Update the date & time */
TuiUpdateDateTime();
VideoCopyOffScreenBufferToVRAM();
+#endif
/* Check if there is a countdown */
if (MenuInformation.MenuTimeRemaining > 0)
@@ -113,7 +127,9 @@ TuiDisplayMenu(
/* Update the menu */
TuiDrawMenuBox(&MenuInformation);
+#ifndef _M_ARM
VideoCopyOffScreenBufferToVRAM();
+#endif
}
}
else if (MenuInformation.MenuTimeRemaining == 0)
@@ -122,7 +138,9 @@ TuiDisplayMenu(
break;
}
+#ifndef _M_ARM
MachHwIdle();
+#endif
}
/* Return the selected item */
@@ -130,8 +148,9 @@ TuiDisplayMenu(
return TRUE;
}
-VOID
-TuiCalcMenuBoxSize(PUI_MENU_INFO MenuInfo)
+static VOID
+TuiCalcMenuBoxSize(
+ _In_ PUI_MENU_INFO MenuInfo)
{
ULONG i;
ULONG Width = 0;
@@ -156,6 +175,7 @@ TuiCalcMenuBoxSize(PUI_MENU_INFO MenuInfo)
/* Allow room for left & right borders, plus 8 spaces on each side */
Width += 18;
+#ifndef _M_ARM
/* Check if we're drawing a centered menu */
if (UiCenterMenu)
{
@@ -165,6 +185,7 @@ TuiCalcMenuBoxSize(PUI_MENU_INFO MenuInfo)
Height) / 2) + TUI_TITLE_BOX_CHAR_HEIGHT;
}
else
+#endif
{
/* Put the menu in the default left-corner position */
MenuInfo->Left = -1;
@@ -172,21 +193,56 @@ TuiCalcMenuBoxSize(PUI_MENU_INFO MenuInfo)
}
/* The other margins are the same */
- MenuInfo->Right = (MenuInfo->Left) + Width;
- MenuInfo->Bottom = (MenuInfo->Top) + Height;
+ MenuInfo->Right = MenuInfo->Left + Width;
+ MenuInfo->Bottom = MenuInfo->Top + Height;
}
VOID
-TuiDrawMenu(PUI_MENU_INFO MenuInfo)
+TuiDrawMenu(
+ _In_ PUI_MENU_INFO MenuInfo)
{
ULONG i;
+#ifdef _M_ARM // FIXME: Theme-specific
+
+ /* No GUI status bar text, just minimal text. Show the menu header. */
+ if (MenuInfo->MenuHeader)
+ {
+ UiDrawText(0,
+ MenuInfo->Top - 2,
+ MenuInfo->MenuHeader,
+ ATTR(UiMenuFgColor, UiMenuBgColor));
+ }
+
+ /* Now tell the user how to choose */
+ UiDrawText(0,
+ MenuInfo->Bottom + 1,
+ "Use \x18 and \x19 to move the highlight to your choice.",
+ ATTR(UiMenuFgColor, UiMenuBgColor));
+ UiDrawText(0,
+ MenuInfo->Bottom + 2,
+ "Press ENTER to choose.",
+ ATTR(UiMenuFgColor, UiMenuBgColor));
+
+ /* And show the menu footer */
+ if (MenuInfo->MenuFooter)
+ {
+ UiDrawText(0,
+ UiScreenHeight - 4,
+ MenuInfo->MenuFooter,
+ ATTR(UiMenuFgColor, UiMenuBgColor));
+ }
+
+#else
+
/* Draw the backdrop */
UiDrawBackdrop();
/* Update the status bar */
UiVtbl.DrawStatusText("Use \x18 and \x19 to select, then press ENTER.");
+#endif
+
/* Draw the menu box */
TuiDrawMenuBox(MenuInfo);
@@ -202,15 +258,19 @@ TuiDrawMenu(PUI_MENU_INFO MenuInfo)
DisplayBootTimeOptions();
}
+#ifndef _M_ARM
VideoCopyOffScreenBufferToVRAM();
+#endif
}
VOID
-TuiDrawMenuBox(PUI_MENU_INFO MenuInfo)
+TuiDrawMenuBox(
+ _In_ PUI_MENU_INFO MenuInfo)
{
CHAR MenuLineText[80], TempString[80];
ULONG i;
+#ifndef _M_ARM // FIXME: Theme-specific
/* Draw the menu box if requested */
if (UiMenuBox)
{
@@ -224,6 +284,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo)
TRUE, // Shadow
ATTR(UiMenuFgColor, UiMenuBgColor));
}
+#endif
/* If there is a timeout draw the time remaining */
if (MenuInfo->MenuTimeRemaining >= 0)
@@ -241,6 +302,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo)
/* Add the last 2 chars */
strcat(MenuLineText, &UiTimeText[i - 2]);
+#ifndef _M_ARM
/* Check if this is a centered menu */
if (UiCenterMenu)
{
@@ -251,6 +313,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo)
ATTR(UiMenuFgColor, UiMenuBgColor));
}
else
+#endif
{
/* Display under the menu directly */
UiDrawText(0,
@@ -269,6 +332,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo)
MenuLineText[sizeof(MenuLineText)-1] = 0;
/* Draw this "empty" string to erase */
+#ifndef _M_ARM
if (UiCenterMenu)
{
UiDrawText(MenuInfo->Right - (ULONG)strlen(MenuLineText) - 1,
@@ -277,6 +341,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo)
ATTR(UiMenuFgColor, UiMenuBgColor));
}
else
+#endif
{
UiDrawText(0,
MenuInfo->Bottom + 4,
@@ -305,16 +370,20 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo)
}
VOID
-TuiDrawMenuItem(PUI_MENU_INFO MenuInfo,
- ULONG MenuItemNumber)
+TuiDrawMenuItem(
+ _In_ PUI_MENU_INFO MenuInfo,
+ _In_ ULONG MenuItemNumber)
{
+#ifndef _M_ARM
ULONG i;
- CHAR MenuLineText[80];
ULONG SpaceTotal;
ULONG SpaceLeft;
ULONG SpaceRight = 0;
+#endif
UCHAR Attribute = ATTR(UiTextColor, UiMenuBgColor);
+ CHAR MenuLineText[80];
+#ifndef _M_ARM
/* Check if using centered menu */
if (UiCenterMenu)
{
@@ -329,10 +398,12 @@ TuiDrawMenuItem(PUI_MENU_INFO MenuInfo,
SpaceRight = (SpaceTotal - SpaceLeft) + 1;
/* Insert the spaces on the left */
- for (i = 0; i < SpaceLeft; i++) MenuLineText[i] = ' ';
+ for (i = 0; i < SpaceLeft; i++)
+ MenuLineText[i] = ' ';
MenuLineText[i] = '\0';
}
else
+#endif
{
/* Simply left-align it */
MenuLineText[0] = '\0';
@@ -343,12 +414,14 @@ TuiDrawMenuItem(PUI_MENU_INFO MenuInfo,
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
/* If it is a separator */
if (MenuInfo->MenuItemList[MenuItemNumber] == NULL)
@@ -371,9 +444,10 @@ TuiDrawMenuItem(PUI_MENU_INFO MenuInfo,
Attribute);
}
-ULONG
-TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo,
- UiMenuKeyPressFilterCallback KeyPressFilter)
+static ULONG
+TuiProcessMenuKeyboardEvent(
+ _In_ PUI_MENU_INFO MenuInfo,
+ _In_ UiMenuKeyPressFilterCallback KeyPressFilter)
{
ULONG KeyEvent = 0;
ULONG Selected, Count;
@@ -403,7 +477,11 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo,
KeyPressFilter(KeyEvent, MenuInfo->SelectedMenuItem, MenuInfo->Context))
{
/* It processed the key character, so redraw and exit */
+#ifdef _M_ARM
+ UiDrawMenu(MenuInfo);
+#else
UiVtbl.DrawMenu(MenuInfo);
+#endif
return 0;
}
@@ -461,11 +539,11 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo,
/* Select new item and update video buffer */
TuiDrawMenuItem(MenuInfo, MenuInfo->SelectedMenuItem);
+#ifndef _M_ARM
VideoCopyOffScreenBufferToVRAM();
+#endif
}
/* Return the pressed key */
return KeyEvent;
}
-
-#endif