https://git.reactos.org/?p=reactos.git;a=commitdiff;h=313e6b6cbbec08c56171a64e6bd0d8be078c4a50

commit 313e6b6cbbec08c56171a64e6bd0d8be078c4a50
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Sun Feb 6 20:29:05 2022 +0100
Commit:     Hermès Bélusca-Maïto <[email protected]>
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);

Reply via email to