#nullable enable namespace Terminal.Gui; /// /// Manages ANSI Escape Sequence requests and responses. The list of /// contains the /// status of the request. Each request is identified by the terminator (e.g. ESC[8t ... t is the terminator). /// public static class EscSeqRequests { /// Gets the list. public static List Statuses { get; } = []; /// /// Adds a new request for the ANSI Escape Sequence defined by . Adds a /// instance to list. /// /// The terminator. /// The number of requests. public static void Add (string terminator, int numRequests = 1) { ArgumentException.ThrowIfNullOrEmpty (terminator); int numReq = Math.Max (numRequests, 1); lock (Statuses) { EscSeqReqStatus? found = Statuses.Find (x => x.Terminator == terminator); if (found is null) { Statuses.Add (new (terminator, numReq)); } else { found.NumRequests += numReq; found.NumOutstanding += numReq; } } } /// /// Clear the property. /// public static void Clear () { lock (Statuses) { Statuses.Clear (); } } /// /// Indicates if a with the exists in the /// list. /// /// /// if exist, otherwise. public static bool HasResponse (string terminator) { lock (Statuses) { EscSeqReqStatus? found = Statuses.Find (x => x.Terminator == terminator); return found is { }; } } /// /// Removes a request defined by . If a matching is /// found and the number of outstanding requests is greater than 0, the number of outstanding requests is decremented. /// If the number of outstanding requests is 0, the is removed from /// . /// /// The terminating string. public static void Remove (string terminator) { ArgumentException.ThrowIfNullOrEmpty (terminator); lock (Statuses) { EscSeqReqStatus? found = Statuses.Find (x => x.Terminator == terminator); if (found is null) { return; } found.NumOutstanding--; if (found.NumOutstanding == 0) { Statuses.Remove (found); } } } }