https://git.reactos.org/?p=reactos.git;a=commitdiff;h=313e6b6cbbec08c56171a…
commit 313e6b6cbbec08c56171a64e6bd0d8be078c4a50
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Feb 6 20:29:05 2022 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)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);