#nullable enable // We use global using directives to simplify the code and avoid repetitive namespace declarations. // Put them here so they are available throughout the application. // Do not put them in AssemblyInfo.cs as it will break GitVersion's /updateassemblyinfo global using Attribute = Terminal.Gui.Drawing.Attribute; global using Color = Terminal.Gui.Drawing.Color; global using CM = Terminal.Gui.Configuration.ConfigurationManager; global using Terminal.Gui.App; global using Terminal.Gui.Drivers; global using Terminal.Gui.Input; global using Terminal.Gui.Configuration; global using Terminal.Gui.ViewBase; global using Terminal.Gui.Views; global using Terminal.Gui.Drawing; global using Terminal.Gui.Text; global using Terminal.Gui.Resources; global using Terminal.Gui.FileServices; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Resources; namespace Terminal.Gui.App; /// A static, singleton class representing the application. This class is the entry point for the application. /// /// /// Application.Init(); /// var win = new Window() /// { /// Title = $"Example App ({Application.QuitKey} to quit)" /// }; /// Application.Run(win); /// win.Dispose(); /// Application.Shutdown(); /// /// /// public static partial class Application { /// /// Maximum number of iterations of the main loop (and hence draws) /// to allow to occur per second. Defaults to > which is a 40ms sleep /// after iteration (factoring in how long iteration took to run). /// Note that not every iteration draws (see ). /// Only affects v2 drivers. /// public static ushort MaximumIterationsPerSecond = DefaultMaximumIterationsPerSecond; /// /// Default value for /// public const ushort DefaultMaximumIterationsPerSecond = 25; /// /// Gets a string representation of the Application as rendered by . /// /// A string representation of the Application public new static string ToString () { IDriver? driver = Driver; if (driver is null) { return string.Empty; } return ToString (driver); } /// /// Gets a string representation of the Application rendered by the provided . /// /// The driver to use to render the contents. /// A string representation of the Application public static string ToString (IDriver? driver) { if (driver is null) { return string.Empty; } var sb = new StringBuilder (); Cell [,] contents = driver?.Contents!; for (var r = 0; r < driver!.Rows; r++) { for (var c = 0; c < driver.Cols; c++) { Rune rune = contents [r, c].Rune; if (rune.DecodeSurrogatePair (out char []? sp)) { sb.Append (sp); } else { sb.Append ((char)rune.Value); } if (rune.GetColumns () > 1) { c++; } // See Issue #2616 //foreach (var combMark in contents [r, c].CombiningMarks) { // sb.Append ((char)combMark.Value); //} } sb.AppendLine (); } return sb.ToString (); } /// Gets all cultures supported by the application without the invariant language. public static List? SupportedCultures { get; private set; } = GetSupportedCultures (); internal static List GetAvailableCulturesFromEmbeddedResources () { ResourceManager rm = new (typeof (Strings)); CultureInfo [] cultures = CultureInfo.GetCultures (CultureTypes.AllCultures); return cultures.Where ( cultureInfo => !cultureInfo.Equals (CultureInfo.InvariantCulture) && rm.GetResourceSet (cultureInfo, true, false) is { } ) .ToList (); } // BUGBUG: This does not return en-US even though it's supported by default internal static List GetSupportedCultures () { CultureInfo [] cultures = CultureInfo.GetCultures (CultureTypes.AllCultures); // Get the assembly var assembly = Assembly.GetExecutingAssembly (); //Find the location of the assembly string assemblyLocation = AppDomain.CurrentDomain.BaseDirectory; // Find the resource file name of the assembly var resourceFilename = $"{assembly.GetName ().Name}.resources.dll"; if (cultures.Length > 1 && Directory.Exists (Path.Combine (assemblyLocation, "pt-PT"))) { // Return all culture for which satellite folder found with culture code. return cultures.Where ( cultureInfo => Directory.Exists (Path.Combine (assemblyLocation, cultureInfo.Name)) && File.Exists (Path.Combine (assemblyLocation, cultureInfo.Name, resourceFilename)) ) .ToList (); } // It's called from a self-contained single-file and get available cultures from the embedded resources strings. return GetAvailableCulturesFromEmbeddedResources (); } }