public static partial class DisplayFusionFunction {
record HistoricPosition(
bool Maximized,
int Monitor,
Point Cell,
Point RowsCols,
Rectangle Pos,
int? NumKey = null,
bool? Ctrl = null
);
class ExpirableEntryList(uint Age): List<HistoricPosition> {
public uint Age { get; set; } = Age;
};
class Context: Dictionary<uint, ExpirableEntryList> {
const uint MAX_AGE = 12; // 12hrs
static readonly DateTime Epoch = new DateTime(2025, 1, 1);
static uint Now => (uint)DateTime.Now.Subtract(Epoch).TotalHours;
static uint ToKey(IntPtr whnd) => unchecked((uint)whnd.ToInt32());
public ExpirableEntryList Get(IntPtr whnd) => this.TryGetValue(ToKey(whnd), out var list) ? list : null;
public void Load() {
this.Clear();
uint now = (uint)DateTime.Now.Subtract(Epoch).TotalHours;
var dict = JsonSerializer.Deserialize<Dictionary<uint, ExpirableEntryList>>(
BFS.ScriptSettings.ReadValue("NumpadPositions.WindowHistory") ?? "{}"
);
foreach(var (Key, Value) in dict) {
if(Value.Age < now - MAX_AGE) continue; # Skip expired entries
this.Add(Key, Value);
}
}
public void AddRecord(IntPtr whnd, HistoricPosition entry) {
var list = this.Get(whnd);
if(list != null) {
list.Age = Now;
list.Add(entry);
} else {
this.Add(ToKey(whnd), new ExpirableEntryList(now) { entry });
}
BFS.ScriptSettings.WriteValue("NumpadPositions.WindowHistory", JsonSerializer.Serialize(this));
}
}
}