[USETUP] Implement the shutdown timeout progress bar. (#833) 833/head
authorBișoc George <fraizeraust99@gmail.com>
Wed, 22 Aug 2018 09:10:18 +0000 (11:10 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 9 Sep 2018 15:17:16 +0000 (17:17 +0200)
- Add the MUI ID resource.
- Implement the shutdown timeout progress bar function and the TimeOut string handler.
- Add the resource string to other resource languages.

27 files changed:
base/setup/usetup/lang/bg-BG.h
base/setup/usetup/lang/bn-BD.h
base/setup/usetup/lang/cs-CZ.h
base/setup/usetup/lang/da-DK.h
base/setup/usetup/lang/de-DE.h
base/setup/usetup/lang/el-GR.h
base/setup/usetup/lang/en-US.h
base/setup/usetup/lang/es-ES.h
base/setup/usetup/lang/et-EE.h
base/setup/usetup/lang/fr-FR.h
base/setup/usetup/lang/he-IL.h
base/setup/usetup/lang/it-IT.h
base/setup/usetup/lang/ja-JP.h
base/setup/usetup/lang/lt-LT.h
base/setup/usetup/lang/ms-MY.h
base/setup/usetup/lang/nl-NL.h
base/setup/usetup/lang/pl-PL.h
base/setup/usetup/lang/pt-BR.h
base/setup/usetup/lang/ro-RO.h
base/setup/usetup/lang/ru-RU.h
base/setup/usetup/lang/sk-SK.h
base/setup/usetup/lang/sq-AL.h
base/setup/usetup/lang/sv-SE.h
base/setup/usetup/lang/tr-TR.h
base/setup/usetup/lang/uk-UA.h
base/setup/usetup/mui.h
base/setup/usetup/usetup.c

index c85d48c..b6366ea 100644 (file)
@@ -1792,6 +1792,8 @@ MUI_STRING bgBGStrings[] =
     "   \83®â®¢®..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = \8f१ ¯ã᪠­¥ ­  ª®¬¯îâêà "},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "\8e⢠àﭥ⮠­  ª®­§®« â  ¥ ­¥¢ê§¬®¦­®\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index fcc483b..5a4d778 100644 (file)
@@ -1777,6 +1777,8 @@ MUI_STRING bnBDStrings[] =
     "   Done..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Reboot computer"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Unable to open the console\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 790fbfc..4359652 100644 (file)
@@ -1785,6 +1785,8 @@ MUI_STRING csCZStrings[] =
     "   Hotovo..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Restartovat po\9f¡ta\9f"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Nelze otevý¡t konzoli\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index f6029f6..febfb2b 100644 (file)
@@ -1791,6 +1791,8 @@ MUI_STRING daDKStrings[] =
     "   Udf\9brt..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Genstart"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Kunne ikke \86bne konsollen\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 9ddac46..fda98fb 100644 (file)
@@ -1781,6 +1781,8 @@ MUI_STRING deDEStrings[] =
     "   Fertig..."},
     {STRING_REBOOTCOMPUTER2,
     "   EINGABETASTE = Computer neu starten"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Konsole konnte nicht ge\94ffnet werden\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 034b895..58e624f 100644 (file)
@@ -1796,6 +1796,8 @@ MUI_STRING elGRStrings[] =
     "   \8e¢¦¡¢\9e¨é\9f\9e¡\9c..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = \84§\9c¤ ¡¡å¤\9e©\9e ¬§¦¢¦\9a ©«ã"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "\80\9bç¤\98«¦ ¤\98 \98¤¦ ®«\9cå \9e ¡¦¤©æ¢\98\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 216df8f..9f3a633 100644 (file)
@@ -1777,6 +1777,8 @@ MUI_STRING enUSStrings[] =
     "   Done..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Reboot computer"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Unable to open the console\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 2bf3418..e52c7a5 100644 (file)
@@ -1781,6 +1781,8 @@ MUI_STRING esESStrings[] =
     "   Terminado..."},
     {STRING_REBOOTCOMPUTER2,
     "   INTRO = Reiniciar el equipo"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "No se pudo abrir la consola\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index b21105d..ee47d0e 100644 (file)
@@ -1777,6 +1777,8 @@ MUI_STRING etEEStrings[] =
     "   Valmis..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Taask\84ivita arvuti"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Konsooli ei ännestunud avada\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 7f11d9b..fc2780e 100644 (file)
@@ -1796,6 +1796,8 @@ MUI_STRING frFRStrings[] =
     "   Termin\82..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTR\90E = Red\82marrer l'ordinateur"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Impossible d'ouvrir la console\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index e48da92..686ed20 100644 (file)
@@ -1779,6 +1779,8 @@ MUI_STRING heILStrings[] =
     "   \91\89\85\8d..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = \84\94\92\8c \8e\87\83\99 \80\9a \84\8e\99\81"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Unable to open the console\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index ad3c98b..9fcaf4c 100644 (file)
@@ -1784,6 +1784,8 @@ MUI_STRING itITStrings[] =
     "   Fatto..."},
     {STRING_REBOOTCOMPUTER2,
     "   INVIO = Riavvia il computer"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Impossibile aprire la console\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 1000261..d30be14 100644 (file)
@@ -1781,6 +1781,8 @@ MUI_STRING jaJPStrings[] =
     "   ¶ÝØ®³..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = ºÝËß­°ÀÉ »²·ÄÞ³"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "ºÝ¿°Ù¦ µ°ÌßÝ Ã޷ϾÝ\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 9a90a8d..697b19f 100644 (file)
@@ -1787,6 +1787,8 @@ MUI_STRING ltLTStrings[] =
     "   Done..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Reboot computer"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Unable to open the console\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index b4eceeb..2da4e91 100644 (file)
@@ -1666,6 +1666,8 @@ MUI_STRING msMYStrings[] =
     "   Siap..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Memulakan semuala komputer"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Tidak dapat membuka konsol\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index c25d939..9f080ce 100644 (file)
@@ -1807,6 +1807,8 @@ MUI_STRING nlNLStrings[] =
     "   Voltooid..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Computer opnieuw opstarten"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Kan console niet openen.\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 384da7a..b1381bc 100644 (file)
@@ -1788,6 +1788,8 @@ MUI_STRING plPLStrings[] =
     "   Ukoäczone..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Restart komputera"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Otwarcie konsoli nieudane\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index e1cd55e..4372dc3 100644 (file)
@@ -1811,6 +1811,8 @@ MUI_STRING ptBRStrings[] =
     "   Pronto..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER=Reiniciar"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "NÆo foi poss¡vel abrir o console\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 67a8b31..ea86f5a 100644 (file)
@@ -1831,6 +1831,8 @@ MUI_STRING roROStrings[] =
     "   Terminat!"},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Repornire calculator"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Eºec la deschiderea consolei\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 6d087df..32b7821 100644 (file)
