diff --git a/Dalamud/Game/Internal/DalamudAtkTweaks.cs b/Dalamud/Game/Internal/DalamudAtkTweaks.cs index 94f6d3f87..8c5059720 100644 --- a/Dalamud/Game/Internal/DalamudAtkTweaks.cs +++ b/Dalamud/Game/Internal/DalamudAtkTweaks.cs @@ -76,6 +76,8 @@ namespace Dalamud.Game.Internal private IntPtr AtkUnitBaseReceiveGlobalEventDetour(AtkUnitBase* thisPtr, ushort cmd, uint a3, IntPtr a4, uint* a5) { + Log.Information("{0}: cmd#{1} a3#{2} - HasAnyFocus:{3}", Marshal.PtrToStringAnsi(new IntPtr(thisPtr->Name)), cmd, a3, WindowSystem.HasAnyWindowSystemFocus); + // "Close Addon" if (cmd == 12 && WindowSystem.HasAnyWindowSystemFocus) return IntPtr.Zero; diff --git a/Dalamud/Interface/Internal/Windows/DataWindow.cs b/Dalamud/Interface/Internal/Windows/DataWindow.cs index b97886ba6..a831511b1 100644 --- a/Dalamud/Interface/Internal/Windows/DataWindow.cs +++ b/Dalamud/Interface/Internal/Windows/DataWindow.cs @@ -1082,6 +1082,10 @@ namespace Dalamud.Interface.Internal.Windows ImGui.Separator(); + ImGui.TextUnformatted($"WindowSystem.TimeSinceLastAnyFocus: {WindowSystem.TimeSinceLastAnyFocus.TotalMilliseconds:0}ms"); + + ImGui.Separator(); + if (ImGui.Button("Add random notification")) { var rand = new Random(); diff --git a/Dalamud/Interface/Windowing/Window.cs b/Dalamud/Interface/Windowing/Window.cs index a3a945788..8850727d2 100644 --- a/Dalamud/Interface/Windowing/Window.cs +++ b/Dalamud/Interface/Windowing/Window.cs @@ -2,6 +2,8 @@ using System.Numerics; using Dalamud.Game.ClientState.Keys; using ImGuiNET; +using Microsoft.CodeAnalysis; +using Serilog; namespace Dalamud.Interface.Windowing { @@ -109,13 +111,7 @@ namespace Dalamud.Interface.Windowing public bool IsOpen { get => this.internalIsOpen; - set - { - this.internalIsOpen = value; - - if (value == false) - this.IsFocused = false; - } + set => this.internalIsOpen = value; } /// @@ -174,6 +170,8 @@ namespace Dalamud.Interface.Windowing { this.internalLastIsOpen = this.internalIsOpen; this.OnClose(); + + this.IsFocused = false; } return; diff --git a/Dalamud/Interface/Windowing/WindowSystem.cs b/Dalamud/Interface/Windowing/WindowSystem.cs index 9b062bc1b..7f143edc3 100644 --- a/Dalamud/Interface/Windowing/WindowSystem.cs +++ b/Dalamud/Interface/Windowing/WindowSystem.cs @@ -11,6 +11,8 @@ namespace Dalamud.Interface.Windowing /// public class WindowSystem { + private static DateTimeOffset lastAnyFocus; + private readonly List windows = new(); /// @@ -28,6 +30,11 @@ namespace Dalamud.Interface.Windowing /// public static bool HasAnyWindowSystemFocus { get; internal set; } + /// + /// Gets the timespan since the last time any window was focused. + /// + public static TimeSpan TimeSinceLastAnyFocus => DateTimeOffset.Now - lastAnyFocus; + /// /// Gets a value indicating whether any window in this has focus and is /// not marked to be excluded from consideration. @@ -90,7 +97,10 @@ namespace Dalamud.Interface.Windowing this.HasAnyFocus = this.windows.Any(x => x.IsFocused && x.RespectCloseHotkey); if (this.HasAnyFocus) + { HasAnyWindowSystemFocus = true; + lastAnyFocus = DateTimeOffset.Now; + } if (hasNamespace) ImGui.PopID();