https://git.reactos.org/?p=reactos.git;a=commitdiff;h=313e6b6cbbec08c56171a6...
commit 313e6b6cbbec08c56171a64e6bd0d8be078c4a50 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sun Feb 6 20:29:05 2022 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Feb 6 22:20:57 2022 +0100
[FREELDR:UI] Clean-up when uninitializing the UI.
- If the started OS loader failed and we are back to the OS selection menu, re-initialize the UI as the loader may have messed up the display in the meantime.
- Tear down allocated off-screen back-buffer when uninitializing the TUI. - Clear up the screen when initializing the direct-UI. --- boot/freeldr/freeldr/bootmgr.c | 7 +++++++ boot/freeldr/freeldr/include/ui/video.h | 4 +++- boot/freeldr/freeldr/ui/directui.c | 3 +++ boot/freeldr/freeldr/ui/tui.c | 7 +++++++ boot/freeldr/freeldr/ui/video.c | 15 ++++++++++----- 5 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/boot/freeldr/freeldr/bootmgr.c b/boot/freeldr/freeldr/bootmgr.c index 9830c2ec74f..c866502a6aa 100644 --- a/boot/freeldr/freeldr/bootmgr.c +++ b/boot/freeldr/freeldr/bootmgr.c @@ -401,6 +401,13 @@ VOID RunLoader(VOID)
/* Load the chosen operating system */ LoadOperatingSystem(&OperatingSystemList[SelectedOperatingSystem]); + + /* If we get there, the OS loader failed. As it may have + * messed up the display, re-initialize the UI. */ +#ifndef _M_ARM + UiVtbl.UnInitialize(); +#endif + UiInitialize(TRUE); }
Reboot: diff --git a/boot/freeldr/freeldr/include/ui/video.h b/boot/freeldr/freeldr/include/ui/video.h index 0e0f4ec3828..c6f07a94704 100644 --- a/boot/freeldr/freeldr/include/ui/video.h +++ b/boot/freeldr/freeldr/include/ui/video.h @@ -19,7 +19,9 @@ typedef struct _PALETTE_ENTRY // extern PVOID VideoOffScreenBuffer;
PVOID VideoAllocateOffScreenBuffer(VOID); // Returns a pointer to an off-screen buffer sufficient for the current video mode -VOID VideoCopyOffScreenBufferToVRAM(VOID); + +VOID VideoFreeOffScreenBuffer(VOID); +VOID VideoCopyOffScreenBufferToVRAM(VOID);
VOID VideoSavePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount); VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount); diff --git a/boot/freeldr/freeldr/ui/directui.c b/boot/freeldr/freeldr/ui/directui.c index cd4b07dcf94..7021a86cdbc 100644 --- a/boot/freeldr/freeldr/ui/directui.c +++ b/boot/freeldr/freeldr/ui/directui.c @@ -34,6 +34,9 @@ UiInitialize(IN BOOLEAN ShowUi) /* Set mode and query size */ MachVideoSetDisplayMode(NULL, TRUE); MachVideoGetDisplaySize(&UiScreenWidth, &UiScreenHeight, &Depth); + + /* Clear the screen */ + UiDrawBackdrop(); return TRUE; }
diff --git a/boot/freeldr/freeldr/ui/tui.c b/boot/freeldr/freeldr/ui/tui.c index d14b1f656fc..bcf510ed7c8 100644 --- a/boot/freeldr/freeldr/ui/tui.c +++ b/boot/freeldr/freeldr/ui/tui.c @@ -210,6 +210,10 @@ BOOLEAN TuiInitialize(VOID)
VOID TuiUnInitialize(VOID) { + /* Do nothing if already uninitialized */ + if (!TextVideoBuffer) + return; + if (UiUseSpecialEffects) { TuiFadeOut(); @@ -219,6 +223,9 @@ VOID TuiUnInitialize(VOID) MachVideoSetDisplayMode(NULL, FALSE); }
+ VideoFreeOffScreenBuffer(); + TextVideoBuffer = NULL; + MachVideoClearScreen(ATTR(COLOR_GRAY, COLOR_BLACK)); MachVideoSetTextCursorPosition(0, 0); MachVideoHideShowTextCursor(TRUE); diff --git a/boot/freeldr/freeldr/ui/video.c b/boot/freeldr/freeldr/ui/video.c index d44f8ee1eed..ab77d694a3c 100644 --- a/boot/freeldr/freeldr/ui/video.c +++ b/boot/freeldr/freeldr/ui/video.c @@ -18,11 +18,7 @@ PVOID VideoAllocateOffScreenBuffer(VOID) { ULONG BufferSize;
- if (VideoOffScreenBuffer != NULL) - { - MmFreeMemory(VideoOffScreenBuffer); - VideoOffScreenBuffer = NULL; - } + VideoFreeOffScreenBuffer();
BufferSize = MachVideoGetBufferSize();
@@ -31,6 +27,15 @@ PVOID VideoAllocateOffScreenBuffer(VOID) return VideoOffScreenBuffer; }
+VOID VideoFreeOffScreenBuffer(VOID) +{ + if (!VideoOffScreenBuffer) + return; + + MmFreeMemory(VideoOffScreenBuffer); + VideoOffScreenBuffer = NULL; +} + VOID VideoCopyOffScreenBufferToVRAM(VOID) { MachVideoCopyOffScreenBufferToVRAM(VideoOffScreenBuffer);