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();