]> code.delx.au - refind/commitdiff
New Apple Recovery partition tool (2nd-row icon).
authorsrs5694 <srs5694@users.sourceforge.net>
Mon, 12 Nov 2012 02:44:32 +0000 (21:44 -0500)
committersrs5694 <srs5694@users.sourceforge.net>
Mon, 12 Nov 2012 02:44:32 +0000 (21:44 -0500)
refind/config.c
refind/global.h
refind/icns.c
refind/icns.h
refind/main.c

index e70d6b23d1fd985002879a06e5e258a21082b3a2..e1b5c4640bb99ee830f6d0e323c2a7bb2ae34e71 100644 (file)
@@ -383,6 +383,8 @@ VOID ReadConfig(VOID)
                    GlobalConfig.ShowTools[i - 1] = TAG_REBOOT;
                 } else if (StriCmp(FlagName, L"shutdown") == 0) {
                    GlobalConfig.ShowTools[i - 1] = TAG_SHUTDOWN;
+                } else if (StriCmp(FlagName, L"apple_recovery") == 0) {
+                   GlobalConfig.ShowTools[i - 1] = TAG_APPLE_RECOVERY;
                 } else {
                    Print(L" unknown showtools flag: '%s'\n", FlagName);
                 }
@@ -571,6 +573,7 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C
          MyFreePool(Entry->LoadOptions);
          Entry->LoadOptions = NULL; // Discard default options, if any
          DefaultsSet = TRUE;
+
       } else if ((StriCmp(TokenList[0], L"volume") == 0) && (TokenCount > 1)) {
          if (FindVolume(&CurrentVolume, TokenList[1])) {
             MyFreePool(Entry->me.Title);
@@ -579,29 +582,37 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C
             Entry->me.BadgeImage   = CurrentVolume->VolBadgeImage;
             Entry->VolName         = CurrentVolume->VolName;
          } // if match found
+
       } else if ((StriCmp(TokenList[0], L"icon") == 0) && (TokenCount > 1)) {
          MyFreePool(Entry->me.Image);
          Entry->me.Image = LoadIcns(CurrentVolume->RootDir, TokenList[1], 128);
          if (Entry->me.Image == NULL) {
             Entry->me.Image = DummyImage(128);
          }
+
       } else if ((StriCmp(TokenList[0], L"initrd") == 0) && (TokenCount > 1)) {
          MyFreePool(Entry->InitrdPath);
          Entry->InitrdPath = StrDuplicate(TokenList[1]);
+
       } else if ((StriCmp(TokenList[0], L"options") == 0) && (TokenCount > 1)) {
          MyFreePool(Entry->LoadOptions);
          Entry->LoadOptions = StrDuplicate(TokenList[1]);
+
       } else if ((StriCmp(TokenList[0], L"ostype") == 0) && (TokenCount > 1)) {
          if (TokenCount > 1) {
             Entry->OSType = TokenList[1][0];
          }
+
       } else if ((StriCmp(TokenList[0], L"graphics") == 0) && (TokenCount > 1)) {
          Entry->UseGraphicsMode = (StriCmp(TokenList[1], L"on") == 0);
+
       } else if (StriCmp(TokenList[0], L"disabled") == 0) {
          Entry->Enabled = FALSE;
+
       } else if ((StriCmp(TokenList[0], L"submenuentry") == 0) && (TokenCount > 1)) {
          AddSubmenu(Entry, File, CurrentVolume, TokenList[1]);
          AddedSubmenu = TRUE;
+
       } // set options to pass to the loader program
       FreeTokenLine(&TokenList, &TokenCount);
    } // while()
index 101b5975b67ae28bab7c18a6f67a1fdc7de2e726..24f33f306ecd852c7710926196fac01022aa61cc 100644 (file)
@@ -68,7 +68,8 @@
 #define TAG_SHELL    (8)
 #define TAG_GPTSYNC  (9)
 #define TAG_LEGACY_UEFI (10)
-#define NUM_TOOLS    (9)
+#define TAG_APPLE_RECOVERY (11)
+#define NUM_TOOLS    (10)
 
 #define NUM_SCAN_OPTIONS 10
 
