X-Git-Url: https://code.delx.au/refind/blobdiff_plain/860fb6e13e399f326ff20e25f9f36070ee67b1a9..4c9f41e161bd197922912efbcf4cc676077d5c00:/refind/screen.c diff --git a/refind/screen.c b/refind/screen.c index fe57a23..3b98586 100644 --- a/refind/screen.c +++ b/refind/screen.c @@ -1,5 +1,5 @@ /* - * refit/screen.c + * refind/screen.c * Screen handling functions * * Copyright (c) 2006 Christoph Pfisterer @@ -37,9 +37,10 @@ #include "global.h" #include "screen.h" #include "config.h" -#include "refit_call_wrapper.h" +#include "libegint.h" +#include "../include/refit_call_wrapper.h" -#include "egemb_refind_banner.h" +#include "../include/egemb_refind_banner.h" // Console defines and variables @@ -73,10 +74,10 @@ static BOOLEAN haveError = FALSE; VOID InitScreen(VOID) { UINTN i; - + // initialize libeg egInitScreen(); - + if (egHasGraphicsMode()) { egGetScreenSize(&UGAWidth, &UGAHeight); AllowGraphicsMode = TRUE; @@ -85,23 +86,23 @@ VOID InitScreen(VOID) egSetGraphicsModeEnabled(FALSE); // just to be sure we are in text mode } GraphicsScreenDirty = TRUE; - + // disable cursor refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, FALSE); - + // get size of text console if (refit_call4_wrapper(ST->ConOut->QueryMode, ST->ConOut, ST->ConOut->Mode->Mode, &ConWidth, &ConHeight) != EFI_SUCCESS) { // use default values on error ConWidth = 80; ConHeight = 25; } - + // make a buffer for a whole text line BlankLine = AllocatePool((ConWidth + 1) * sizeof(CHAR16)); for (i = 0; i < ConWidth; i++) BlankLine[i] = ' '; BlankLine[i] = 0; - + // show the banner (even when in graphics mode) DrawScreenHeader(L"Initializing..."); } @@ -112,10 +113,15 @@ VOID SetupScreen(VOID) // switch to text mode if requested AllowGraphicsMode = FALSE; SwitchToText(FALSE); - + } else if (AllowGraphicsMode) { // clear screen and show banner // (now we know we'll stay in graphics mode) + if ((GlobalConfig.RequestedScreenWidth > 0) && (GlobalConfig.RequestedScreenHeight > 0) && + egSetScreenSize(GlobalConfig.RequestedScreenWidth, GlobalConfig.RequestedScreenHeight)) { + UGAWidth = GlobalConfig.RequestedScreenWidth; + UGAHeight = GlobalConfig.RequestedScreenHeight; + } // if user requested a particular screen resolution SwitchToGraphics(); BltClearScreen(TRUE); } @@ -143,7 +149,7 @@ VOID BeginTextScreen(IN CHAR16 *Title) { DrawScreenHeader(Title); SwitchToText(FALSE); - + // reset error flag haveError = FALSE; } @@ -154,27 +160,32 @@ VOID FinishTextScreen(IN BOOLEAN WaitAlways) SwitchToText(FALSE); PauseForKey(); } - + // reset error flag haveError = FALSE; } VOID BeginExternalScreen(IN BOOLEAN UseGraphicsMode, IN CHAR16 *Title) { + EG_PIXEL DarkBackgroundPixel = { 0x0, 0x0, 0x0, 0 }; + if (!AllowGraphicsMode) UseGraphicsMode = FALSE; - + if (UseGraphicsMode) { SwitchToGraphics(); BltClearScreen(FALSE); - } - + } else { + egClearScreen(&DarkBackgroundPixel); + DrawScreenHeader(Title); + } // if/else + // show the header - DrawScreenHeader(Title); - +// DrawScreenHeader(Title); + if (!UseGraphicsMode) SwitchToText(TRUE); - + // reset error flag haveError = FALSE; } @@ -183,12 +194,12 @@ VOID FinishExternalScreen(VOID) { // make sure we clean up later GraphicsScreenDirty = TRUE; - + if (haveError) { SwitchToText(FALSE); PauseForKey(); } - + // reset error flag haveError = FALSE; } @@ -198,7 +209,7 @@ VOID TerminateScreen(VOID) // clear text screen refit_call2_wrapper(ST->ConOut->SetAttribute, ST->ConOut, ATTR_BASIC); refit_call1_wrapper(ST->ConOut->ClearScreen, ST->ConOut); - + // enable cursor refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, TRUE); } @@ -236,7 +247,7 @@ static BOOLEAN ReadAllKeyStrokes(VOID) BOOLEAN GotKeyStrokes; EFI_STATUS Status; EFI_INPUT_KEY key; - + GotKeyStrokes = FALSE; for (;;) { Status = refit_call2_wrapper(ST->ConIn->ReadKeyStroke, ST->ConIn, &key); @@ -252,17 +263,17 @@ static BOOLEAN ReadAllKeyStrokes(VOID) VOID PauseForKey(VOID) { UINTN index; - + Print(L"\n* Hit any key to continue *"); - + if (ReadAllKeyStrokes()) { // remove buffered key strokes refit_call1_wrapper(BS->Stall, 5000000); // 5 seconds delay ReadAllKeyStrokes(); // empty the buffer again } - + refit_call3_wrapper(BS->WaitForEvent, 1, &ST->ConIn->WaitForKey, &index); ReadAllKeyStrokes(); // empty the buffer to protect the menu - + Print(L"\n"); } @@ -272,7 +283,7 @@ VOID DebugPause(VOID) // show console and wait for key SwitchToText(FALSE); PauseForKey(); - + // reset error flag haveError = FALSE; } @@ -281,7 +292,7 @@ VOID DebugPause(VOID) VOID EndlessIdleLoop(VOID) { UINTN index; - + for (;;) { ReadAllKeyStrokes(); refit_call3_wrapper(BS->WaitForEvent, 1, &ST->ConIn->WaitForKey, &index); @@ -292,39 +303,75 @@ VOID EndlessIdleLoop(VOID) // Error handling // +#ifdef __MAKEWITH_GNUEFI BOOLEAN CheckFatalError(IN EFI_STATUS Status, IN CHAR16 *where) { CHAR16 ErrorName[64]; - + if (!EFI_ERROR(Status)) return FALSE; - + StatusToString(ErrorName, Status); refit_call2_wrapper(ST->ConOut->SetAttribute, ST->ConOut, ATTR_ERROR); Print(L"Fatal Error: %s %s\n", ErrorName, where); refit_call2_wrapper(ST->ConOut->SetAttribute, ST->ConOut, ATTR_BASIC); haveError = TRUE; - + //BS->Exit(ImageHandle, ExitStatus, ExitDataSize, ExitData); - + return TRUE; } BOOLEAN CheckError(IN EFI_STATUS Status, IN CHAR16 *where) { CHAR16 ErrorName[64]; - + if (!EFI_ERROR(Status)) return FALSE; - + StatusToString(ErrorName, Status); refit_call2_wrapper(ST->ConOut->SetAttribute, ST->ConOut, ATTR_ERROR); Print(L"Error: %s %s\n", ErrorName, where); refit_call2_wrapper(ST->ConOut->SetAttribute, ST->ConOut, ATTR_BASIC); haveError = TRUE; - + + return TRUE; +} +#else +BOOLEAN CheckFatalError(IN EFI_STATUS Status, IN CHAR16 *where) +{ +// CHAR16 ErrorName[64]; + + if (!EFI_ERROR(Status)) + return FALSE; + +// StatusToString(ErrorName, Status); + gST->ConOut->SetAttribute (gST->ConOut, ATTR_ERROR); + Print(L"Fatal Error: %r %s\n", Status, where); + gST->ConOut->SetAttribute (gST->ConOut, ATTR_BASIC); + haveError = TRUE; + + //gBS->Exit(ImageHandle, ExitStatus, ExitDataSize, ExitData); + + return TRUE; +} + +BOOLEAN CheckError(IN EFI_STATUS Status, IN CHAR16 *where) +{ +// CHAR16 ErrorName[64]; + + if (!EFI_ERROR(Status)) + return FALSE; + +// StatusToString(ErrorName, Status); + gST->ConOut->SetAttribute (gST->ConOut, ATTR_ERROR); + Print(L"Error: %r %s\n", Status, where); + gST->ConOut->SetAttribute (gST->ConOut, ATTR_BASIC); + haveError = TRUE; + return TRUE; } +#endif // // Graphics functions @@ -351,18 +398,18 @@ VOID BltClearScreen(IN BOOLEAN ShowBanner) if (Banner != NULL) MenuBackgroundPixel = Banner->PixelData[0]; } - + // clear and draw banner egClearScreen(&MenuBackgroundPixel); if (Banner != NULL) BltImage(Banner, (UGAWidth - Banner->Width) >> 1, ((UGAHeight - LAYOUT_TOTAL_HEIGHT) >> 1) + LAYOUT_BANNER_HEIGHT - Banner->Height); - + } else { // clear to standard background color egClearScreen(&StdBackgroundPixel); } - + GraphicsScreenDirty = FALSE; } @@ -375,11 +422,11 @@ VOID BltImage(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos) VOID BltImageAlpha(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos, IN EG_PIXEL *BackgroundPixel) { EG_IMAGE *CompImage; - + // compose on background CompImage = egCreateFilledImage(Image->Width, Image->Height, FALSE, BackgroundPixel); egComposeImage(CompImage, Image, 0, 0); - + // blit to screen and clean up egDrawImage(CompImage, XPos, YPos); egFreeImage(CompImage); @@ -406,7 +453,7 @@ VOID BltImageAlpha(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos, IN EG_PIXEL // CompHeight = TotalHeight; // OffsetY = (TotalHeight - CompHeight) >> 1; // egComposeImage(CompImage, TopImage, OffsetX, OffsetY); -// +// // // blit to screen and clean up // egDrawImage(CompImage, XPos, YPos); // egFreeImage(CompImage); @@ -415,7 +462,7 @@ VOID BltImageAlpha(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos, IN EG_PIXEL VOID BltImageCompositeBadge(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN EG_IMAGE *BadgeImage, IN UINTN XPos, IN UINTN YPos) { - UINTN TotalWidth, TotalHeight, CompWidth = 0, CompHeight = 0, OffsetX = 0, OffsetY = 0; + UINTN TotalWidth = 0, TotalHeight = 0, CompWidth = 0, CompHeight = 0, OffsetX = 0, OffsetY = 0; EG_IMAGE *CompImage = NULL; // initialize buffer with base image @@ -437,7 +484,7 @@ VOID BltImageCompositeBadge(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN EG OffsetY = (TotalHeight - CompHeight) >> 1; egComposeImage(CompImage, TopImage, OffsetX, OffsetY); } - + // place the badge image if (BadgeImage != NULL && CompImage != NULL && (BadgeImage->Width + 8) < CompWidth && (BadgeImage->Height + 8) < CompHeight) { OffsetX += CompWidth - 8 - BadgeImage->Width;