@@ -1778,6 +1778,8 @@ MUI_STRING ruRUStrings[] =
     "   \87 ¢¥à襭®..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = \8f¥à¥§ £à㧪 "},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "\8d¥ ã¤ «®áì ®âªàëâì ª®­á®«ì\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 3568291..be99ea5 100644 (file)
@@ -1791,6 +1791,8 @@ MUI_STRING skSKStrings[] =
     "   Hotovo..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Reçtart po\9f¡ta\9fa"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Nemo§no otvori\9c konzolu\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 021f11a..bf157a9 100644 (file)
@@ -1784,6 +1784,8 @@ MUI_STRING sqALStrings[] =
     "   Mbaruam..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Ristarto kompjuterin"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "N\89 pamundesi p\89r t\89 hapur konsollin\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 2dafaf3..38e766f 100644 (file)
@@ -1787,6 +1787,8 @@ MUI_STRING svSEStrings[] =
     "   F\84rdigt..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = Starta om datorn"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Det g\86r inte \94ppna Konsollen\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 59b9d13..be2ce60 100644 (file)
@@ -1758,6 +1758,8 @@ MUI_STRING trTRStrings[] =
     "   Bitti..."},
     {STRING_REBOOTCOMPUTER2,
     "   Giri\9f = Bilgisayar\8d Yeniden Ba\9flat"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "Konsol a\87\8dlam\8dyor.\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index b0b6d53..7f69307 100644 (file)
@@ -1787,6 +1787,8 @@ MUI_STRING ukUAStrings[] =
     "   \83®â®¢®..."},
     {STRING_REBOOTCOMPUTER2,
     "   ENTER = \8f¥à¥§ ¢ ­â ¦¨â¨ ª®¬¯'îâ¥à"},