index df469ef12d4e8e24c63ee216eff4ecb21b824a33..a7ec2e6b5fa5a1f2894104761055df9f42fd3fa3 100644 (file)
@@ -58,6 +58,7 @@ BUILTIN_ICON BuiltinIconTable[BUILTIN_ICON_COUNT] = {
    { NULL, L"tool_shell.icns", 48 },
    { NULL, L"tool_part.icns", 48 },
    { NULL, L"tool_rescue.icns", 48 },
+   { NULL, L"tool_apple_rescue.icns", 48 },
    { NULL, L"vol_internal.icns", 32 },
    { NULL, L"vol_external.icns", 32 },
    { NULL, L"vol_optical.icns", 32 },
index c4aff8a645e3a07455d19003e9c2b66a837d2921..e8945b2c9be52105b79a1774a4bef213a9f34b75 100644 (file)
@@ -64,10 +64,11 @@ EG_IMAGE * BuiltinIcon(IN UINTN Id);
 #define BUILTIN_ICON_TOOL_SHELL     (4)
 #define BUILTIN_ICON_TOOL_PART      (5)
 #define BUILTIN_ICON_TOOL_RESCUE    (6)
-#define BUILTIN_ICON_VOL_INTERNAL   (7)
-#define BUILTIN_ICON_VOL_EXTERNAL   (8)
-#define BUILTIN_ICON_VOL_OPTICAL    (9)
-#define BUILTIN_ICON_COUNT          (10)
+#define BUILTIN_ICON_TOOL_APPLE_RESCUE (7)
+#define BUILTIN_ICON_VOL_INTERNAL   (8)
+#define BUILTIN_ICON_VOL_EXTERNAL   (9)
+#define BUILTIN_ICON_VOL_OPTICAL    (10)
+#define BUILTIN_ICON_COUNT          (11)
 
 #endif
 
index 721dbe72e849c25b38a13843f5f37160988934f4..df81018140d42ea2a846947edaeedc06b6f3335f 100644 (file)
@@ -95,7 +95,7 @@ static REFIT_MENU_SCREEN AboutMenu      = { L"About", NULL, 0, NULL, 0, NULL, 0,
 
 REFIT_CONFIG GlobalConfig = { FALSE, FALSE, 0, 0, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, 0,
                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-                              {TAG_SHELL, TAG_ABOUT, TAG_SHUTDOWN, TAG_REBOOT, 0, 0, 0, 0, 0 }};
+                              {TAG_SHELL, TAG_ABOUT, TAG_APPLE_RECOVERY, TAG_SHUTDOWN, TAG_REBOOT, 0, 0, 0, 0, 0 }};
 
 // Structure used to hold boot loader filenames and time stamps in
 // a linked list; used to sort entries within a directory.
@@ -115,7 +115,7 @@ static VOID AboutrEFInd(VOID)
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.4.7.2");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.4.7.3");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith");
@@ -1452,7 +1452,7 @@ static VOID StartTool(IN LOADER_ENTRY *Entry)
    FinishExternalScreen();
 } /* static VOID StartTool() */
 
-static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN EG_IMAGE *Image,
+static LOADER_ENTRY * AddToolEntry(EFI_HANDLE DeviceHandle, IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN EG_IMAGE *Image,
                                    IN CHAR16 ShortcutLetter, IN BOOLEAN UseGraphicsMode)
 {
     LOADER_ENTRY *Entry;
@@ -1468,7 +1468,8 @@ static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle
     Entry->me.ShortcutLetter = ShortcutLetter;
     Entry->me.Image = Image;
     Entry->LoaderPath = (LoaderPath) ? StrDuplicate(LoaderPath) : NULL;
-    Entry->DevicePath = FileDevicePath(SelfLoadedImage->DeviceHandle, Entry->LoaderPath);
+//    Entry->DevicePath = FileDevicePath(SelfLoadedImage->DeviceHandle, Entry->LoaderPath);
+    Entry->DevicePath = FileDevicePath(DeviceHandle, Entry->LoaderPath);
     Entry->UseGraphicsMode = UseGraphicsMode;
 
     AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry);
@@ -1715,9 +1716,9 @@ static VOID ScanForBootloaders(VOID) {
 // Add the second-row tags containing built-in and external tools (EFI shell,
 // reboot, etc.)
 static VOID ScanForTools(VOID) {
-   CHAR16 *FileName = NULL;
+   CHAR16 *FileName = NULL, Description[256];
    REFIT_MENU_ENTRY *TempMenuEntry;
-   UINTN i, j;
+   UINTN i, j, VolumeIndex;
 
    for (i = 0; i < NUM_TOOLS; i++) {
       switch(GlobalConfig.ShowTools[i]) {
@@ -1745,16 +1746,30 @@ static VOID ScanForTools(VOID) {
             j = 0;
             while ((FileName = FindCommaDelimited(SHELL_NAMES, j++)) != NULL) {
                if (FileExists(SelfRootDir, FileName)) {
-                  AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'S', FALSE);
+                  AddToolEntry(SelfLoadedImage->DeviceHandle, FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'S', FALSE);
                }
             } // while
             break;
          case TAG_GPTSYNC:
+            MyFreePool(FileName);
+            FileName = NULL;
             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);
+               AddToolEntry(SelfLoadedImage->DeviceHandle, FileName, L"Make Hybrid MBR", BuiltinIcon(BUILTIN_ICON_TOOL_PART), 'P', FALSE);
             }
             break;
+         case TAG_APPLE_RECOVERY:
+            MyFreePool(FileName);
+            FileName = NULL;
+            MergeStrings(&FileName, L"\\com.apple.recovery.boot\\boot.efi", 0);
+            for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) {
+               if ((Volumes[VolumeIndex]->RootDir != NULL) && (FileExists(Volumes[VolumeIndex]->RootDir, FileName))) {
+                  SPrint(Description, 255, L"Apple Recovery on %s", Volumes[VolumeIndex]->VolName);
+                  AddToolEntry(Volumes[VolumeIndex]->DeviceHandle, FileName, Description,
+                               BuiltinIcon(BUILTIN_ICON_TOOL_APPLE_RESCUE), 'R', TRUE);
+               }
+            } // for
+            break;
       } // switch()
       MyFreePool(FileName);
       FileName = NULL;