VOID DebugPause(VOID) { // show console and wait for key SwitchToText(FALSE); PauseForKey(); // reset error flag haveError = FALSE; }
VOID FinishTextScreen(IN BOOLEAN WaitAlways) { if (haveError || WaitAlways) { PauseForKey(); SwitchToText(FALSE); } // reset error flag haveError = FALSE; }
// Sets the screen resolution to the specified value, if possible. // If the specified value is not valid, displays a warning with the valid // modes on UEFI systems, or silently fails on EFI 1.x systems. Note that // this function attempts to set ANY screen resolution, even 0x0 or // ridiculously large values. // Returns TRUE if successful, FALSE if not. BOOLEAN egSetScreenSize(IN UINTN ScreenWidth, IN UINTN ScreenHeight) { EFI_STATUS Status = EFI_SUCCESS; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; UINT32 ModeNum = 0; UINTN Size; BOOLEAN ModeSet = FALSE; UINT32 UGAWidth, UGAHeight, UGADepth, UGARefreshRate; if (GraphicsOutput != NULL) { // GOP mode (UEFI) // Do a loop through the modes to see if the specified one is available; // and if so, switch to it.... while ((Status == EFI_SUCCESS) && (!ModeSet)) { Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, ModeNum, &Size, &Info); if ((Status == EFI_SUCCESS) && (Size >= sizeof(*Info)) && (Info->HorizontalResolution == ScreenWidth) && (Info->VerticalResolution == ScreenHeight)) { Status = refit_call2_wrapper(GraphicsOutput->SetMode, GraphicsOutput, ModeNum); ModeSet = (Status == EFI_SUCCESS); } // if ModeNum++; } // while() if (ModeSet) { egScreenWidth = ScreenWidth; egScreenHeight = ScreenHeight; } else {// If unsuccessful, display an error message for the user.... Print(L"Error setting mode %d x %d; using default mode!\nAvailable modes are:\n", ScreenWidth, ScreenHeight); ModeNum = 0; Status = EFI_SUCCESS; while (Status == EFI_SUCCESS) { Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, ModeNum, &Size, &Info); if ((Status == EFI_SUCCESS) && (Size >= sizeof(*Info))) { Print(L"Mode %d: %d x %d\n", ModeNum, Info->HorizontalResolution, Info->VerticalResolution); } // else ModeNum++; } // while() PauseForKey(); } // if() } else if (UgaDraw != NULL) { // UGA mode (EFI 1.x) // Try to use current color depth & refresh rate for new mode. Maybe not the best choice // in all cases, but I don't know how to probe for alternatives.... Status = refit_call5_wrapper(UgaDraw->GetMode, UgaDraw, &UGAWidth, &UGAHeight, &UGADepth, &UGARefreshRate); Status = refit_call5_wrapper(UgaDraw->SetMode, UgaDraw, ScreenWidth, ScreenHeight, UGADepth, UGARefreshRate); if (Status == EFI_SUCCESS) { egScreenWidth = ScreenWidth; egScreenHeight = ScreenHeight; ModeSet = TRUE; } else { // TODO: Find a list of supported modes and display it. // NOTE: Below doesn't actually appear unless we explicitly switch to text mode. // This is just a placeholder until something better can be done.... Print(L"Error setting mode %d x %d; unsupported mode!\n"); } // if/else } // if/else if return (ModeSet); } // BOOLEAN egSetScreenSize()
VOID FinishExternalScreen(VOID) { // make sure we clean up later GraphicsScreenDirty = TRUE; if (haveError) { SwitchToText(FALSE); PauseForKey(); } // Reset the screen resolution, in case external program changed it.... SetupScreen(); // reset error flag haveError = FALSE; }