+    {STRING_REBOOTPROGRESSBAR,
+    " Your computer will reboot in %li second(s)... "},
     {STRING_CONSOLEFAIL1,
     "\8d¥ ¢¤ «®áì ¢i¤ªà¨â¨ ª®­á®«ì\r\n\r\n"},
     {STRING_CONSOLEFAIL2,
index 0219cde..707bb80 100644 (file)
@@ -159,3 +159,4 @@ MUIGetString(
 #define STRING_MB                        54
 #define STRING_GB                        55
 #define STRING_ADDKBLAYOUTS              56
+#define STRING_REBOOTPROGRESSBAR         64
index 1a7940c..102db35 100644 (file)
@@ -4502,6 +4502,195 @@ BootLoaderHarddiskMbrPage(PINPUT_RECORD Ir)
 }
 
 
+/**
+ * @name ProgressTimeOutStringHandler
+ *
+ * Handles the generation (displaying) of the timeout
+ * countdown to the screen dynamically.
+ *
+ * @param   Bar
+ *     A pointer to a progress bar.
+ *
+ * @param   AlwaysUpdate
+ *     Constantly update the progress bar (boolean type).
+ *
+ * @param   Buffer
+ *     A pointer to a string buffer.
+ *
+ * @param   cchBufferSize
+ *     The buffer's size in number of characters.
+ *
+ * @return
+ *     TRUE or FALSE on function termination.
+ *
+ */
+static
+BOOLEAN NTAPI
+ProgressTimeOutStringHandler(
+    IN PPROGRESSBAR Bar,
+    IN BOOLEAN AlwaysUpdate,
+    OUT PSTR Buffer,
+    IN SIZE_T cchBufferSize)
+{
+    ULONG OldProgress = Bar->Progress;
+
+    if (Bar->StepCount == 0)
+    {
+        Bar->Progress = 0;
+    }
+    else
+    {
+        Bar->Progress = Bar->StepCount - Bar->CurrentStep;
+    }
+
+    /* Build the progress string if it has changed */
+    if (Bar->ProgressFormatText &&
+        (AlwaysUpdate || (Bar->Progress != OldProgress)))
+    {
+        RtlStringCchPrintfA(Buffer, cchBufferSize,
+                            Bar->ProgressFormatText, Bar->Progress);
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+/**
+ * @name ProgressCountdown
+ *
+ * Displays and draws a red-coloured progress bar with a countdown.
+ * When the timeout is reached, the flush page is displayed for reboot.
+ *
+ * @param   Ir
+ *     A pointer to an input keyboard record.
+ *
+ * @param   TimeOut
+ *     Initial countdown value in seconds.
+ *
+ * @return
+ *     Nothing.
+ *
+ */
+static VOID
+ProgressCountdown(
+    IN PINPUT_RECORD Ir,
+    IN LONG TimeOut)
+{
+    NTSTATUS Status;
+    ULONG StartTime;
+    LONG TimeElapsed;
+    LONG TimerValue = TimeOut, OldTimerValue;
+    LARGE_INTEGER Timeout;
+    PPROGRESSBAR ProgressBar;
+    BOOLEAN RefreshProgress = TRUE;
+
+    /* Bail out if the timeout is already zero */
+    if (TimeOut <= 0)
+        return;
+
+    /* Create the timeout progress bar and set it up */
+    ProgressBar = CreateProgressBarEx(13,
+                                      26,
+                                      xScreen - 13,
+                                      yScreen - 20,
+                                      10,
+                                      24,
+                                      TRUE,
+                                      FOREGROUND_RED | BACKGROUND_BLUE,
+                                      TimerValue,
+                                      NULL,
+                                      MUIGetString(STRING_REBOOTPROGRESSBAR),
+                                      ProgressTimeOutStringHandler);
+
+    StartTime = NtGetTickCount();
+    CONSOLE_Flush();
+
+    OldTimerValue = TimerValue;
+    while (TRUE)
+    {
+        /* Decrease the timer */
+
+        /*
+         * Compute how much time the previous operations took.
+         * This allows us in particular to take account for any time
+         * elapsed if something slowed down.
+         */
+        TimeElapsed = NtGetTickCount() - StartTime;
+        if (TimeElapsed >= 1000)
+        {
+            /* Increase StartTime by steps of 1 second */
+            TimeElapsed /= 1000;
+            StartTime += (1000 * TimeElapsed);
+
+            if (TimeElapsed <= TimerValue)
+                TimerValue -= TimeElapsed;
+            else
+                TimerValue = 0;
+
+            RefreshProgress = TRUE;
+        }
+
+        if (RefreshProgress)
+        {
+            ProgressSetStep(ProgressBar, OldTimerValue - TimerValue);
+            RefreshProgress = FALSE;
+        }
+
+        /* Stop when the timer reaches zero */
+        if (TimerValue <= 0)
+            break;
+
+        /* Check for user key presses */
+
+        /*
+         * If the timer is used, use a passive wait of maximum 1 second
+         * while monitoring for incoming console input events, so that
+         * we are still able to display the timing count.
+         */
+
+        /* Wait a maximum of 1 second for input events */
+        TimeElapsed = NtGetTickCount() - StartTime;
+        if (TimeElapsed < 1000)
+        {
+            /* Convert the time to NT Format */
+            Timeout.QuadPart = (1000 - TimeElapsed) * -10000LL;
+            Status = NtWaitForSingleObject(StdInput, FALSE, &Timeout);
+        }
+        else
+        {
+            Status = STATUS_TIMEOUT;
+        }
+
+        /* Check whether the input event has been signaled, or a timeout happened */
+        if (Status == STATUS_TIMEOUT)
+        {
+            continue;
+        }
+        if (Status != STATUS_WAIT_0)
+        {
+            /* An error happened, bail out */
+            DPRINT1("NtWaitForSingleObject() failed, Status 0x%08lx\n", Status);
+            break;
+        }
+
+        /* Check for an ENTER key press */
+        while (CONSOLE_ConInKeyPeek(Ir))
+        {
+            if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+            {
+                /* Found it, stop waiting */
+                goto Exit;
+            }
+        }
+    }
+
+Exit:
+    /* Destroy the progress bar and quit */
+    DestroyProgressBar(ProgressBar);
+}
+
+
 /*
  * Displays the QuitPage.
  *
@@ -4572,15 +4761,9 @@ QuitPage(PINPUT_RECORD Ir)
 
     CONSOLE_SetStatusText(MUIGetString(STRING_REBOOTCOMPUTER2));
 
-    while (TRUE)
-    {
-        CONSOLE_ConInKey(Ir);
-
-        if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
-        {
-            return FLUSH_PAGE;
-        }
-    }
+    /* Wait for maximum 15 seconds or an ENTER key before quitting */
+    ProgressCountdown(Ir, 15);
+    return FLUSH_PAGE;
 }
 
 
@@ -4602,19 +4785,11 @@ SuccessPage(PINPUT_RECORD Ir)
     MUIDisplayPage(SUCCESS_PAGE);
 
     if (IsUnattendedSetup)
-    {
         return FLUSH_PAGE;
-    }
 
-    while (TRUE)
-    {
-        CONSOLE_ConInKey(Ir);
-
-        if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
-        {
-            return FLUSH_PAGE;
-        }
-    }
+    /* Wait for maximum 15 seconds or an ENTER key before quitting */
+    ProgressCountdown(Ir, 15);
+    return FLUSH_PAGE;
 }