- Added support for NTLDR style freeloader GUI. To enable, edit freeldr.ini and add: ShowTime=No MinimalUI=Yes MenuBox=No CenterMenu=No TimeText=Seconds until highlighted choice will be started automatically: Also make sure the following are set: MenuTextColor=Gray MenuColor=Black TextColor=Gray SelectedTextColor=Black SelectedColor=Gray. - Also made the boot-up screen black, not blue, since that's the actual color it's been after NT4. If booting without NOGUIBOOT, this results in a much nicer transition to the boot screen (especially if using the NTLDR theme) - Some other minor changes done to simplify transitions while booting. Hoping for filip to finish his Bootvid patch to remove the last annoying gui->text->gui switch near the end :). Modified: trunk/reactos/boot/freeldr/freeldr/include/ui/tui.h Modified: trunk/reactos/boot/freeldr/freeldr/include/ui.h Modified: trunk/reactos/boot/freeldr/freeldr/reactos/reactos.c Modified: trunk/reactos/boot/freeldr/freeldr/ui/tui.c Modified: trunk/reactos/boot/freeldr/freeldr/ui/tuimenu.c Modified: trunk/reactos/boot/freeldr/freeldr/ui/ui.c Modified: trunk/reactos/hal/halx86/generic/display.c Modified: trunk/reactos/hal/halx86/generic/halinit.c Modified: trunk/reactos/ntoskrnl/ex/init.c Modified: trunk/reactos/ntoskrnl/io/driver.c _____
Modified: trunk/reactos/boot/freeldr/freeldr/include/ui/tui.h --- trunk/reactos/boot/freeldr/freeldr/include/ui/tui.h 2005-12-27 03:06:35 UTC (rev 20365) +++ trunk/reactos/boot/freeldr/freeldr/include/ui/tui.h 2005-12-27 03:12:00 UTC (rev 20366) @@ -73,12 +73,12 @@
} TUI_MENU_INFO, *PTUI_MENU_INFO;
-VOID TuiCalcMenuBoxSize(PTUI_MENU_INFO MenuInfo); -VOID TuiDrawMenu(PTUI_MENU_INFO MenuInfo); -VOID TuiDrawMenuBox(PTUI_MENU_INFO MenuInfo); -VOID TuiDrawMenuItem(PTUI_MENU_INFO MenuInfo, ULONG MenuItemNumber); -ULONG TuiProcessMenuKeyboardEvent(PTUI_MENU_INFO MenuInfo, UiMenuKeyPressFilterCallback KeyPressFilter); -BOOL TuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOL CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter); +VOID WINAPI TuiCalcMenuBoxSize(PTUI_MENU_INFO MenuInfo); +VOID WINAPI TuiDrawMenu(PTUI_MENU_INFO MenuInfo); +VOID WINAPI TuiDrawMenuBox(PTUI_MENU_INFO MenuInfo); +VOID WINAPI TuiDrawMenuItem(PTUI_MENU_INFO MenuInfo, ULONG MenuItemNumber); +ULONG WINAPI TuiProcessMenuKeyboardEvent(PTUI_MENU_INFO MenuInfo, UiMenuKeyPressFilterCallback KeyPressFilter); +BOOL WINAPI TuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOL CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter);
/* _____
Modified: trunk/reactos/boot/freeldr/freeldr/include/ui.h --- trunk/reactos/boot/freeldr/freeldr/include/ui.h 2005-12-27 03:06:35 UTC (rev 20365) +++ trunk/reactos/boot/freeldr/freeldr/include/ui.h 2005-12-27 03:12:00 UTC (rev 20366) @@ -46,6 +46,10 @@
extern BOOL UserInterfaceUp; // Tells us if the user interface is displayed
extern BOOL UiUseSpecialEffects; // Tells us if we should use fade effects +extern BOOL UiCenterMenu; +extern BOOL UiMenuBox; +extern BOOL UiMinimal; +extern CHAR UiTimeText[];
extern const CHAR UiMonthNames[12][15];
_____
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/reactos.c --- trunk/reactos/boot/freeldr/freeldr/reactos/reactos.c 2005-12-27 03:06:35 UTC (rev 20365) +++ trunk/reactos/boot/freeldr/freeldr/reactos/reactos.c 2005-12-27 03:12:00 UTC (rev 20366) @@ -587,6 +587,10 @@
return; }
+ UiDrawBackdrop(); + UiDrawStatusText("Detecting Hardware..."); + UiDrawProgressBarCenter(1, 100, szLoadingMsg); + /* * Setup multiboot information structure */ @@ -677,19 +681,15 @@ strcat(reactos_kernel_cmdline, value); }
- - UiDrawBackdrop(); - UiDrawStatusText("Detecting Hardware..."); - /* * Detect hardware */ MachHwDetect(); + UiDrawProgressBarCenter(5, 100, szLoadingMsg);
if (AcpiPresent) LoaderBlock.Flags |= MB_FLAGS_ACPI_TABLE;
UiDrawStatusText("Loading..."); - UiDrawProgressBarCenter(0, 100, szLoadingMsg);
/* * Try to open system drive _____
Modified: trunk/reactos/boot/freeldr/freeldr/ui/tui.c --- trunk/reactos/boot/freeldr/freeldr/ui/tui.c 2005-12-27 03:06:35 UTC (rev 20365) +++ trunk/reactos/boot/freeldr/freeldr/ui/tui.c 2005-12-27 03:12:00 UTC (rev 20366) @@ -20,6 +20,8 @@
#include <freeldr.h>
PVOID TextVideoBuffer = NULL; +extern BOOL UiDrawTime; +extern BOOL UiMinimal;
/* * printf() - prints formatted text to stdout @@ -111,6 +113,25 @@
VOID TuiDrawBackdrop(VOID) { + if (UiMinimal) + { + // + // Fill in a black background + // + TuiFillArea(0, + 0, + UiScreenWidth - 1, + UiScreenHeight - 1, + 0, + 0); + + // + // Update the screen buffer + // + VideoCopyOffScreenBufferToVRAM(); + return; + } + // // Fill in the background (excluding title box & status bar) // @@ -429,6 +450,11 @@ { ULONG i;
+ // + // Minimal UI doesn't have a status bar + // + if (UiMinimal) return; + TuiDrawText(0, UiScreenHeight-1, " ", ATTR(UiStatusBarFgColor, UiStatusBarBgColor)); TuiDrawText(1, UiScreenHeight-1, StatusText, ATTR(UiStatusBarFgColor, UiStatusBarBgColor));
@@ -449,6 +475,9 @@ CHAR TempString[20]; BOOL PMHour = FALSE;
+ /* Don't draw the time if this has been disabled */ + if (!UiDrawTime) return; + MachRTCGetCurrentDateTime(&Year, &Month, &Day, &Hour, &Minute, &Second); if (Year < 1 || 9999 < Year || Month < 1 || 12 < Month || Day < 1 || 31 < Day || 23 < Hour || 59 < Minute || 59 < Second) @@ -663,10 +692,28 @@ ULONG Width = 50; // Allow for 50 "bars" ULONG Height = 2;
- Left = (UiScreenWidth - Width - 4) / 2; - Right = Left + Width + 3; - Top = (UiScreenHeight - Height - 2) / 2; - Top += 2; + // + // Is this the minimal UI? + // + if (UiMinimal) + { + // + // Use alternate settings + // + Width = 80; + Left = 0; + Right = Left + Width; + Top = UiScreenHeight - Height - 4; + Bottom = Top + Height + 1; + } + else + { + Left = (UiScreenWidth - Width - 4) / 2; + Right = Left + Width + 3; + Top = (UiScreenHeight - Height - 2) / 2; + Top += 2; + } + Bottom = Top + Height + 1;
TuiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText); @@ -685,12 +732,26 @@ Position = Range; }
- // Draw the box - TuiDrawBox(Left, Top, Right, Bottom, VERT, HORZ, TRUE, TRUE, ATTR(UiMenuFgColor, UiMenuBgColor)); + // + // Minimal UI has no box, and only generic loading text + // + if (!UiMinimal) + { + // Draw the box + TuiDrawBox(Left, Top, Right, Bottom, VERT, HORZ, TRUE, TRUE, ATTR(UiMenuFgColor, UiMenuBgColor));
- // Draw the "Loading..." text - //TuiDrawText(70/2, Top+1, "Loading...", ATTR(UiTextColor, UiMenuBgColor)); - TuiDrawCenteredText(Left + 2, Top + 2, Right - 2, Top + 2, ProgressText, ATTR(UiTextColor, UiMenuBgColor)); + // + // Draw the "Loading..." text + // + TuiDrawCenteredText(Left + 2, Top + 2, Right - 2, Top + 2, ProgressText, ATTR(UiTextColor, UiMenuBgColor)); + } + else + { + // + // Draw the "Loading..." text + // + TuiDrawCenteredText(Left + 2, Top + 1, Right - 2, Top + 1, "ReactOS is loading files...", ATTR(7, 0)); + }
// Draw the percent complete for (i=0; i<(Position*ProgressBarWidth)/Range; i++) @@ -698,14 +759,16 @@ TuiDrawText(Left+2+i, Top+2, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); }
- // Draw the rest - for (; i<ProgressBarWidth; i++) - { - TuiDrawText(Left+2+i, Top+2, "\xB2", ATTR(UiTextColor, UiMenuBgColor)); - } + // Draw the shadow for non-minimal UI + if (!UiMinimal) + { + for (; i<ProgressBarWidth; i++) + { + TuiDrawText(Left+2+i, Top+2, "\xB2", ATTR(UiTextColor, UiMenuBgColor)); + } + }
TuiUpdateDateTime(); - VideoCopyOffScreenBufferToVRAM(); }
_____
Modified: trunk/reactos/boot/freeldr/freeldr/ui/tuimenu.c --- trunk/reactos/boot/freeldr/freeldr/ui/tuimenu.c 2005-12-27 03:06:35 UTC (rev 20365) +++ trunk/reactos/boot/freeldr/freeldr/ui/tuimenu.c 2005-12-27 03:12:00 UTC (rev 20366) @@ -1,427 +1,549 @@
/* - * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer brianp@sginet.com - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: FreeLoader + * FILE: freeldr/ui/tuimenu.c + * PURPOSE: UI Menu Functions + * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) + * Brian Palmer (brianp@sginet.com) */
+/* INCLUDES ******************************************************************/ + #include <freeldr.h>
-BOOL TuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOL CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter) +/* FUNCTIONS *****************************************************************/ + +BOOL +WINAPI +TuiDisplayMenu(PCSTR MenuItemList[], + ULONG MenuItemCount, + ULONG DefaultMenuItem, + LONG MenuTimeOut, + ULONG* SelectedMenuItem, + BOOL CanEscape, + UiMenuKeyPressFilterCallback KeyPressFilter) { - TUI_MENU_INFO MenuInformation; - ULONG LastClockSecond; - ULONG CurrentClockSecond; - ULONG KeyPress; + TUI_MENU_INFO MenuInformation; + ULONG LastClockSecond; + ULONG CurrentClockSecond; + ULONG KeyPress;
- // - // The first thing we need to check is the timeout - // If it's zero then don't bother with anything, - // just return the default item - // - if (MenuTimeOut == 0) - { - if (SelectedMenuItem != NULL) - { - *SelectedMenuItem = DefaultMenuItem; - } + // + // Check if there's no timeout + if (!MenuTimeOut) + { + // + // Return the default selected item + // + if (SelectedMenuItem) *SelectedMenuItem = DefaultMenuItem; + return TRUE; + }
- return TRUE; - } + // + // Setup the MENU_INFO structure + // + MenuInformation.MenuItemList = MenuItemList; + MenuInformation.MenuItemCount = MenuItemCount; + MenuInformation.MenuTimeRemaining = MenuTimeOut; + MenuInformation.SelectedMenuItem = DefaultMenuItem;
- // - // Setup the MENU_INFO structure - // - MenuInformation.MenuItemList = MenuItemList; - MenuInformation.MenuItemCount = MenuItemCount; - MenuInformation.MenuTimeRemaining = MenuTimeOut; - MenuInformation.SelectedMenuItem = DefaultMenuItem; + // + // Calculate the size of the menu box + // + TuiCalcMenuBoxSize(&MenuInformation);
- // - // Calculate the size of the menu box - // - TuiCalcMenuBoxSize(&MenuInformation); + // + // Draw the menu + // + TuiDrawMenu(&MenuInformation);
- // - // Draw the menu - // - TuiDrawMenu(&MenuInformation); + // + // Get the current second of time + // + MachRTCGetCurrentDateTime(NULL, NULL, NULL, NULL, NULL, &LastClockSecond);
- // - // Get the current second of time - // - MachRTCGetCurrentDateTime(NULL, NULL, NULL, NULL, NULL, &LastClockSecond); + // + // Process keys + // + while (TRUE) + { + // + // Process key presses + // + KeyPress = TuiProcessMenuKeyboardEvent(&MenuInformation, + KeyPressFilter);
- // - // Process keys - // - while (1) - { - // - // Process key presses - // - KeyPress = TuiProcessMenuKeyboardEvent(&MenuInformation, KeyPressFilter); - if (KeyPress == KEY_ENTER) - { - // - // If they pressed enter then exit this loop - // - break; - } - else if (CanEscape && KeyPress == KEY_ESC) - { - // - // They pressed escape, so just return FALSE - // - return FALSE; - } + // + // Check for ENTER or ESC + // + if (KeyPress == KEY_ENTER) break; + if (CanEscape && KeyPress == KEY_ESC) return FALSE;
- // - // Update the date & time - // - TuiUpdateDateTime(); + // + // Update the date & time + // + TuiUpdateDateTime(); + VideoCopyOffScreenBufferToVRAM();
- VideoCopyOffScreenBufferToVRAM(); + // + // Check if there is a countdown + // + if (MenuInformation.MenuTimeRemaining) + { + // + // Get the updated time, seconds only + // + MachRTCGetCurrentDateTime(NULL, + NULL, + NULL, + NULL, + NULL, + &CurrentClockSecond);
- if (MenuInformation.MenuTimeRemaining > 0) - { - MachRTCGetCurrentDateTime(NULL, NULL, NULL, NULL, NULL, &CurrentClockSecond); - if (CurrentClockSecond != LastClockSecond) - { - // - // Update the time information - // - LastClockSecond = CurrentClockSecond; - MenuInformation.MenuTimeRemaining--; + // + // Check if more then a second has now elapsed + // + if (CurrentClockSecond != LastClockSecond) + { + // + // Update the time information + // + LastClockSecond = CurrentClockSecond; + MenuInformation.MenuTimeRemaining--;
- // - // Update the menu - // - TuiDrawMenuBox(&MenuInformation); + // + // Update the menu + // + TuiDrawMenuBox(&MenuInformation); + VideoCopyOffScreenBufferToVRAM(); + } + } + else + { + // + // A time out occurred, exit this loop and return default OS + // + break; + } + }
- VideoCopyOffScreenBufferToVRAM(); - } - } - else if (MenuInformation.MenuTimeRemaining == 0) - { - // - // A time out occurred, exit this loop and return default OS - // - break; - } - } - - // - // Update the selected menu item information - // - if (SelectedMenuItem != NULL) - { - *SelectedMenuItem = MenuInformation.SelectedMenuItem; - } - - return TRUE; + // + // Return the selected item + // + if (SelectedMenuItem) *SelectedMenuItem = MenuInformation.SelectedMenuItem; + return TRUE; }
-VOID TuiCalcMenuBoxSize(PTUI_MENU_INFO MenuInfo) +VOID +WINAPI +TuiCalcMenuBoxSize(PTUI_MENU_INFO MenuInfo) { - ULONG Idx; - ULONG Width; - ULONG Height; - ULONG Length; + ULONG i; + ULONG Width = 0; + ULONG Height; + ULONG Length;
- // - // Height is the menu item count plus 2 (top border & bottom border) - // - Height = MenuInfo->MenuItemCount + 2; - Height -= 1; // Height is zero-based + // + // Height is the menu item count plus 2 (top border & bottom border) + // + Height = MenuInfo->MenuItemCount + 2; + Height -= 1; // Height is zero-based
- // - // Find the length of the longest string in the menu - // - Width = 0; - for(Idx=0; Idx<MenuInfo->MenuItemCount; Idx++) - { - Length = strlen(MenuInfo->MenuItemList[Idx]); + // + // Loop every item + // + for(i = 0; i < MenuInfo->MenuItemCount; i++) + { + // + // Get the string length and make it become the new width if necessary + // + Length = strlen(MenuInfo->MenuItemList[i]); + if (Length > Width) Width = Length; + }
- if (Length > Width) - { - Width = Length; - } - } + // + // Allow room for left & right borders, plus 8 spaces on each side + // + Width += 18;
- // - // Allow room for left & right borders, plus 8 spaces on each side - // - Width += 18; + // + // Check if we're drawing a centered menu + // + if (UiCenterMenu) + { + // + // Calculate the menu box area for a centered menu + // + MenuInfo->Left = (UiScreenWidth - Width) / 2; + MenuInfo->Top = (((UiScreenHeight - TUI_TITLE_BOX_CHAR_HEIGHT) - + Height) / 2) + TUI_TITLE_BOX_CHAR_HEIGHT; + } + else + { + // + // Put the menu in the default left-corner position + // + MenuInfo->Left = -1; + MenuInfo->Top = 4; + }
- // - // Calculate the menu box area - // - MenuInfo->Left = (UiScreenWidth - Width) / 2; - MenuInfo->Right = (MenuInfo->Left) + Width; - MenuInfo->Top = (((UiScreenHeight - TUI_TITLE_BOX_CHAR_HEIGHT) - Height) / 2) + TUI_TITLE_BOX_CHAR_HEIGHT; - MenuInfo->Bottom = (MenuInfo->Top) + Height; + // + // The other margins are the same + // + MenuInfo->Right = (MenuInfo->Left) + Width; + MenuInfo->Bottom = (MenuInfo->Top) + Height; }
-VOID TuiDrawMenu(PTUI_MENU_INFO MenuInfo) +VOID +WINAPI +TuiDrawMenu(PTUI_MENU_INFO MenuInfo) { - ULONG Idx; + ULONG i;
- // - // Draw the backdrop - // - UiDrawBackdrop(); + // + // Draw the backdrop + // + UiDrawBackdrop();
- // - // Update the status bar - // - UiDrawStatusText("Use \x18\x19 to select, then press ENTER."); + // + // Check if this is the minimal (console) UI + // + if (UiMinimal) + { + // + // No GUI status bar text, just minimal text. first to tell the user to + // choose. + // + TuiDrawText(0, + MenuInfo->Top - 2, + "Please select the operating system to start:", + ATTR(UiMenuFgColor, UiMenuBgColor));
- // - // Draw the menu box - // - TuiDrawMenuBox(MenuInfo); + // + // Now tell him how to choose + // + TuiDrawText(0, + MenuInfo->Bottom + 1, + "Use the up and down arrow keys to move the highlight to " + "your choice.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + TuiDrawText(0, + MenuInfo->Bottom + 2, + "Press ENTER to choose.", + ATTR(UiMenuFgColor, UiMenuBgColor));
- // - // Draw each line of the menu - // - for (Idx=0; Idx<MenuInfo->MenuItemCount; Idx++) - { - TuiDrawMenuItem(MenuInfo, Idx); - } + // + // And offer F8 options + // + TuiDrawText(0, + UiScreenHeight - 4, + "For troubleshooting and advanced startup options for " + "ReactOS, press F8.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + else + { + // + // Update the status bar + // + UiDrawStatusText("Use \x18\x19 to select, then press ENTER."); + }
- VideoCopyOffScreenBufferToVRAM(); -} + // + // Draw the menu box + // + TuiDrawMenuBox(MenuInfo);
-VOID TuiDrawMenuBox(PTUI_MENU_INFO MenuInfo) -{ - CHAR MenuLineText[80]; - CHAR TempString[80]; - ULONG Idx; - - // - // Draw the menu box - // - UiDrawBox(MenuInfo->Left, - MenuInfo->Top, - MenuInfo->Right, - MenuInfo->Bottom, - D_VERT, - D_HORZ, - FALSE, // Filled - TRUE, // Shadow - ATTR(UiMenuFgColor, UiMenuBgColor)); - - // - // If there is a timeout draw the time remaining - // - if (MenuInfo->MenuTimeRemaining >= 0) - { - strcpy(MenuLineText, "[ Time Remaining: "); - _itoa(MenuInfo->MenuTimeRemaining, TempString, 10); - strcat(MenuLineText, TempString); - strcat(MenuLineText, " ]"); - - UiDrawText(MenuInfo->Right - strlen(MenuLineText) - 1, - MenuInfo->Bottom, - MenuLineText, - ATTR(UiMenuFgColor, UiMenuBgColor)); - } - - // - // Now draw the separators - // - for (Idx=0; Idx<MenuInfo->MenuItemCount; Idx++) - { - if (_stricmp(MenuInfo->MenuItemList[Idx], "SEPARATOR") == 0) - { - UiDrawText(MenuInfo->Left, MenuInfo->Top + Idx + 1, "\xC7", ATTR(UiMenuFgColor, UiMenuBgColor)); - UiDrawText(MenuInfo->Right, MenuInfo->Top + Idx + 1, "\xB6", ATTR(UiMenuFgColor, UiMenuBgColor)); - } - } + // + // Draw each line of the menu + // + for (i = 0; i < MenuInfo->MenuItemCount; i++) TuiDrawMenuItem(MenuInfo, i); + VideoCopyOffScreenBufferToVRAM(); }
-VOID TuiDrawMenuItem(PTUI_MENU_INFO MenuInfo, ULONG MenuItemNumber) +VOID +WINAPI +TuiDrawMenuBox(PTUI_MENU_INFO MenuInfo) { - ULONG Idx; - CHAR MenuLineText[80]; - ULONG SpaceTotal; - ULONG SpaceLeft; - ULONG SpaceRight; - UCHAR Attribute; + CHAR MenuLineText[80]; + CHAR TempString[80]; + ULONG i;
- // - // We will want the string centered so calculate - // how many spaces will be to the left and right - // - SpaceTotal = (MenuInfo->Right - MenuInfo->Left - 2) - strlen(MenuInfo->MenuItemList[MenuItemNumber]); - SpaceLeft = (SpaceTotal / 2) + 1; - SpaceRight = (SpaceTotal - SpaceLeft) + 1; + // + // Draw the menu box if requested + // + if (UiMenuBox) + { + UiDrawBox(MenuInfo->Left, + MenuInfo->Top, + MenuInfo->Right, + MenuInfo->Bottom, + D_VERT, + D_HORZ, + FALSE, // Filled + TRUE, // Shadow + ATTR(UiMenuFgColor, UiMenuBgColor)); + }
- // - // Insert the spaces on the left - // - for (Idx=0; Idx<SpaceLeft; Idx++) - { - MenuLineText[Idx] = ' '; - } - MenuLineText[Idx] = '\0'; + // + // 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;
- // - // Now append the text string - // - strcat(MenuLineText, MenuInfo->MenuItemList[MenuItemNumber]); + // + // Display the first part of the string and the remaining time + // + strcpy(MenuLineText, TempString); + _itoa(MenuInfo->MenuTimeRemaining, TempString, 10); + strcat(MenuLineText, TempString);
- // - // Now append the spaces on the right - // - for (Idx=0; Idx<SpaceRight; Idx++) - { - strcat(MenuLineText, " "); - } + // + // Add the last 2 chars + // + strcat(MenuLineText, &UiTimeText[i - 2]);
- // - // If it is a separator then adjust the text accordingly - // - if (_stricmp(MenuInfo->MenuItemList[MenuItemNumber], "SEPARATOR") == 0) - { - memset(MenuLineText, 0, 80); - memset(MenuLineText, 0xC4, (MenuInfo->Right - MenuInfo->Left - 1)); - Attribute = ATTR(UiMenuFgColor, UiMenuBgColor); - } - else - { - Attribute = ATTR(UiTextColor, UiMenuBgColor); - } + // + // Check if this is a centered menu + // + if (UiCenterMenu) + { + // + // Display it in the center of the menu + // + UiDrawText(MenuInfo->Right - strlen(MenuLineText) - 1, + MenuInfo->Bottom, + MenuLineText, + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + else + { + // + // Display under the menu directly + // + UiDrawText(0, + MenuInfo->Bottom + 3, + MenuLineText, + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + }
- // - // If this is the selected menu item then draw it as selected - // otherwise just draw it using the normal colors - // - if (MenuItemNumber == MenuInfo->SelectedMenuItem) - { - UiDrawText(MenuInfo->Left + 1, - MenuInfo->Top + 1 + MenuItemNumber, - MenuLineText, - ATTR(UiSelectedTextColor, UiSelectedTextBgColor)); - } - else - { - UiDrawText(MenuInfo->Left + 1, - MenuInfo->Top + 1 + MenuItemNumber, - MenuLineText, - Attribute); - } + // + // Loop each item + // + for (i = 0; i < MenuInfo->MenuItemCount; i++) + { + // + // Check if it's a separator + // + if (!(_stricmp(MenuInfo->MenuItemList[i], "SEPARATOR"))) + { + // + // 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)); + } + } }
-ULONG TuiProcessMenuKeyboardEvent(PTUI_MENU_INFO MenuInfo, UiMenuKeyPressFilterCallback KeyPressFilter) +VOID +WINAPI +TuiDrawMenuItem(PTUI_MENU_INFO MenuInfo, + ULONG MenuItemNumber) { - ULONG KeyEvent = 0; + ULONG i; + CHAR MenuLineText[80]; + ULONG SpaceTotal; + ULONG SpaceLeft; + ULONG SpaceRight = 0; + UCHAR Attribute = ATTR(UiTextColor, UiMenuBgColor);
- // - // Check for a keypress - // - if (MachConsKbHit()) - { - // - // Cancel the timeout - // - if (MenuInfo->MenuTimeRemaining != -1) - { - MenuInfo->MenuTimeRemaining = -1; - TuiDrawMenuBox(MenuInfo); - } + // + // Check if using centered menu + // + if (UiCenterMenu) + { + // + // We will want the string centered so calculate + // how many spaces will be to the left and right + // + SpaceTotal = (MenuInfo->Right - MenuInfo->Left - 2) - + strlen(MenuInfo->MenuItemList[MenuItemNumber]); + SpaceLeft = (SpaceTotal / 2) + 1; + SpaceRight = (SpaceTotal - SpaceLeft) + 1;
- // - // Get the key - // - KeyEvent = MachConsGetCh(); + // + // Insert the spaces on the left + // + for (i = 0; i < SpaceLeft; i++) MenuLineText[i] = ' '; + MenuLineText[i] = '\0'; + } + else + { + // + // Simply left-align it + // + MenuLineText[0] = '\0'; + strcat(MenuLineText, " "); + }
- // - // Is it extended? - // - if (KeyEvent == 0) - KeyEvent = MachConsGetCh(); // Yes - so get the extended key + // + // Now append the text string + // + strcat(MenuLineText, MenuInfo->MenuItemList[MenuItemNumber]);
- // - // Call the supplied key filter callback function to see - // if it is going to handle this keypress. - // - if (KeyPressFilter != NULL) - { - if (KeyPressFilter(KeyEvent)) - { - // It processed the key character - TuiDrawMenu(MenuInfo); + // + // Check if using centered menu, and add spaces on the right if so + // + if (UiCenterMenu) for (i=0; i < SpaceRight; i++) strcat(MenuLineText, " ");
- return 0; - } - } + // + // If it is a separator + // + if (!(_stricmp(MenuInfo->MenuItemList[MenuItemNumber], "SEPARATOR"))) + { + // + // Make it a separator line and use menu colors + // + memset(MenuLineText, 0, 80); + 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); + }
- // - // Process the key - // - switch (KeyEvent) - { - case KEY_UP: + // + // Draw the item + // + UiDrawText(MenuInfo->Left + 1, + MenuInfo->Top + 1 + MenuItemNumber, + MenuLineText, + Attribute); +}
- if (MenuInfo->SelectedMenuItem > 0) - { - MenuInfo->SelectedMenuItem--; +ULONG +WINAPI +TuiProcessMenuKeyboardEvent(PTUI_MENU_INFO MenuInfo, [truncated at 1000 lines; 314 more skipped]