using System; using Sys = Cosmos.System; using Cosmos.HAL; using Cosmos.Core; using System.Threading; using System.IO; namespace CMLeonOS { public enum BootMenuAction { NormalBoot, GuiBoot, Reboot, Shutdown } internal static class BootMenu { private static bool UserDatExists() { return File.Exists(@"0:\system\user.dat"); } private static void PrintOption(string text, bool selected) { Console.SetCursorPosition(1, Console.GetCursorPosition().Top); Console.BackgroundColor = selected ? ConsoleColor.White : ConsoleColor.Black; Console.ForegroundColor = selected ? ConsoleColor.Black : ConsoleColor.White; Console.WriteLine(text); } private static void Render(int selIdx, int remainingTime) { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.Cyan; Console.SetCursorPosition(0, 0); uint mem = Cosmos.Core.CPU.GetAmountOfRAM(); Console.WriteLine($"{Version.DisplayVersion} [{mem} MB memory]"); Console.WriteLine($"Build Time: {GetBuildTime()}"); Console.WriteLine(); Console.WriteLine($"Auto-select in {remainingTime} seconds..."); Console.WriteLine(); Console.WriteLine("Select an option:"); Console.WriteLine(); bool userDatExists = UserDatExists(); int optionIndex = 0; PrintOption("Normal Boot", selIdx == optionIndex++); if (userDatExists) { PrintOption("GUI Boot", selIdx == optionIndex++); } PrintOption("Reboot", selIdx == optionIndex++); PrintOption("Shutdown", selIdx == optionIndex++); } private static BootMenuAction Confirm(int selIdx) { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Clear(); Console.SetCursorPosition(0, 0); Console.CursorVisible = true; bool userDatExists = UserDatExists(); int optionIndex = 0; if (selIdx == optionIndex++) { return BootMenuAction.NormalBoot; } if (userDatExists && selIdx == optionIndex++) { return BootMenuAction.GuiBoot; } if (selIdx == optionIndex++) { Sys.Power.Reboot(); return BootMenuAction.Reboot; } if (selIdx == optionIndex++) { Sys.Power.Shutdown(); return BootMenuAction.Shutdown; } return BootMenuAction.NormalBoot; } public static BootMenuAction Show() { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Clear(); Console.CursorVisible = false; int selIdx = 0; int remainingTime = 10; int counter = 0; while (true) { Render(selIdx, remainingTime); if (Sys.KeyboardManager.TryReadKey(out var key)) { if (key.Key == Sys.ConsoleKeyEx.Enter) { return Confirm(selIdx); } else if (key.Key == Sys.ConsoleKeyEx.DownArrow) { selIdx++; remainingTime = 10; counter = 0; } else if (key.Key == Sys.ConsoleKeyEx.UpArrow) { selIdx--; remainingTime = 10; counter = 0; } } else { Thread.Sleep(100); counter++; if (counter >= 10) { remainingTime--; counter = 0; if (remainingTime <= 0) { return Confirm(selIdx); } } } int maxOptionIndex = UserDatExists() ? 3 : 2; if (selIdx < 0) { selIdx = maxOptionIndex; } if (selIdx > maxOptionIndex) { selIdx = 0; } } } private static string GetBuildTime() { try { if (Kernel.buildTimeFile != null && Kernel.buildTimeFile.Length > 0) { return System.Text.Encoding.UTF8.GetString(Kernel.buildTimeFile); } } catch { } return "Unknown"; } } }