From 8a3ec8229a0dd64677196895baa4733b0c241288 Mon Sep 17 00:00:00 2001 From: srs5694 Date: Wed, 4 Apr 2012 00:05:06 -0400 Subject: [PATCH] Added max_tags option; new shell filenames; new rEFIt icon --- NEWS.txt | 22 ++++++++++++ docs/refind/windows8-on-mac-efi.txt | 1 + icons/os_refit.icns | Bin 32735 -> 29086 bytes mkcdimage | 25 +++++++++++--- refind.conf-sample | 9 +++++ refind/config.c | 2 ++ refind/global.h | 2 +- refind/lib.c | 2 +- refind/main.c | 50 +++++++++++++++++----------- refind/menu.c | 7 ++-- 10 files changed, 90 insertions(+), 30 deletions(-) diff --git a/NEWS.txt b/NEWS.txt index abfad76..e6132fa 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,3 +1,25 @@ +0.2.4 (?/??/2012): +------------------ + +- Added max_tags option to the refind.conf file, enabling users to reduce + the maximum number of OS loader tags that can be displayed at once. + +- Updated rEFIt icon, based on the 128x128 volume label from the rEFIt CD + image. + +- Added x86 and x86-64 EFI shells to the CD image version of the binary, + but NOT to the binary zip file. The logic is that the CD image is more + likely to be used directly as an emergency disc and so may need this + feature, even though the source isn't part of the rEFInd project. (The + source is readily available from the TianoCore project.) + +- EFI shells may now be stored at /shellx64.efi for x86-64 systems or at + /shellia32.efi for x86 systems. The /EFI/tools/shell.efi name is also + recognized; however, if both files are present, two EFI shell icons will + appear on the main menu. The /efi/{refind-path/apps/shell.efi filename, + which was never officially documented but worked as a carryover from + rEFIt, is no longer valid. + 0.2.3 (3/26/2012): ------------------ diff --git a/docs/refind/windows8-on-mac-efi.txt b/docs/refind/windows8-on-mac-efi.txt index 160919f..099d1a4 100644 --- a/docs/refind/windows8-on-mac-efi.txt +++ b/docs/refind/windows8-on-mac-efi.txt @@ -4,3 +4,4 @@ http://forums.macrumors.com/showpost.php?p=13381781&postcount=82 http://forums.macrumors.com/showpost.php?p=14026284&postcount=170 +http://forums.macrumors.com/showpost.php?p=14631912&postcount=459 diff --git a/icons/os_refit.icns b/icons/os_refit.icns index 16ec814b29c475149004ae0193d9d36a7b2cb938..652c8b2a513c9bd2525e63784d6600878b07867c 100644 GIT binary patch literal 29086 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 1)) { + GlobalConfig.MaxTags = Atoi(TokenList[1]); } FreeTokenLine(&TokenList, &TokenCount); diff --git a/refind/global.h b/refind/global.h index dccac51..2c0d681 100644 --- a/refind/global.h +++ b/refind/global.h @@ -147,7 +147,7 @@ typedef struct { UINTN Timeout; UINTN DisableFlags; UINTN HideUIFlags; - BOOLEAN Quiet; + UINTN MaxTags; // max. number of entries to show simultaneously in graphics mode CHAR16 *BannerFileName; CHAR16 *SelectionSmallFileName; CHAR16 *SelectionBigFileName; diff --git a/refind/lib.c b/refind/lib.c index 3feacbe..b0090c6 100644 --- a/refind/lib.c +++ b/refind/lib.c @@ -1048,7 +1048,7 @@ VOID MergeStrings(IN OUT CHAR16 **First, IN CHAR16 *Second, CHAR16 AddChar) { NewString[Length1] = AddChar; NewString[Length1 + 1] = 0; } // if (AddChar) - } // if (First != NULL) + } // if (*First != NULL) if (First != NULL) StrCat(NewString, Second); FreePool(*First); diff --git a/refind/main.c b/refind/main.c index 48f41fe..9612f4d 100644 --- a/refind/main.c +++ b/refind/main.c @@ -55,6 +55,13 @@ // variables #define MACOSX_LOADER_PATH L"\\System\\Library\\CoreServices\\boot.efi" +#if defined (EFIX64) +#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\shellx64.efi" +#elif defined (EFI32) +#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\shellia32.efi" +#else +#define SHELL_NAMES L"\\EFI\\tools\\shell.efi" +#endif static REFIT_MENU_ENTRY MenuEntryAbout = { L"About rEFInd", TAG_ABOUT, 1, 0, 'A', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryReset = { L"Restart Computer", TAG_RESET, 1, 0, 'R', NULL, NULL, NULL }; @@ -64,7 +71,7 @@ static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN static REFIT_MENU_SCREEN MainMenu = { L"Main Menu", NULL, 0, NULL, 0, NULL, 0, L"Automatic boot" }; static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, NULL }; -REFIT_CONFIG GlobalConfig = { FALSE, 20, 0, 0, FALSE, NULL, NULL, NULL, NULL }; +REFIT_CONFIG GlobalConfig = { FALSE, 20, 0, 0, 0, NULL, NULL, NULL, NULL }; // // misc functions @@ -74,11 +81,12 @@ static VOID AboutrEFInd(VOID) { if (AboutMenu.EntryCount == 0) { AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); - AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.3"); + AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.3.3"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer"); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith"); AddMenuInfoLine(&AboutMenu, L"Portions Copyright (c) Intel Corporation and others"); + AddMenuInfoLine(&AboutMenu, L"Distributed under the terms of the GNU GPLv3 license"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Running on:"); AddMenuInfoLine(&AboutMenu, PoolPrint(L" EFI Revision %d.%02d", @@ -614,7 +622,8 @@ static VOID ScanLoaderDir(IN REFIT_VOLUME *Volume, IN CHAR16 *Path) if (DirEntry->FileName[0] == '.' || StriCmp(DirEntry->FileName, L"TextMode.efi") == 0 || StriCmp(DirEntry->FileName, L"ebounce.efi") == 0 || - StriCmp(DirEntry->FileName, L"GraphicsConsole.efi") == 0) + StriCmp(DirEntry->FileName, L"GraphicsConsole.efi") == 0 || + StriSubCmp(L"shell", DirEntry->FileName)) continue; // skip this if (Path) @@ -639,7 +648,6 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { REFIT_DIR_ITER EfiDirIter; EFI_FILE_INFO *EfiDirEntry; CHAR16 FileName[256]; -// LOADER_ENTRY *Entry; if ((Volume->RootDir != NULL) && (Volume->VolName != NULL)) { // check for Mac OS X boot loader @@ -670,7 +678,7 @@ static VOID ScanEfiFiles(REFIT_VOLUME *Volume) { // scan subdirectories of the EFI directory (as per the standard) DirIterOpen(Volume->RootDir, L"EFI", &EfiDirIter); while (DirIterNext(&EfiDirIter, 1, NULL, &EfiDirEntry)) { - if (StriCmp(EfiDirEntry->FileName, L"TOOLS") == 0 || EfiDirEntry->FileName[0] == '.') + if (StriCmp(EfiDirEntry->FileName, L"tools") == 0 || EfiDirEntry->FileName[0] == '.') continue; // skip this, doesn't contain boot loaders SPrint(FileName, 255, L"EFI\\%s", EfiDirEntry->FileName); ScanLoaderDir(Volume, FileName); @@ -1061,35 +1069,36 @@ static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle return Entry; } /* static LOADER_ENTRY * AddToolEntry() */ +// Check the disk for add-on tools -- an EFI shell, the dangerous gptsync.efi, and a rescue Linux +// installation. static VOID ScanTool(VOID) { - CHAR16 FileName[256]; + CHAR16 *FileName; LOADER_ENTRY *Entry; + UINTN i = 0; if (GlobalConfig.DisableFlags & DISABLE_FLAG_TOOLS) return; // look for the EFI shell - if (!(GlobalConfig.DisableFlags & DISABLE_FLAG_SHELL)) { - SPrint(FileName, 255, L"%s\\apps\\shell.efi", SelfDirPath); - if (FileExists(SelfRootDir, FileName)) { - AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'E', FALSE); - } else { - StrCpy(FileName, L"\\efi\\tools\\shell.efi"); - if (FileExists(SelfRootDir, FileName)) { - AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'E', FALSE); - } - } - } + while (((FileName = FindCommaDelimited(SHELL_NAMES, i++)) != NULL) && (!(GlobalConfig.DisableFlags & DISABLE_FLAG_SHELL))) { + if (FileExists(SelfRootDir, FileName)) { + AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'E', FALSE); + } + FreePool(FileName); + FileName = NULL; + } // while // look for the GPT/MBR sync tool - StrCpy(FileName, L"\\efi\\tools\\gptsync.efi"); + MergeStrings(&FileName, L"\\efi\\tools\\gptsync.efi", 0); if (FileExists(SelfRootDir, FileName)) { AddToolEntry(FileName, L"Make Hybrid MBR", BuiltinIcon(BUILTIN_ICON_TOOL_PART), 'P', FALSE); } + FreePool(FileName); + FileName = NULL; // look for rescue Linux - StrCpy(FileName, L"\\efi\\rescue\\elilo.efi"); + MergeStrings(&FileName, L"\\efi\\rescue\\elilo.efi", 0); if (SelfVolume != NULL && FileExists(SelfRootDir, FileName)) { Entry = AddToolEntry(FileName, L"Rescue Linux", BuiltinIcon(BUILTIN_ICON_TOOL_RESCUE), '0', FALSE); @@ -1100,7 +1109,8 @@ static VOID ScanTool(VOID) else Entry->LoadOptions = L"-d 0 mini"; } -} + FreePool(FileName); +} /* VOID ScanTool() */ #ifdef DEBIAN_ENABLE_EFI110 diff --git a/refind/menu.c b/refind/menu.c index aedeb22..a1120ba 100644 --- a/refind/menu.c +++ b/refind/menu.c @@ -166,9 +166,8 @@ static VOID InitScroll(OUT SCROLL_STATE *State, IN UINTN ItemCount, IN UINTN Vis State->LastSelection = State->CurrentSelection = 0; State->MaxIndex = (INTN)ItemCount - 1; State->FirstVisible = 0; - if (VisibleSpace == 0) - State->MaxVisible = UGAWidth / (ROW0_TILESIZE + TILE_XSPACING) - 1; - else + State->MaxVisible = UGAWidth / (ROW0_TILESIZE + TILE_XSPACING) - 1; + if ((VisibleSpace > 0) && (VisibleSpace < State->MaxVisible)) State->MaxVisible = (INTN)VisibleSpace; State->PaintAll = TRUE; State->PaintSelection = FALSE; @@ -729,7 +728,7 @@ VOID MainMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINT switch (Function) { case MENU_FUNCTION_INIT: - InitScroll(State, Screen->EntryCount, 0); + InitScroll(State, Screen->EntryCount, GlobalConfig.MaxTags); // layout row0Count = 0; -- 2.39.2