diff --git a/Dalamud/Game/Internal/DalamudAtkTweaks.cs b/Dalamud/Game/Internal/DalamudAtkTweaks.cs index 486af463c..466401ef3 100644 --- a/Dalamud/Game/Internal/DalamudAtkTweaks.cs +++ b/Dalamud/Game/Internal/DalamudAtkTweaks.cs @@ -113,7 +113,7 @@ internal sealed unsafe class DalamudAtkTweaks : IInternalDisposableService private void AtkUnitBaseReceiveGlobalEventDetour(AtkUnitBase* thisPtr, AtkEventType eventType, int eventParam, AtkEvent* atkEvent, AtkEventData* atkEventData) { // 3 == Close - if (eventType == AtkEventType.InputReceived && WindowSystem.HasAnyWindowSystemFocus && atkEventData != null && *(int*)atkEventData == 3 && this.configuration.IsFocusManagementEnabled) + if (eventType == AtkEventType.InputReceived && WindowSystem.ShouldInhibitAtkCloseEvents && atkEventData != null && *(int*)atkEventData == 3 && this.configuration.IsFocusManagementEnabled) { Log.Verbose($"Cancelling global event SendHotkey command due to WindowSystem {WindowSystem.FocusedWindowSystemNamespace}"); return; @@ -124,7 +124,7 @@ internal sealed unsafe class DalamudAtkTweaks : IInternalDisposableService private void AgentHudOpenSystemMenuDetour(AgentHUD* thisPtr, AtkValue* atkValueArgs, uint menuSize) { - if (WindowSystem.HasAnyWindowSystemFocus && this.configuration.IsFocusManagementEnabled) + if (WindowSystem.ShouldInhibitAtkCloseEvents && this.configuration.IsFocusManagementEnabled) { Log.Verbose($"Cancelling OpenSystemMenu due to WindowSystem {WindowSystem.FocusedWindowSystemNamespace}"); return; diff --git a/Dalamud/Interface/Internal/InterfaceManager.cs b/Dalamud/Interface/Internal/InterfaceManager.cs index d68bc8bef..76a1b5172 100644 --- a/Dalamud/Interface/Internal/InterfaceManager.cs +++ b/Dalamud/Interface/Internal/InterfaceManager.cs @@ -1175,6 +1175,7 @@ internal partial class InterfaceManager : IInternalDisposableService WindowSystem.HasAnyWindowSystemFocus = false; WindowSystem.FocusedWindowSystemNamespace = string.Empty; + WindowSystem.ShouldInhibitAtkCloseEvents = false; if (this.IsDispatchingEvents) { diff --git a/Dalamud/Interface/Windowing/Window.cs b/Dalamud/Interface/Windowing/Window.cs index 44ff62199..f12e87099 100644 --- a/Dalamud/Interface/Windowing/Window.cs +++ b/Dalamud/Interface/Windowing/Window.cs @@ -226,6 +226,16 @@ public abstract class Window /// public bool AllowClickthrough { get; set; } = true; + /// + /// Gets a value indicating whether this window is pinned. + /// + public bool IsPinned => this.internalIsPinned; + + /// + /// Gets a value indicating whether this window is click-through. + /// + public bool IsClickthrough => this.internalIsClickthrough; + /// /// Gets or sets a list of available title bar buttons. /// diff --git a/Dalamud/Interface/Windowing/WindowSystem.cs b/Dalamud/Interface/Windowing/WindowSystem.cs index 87bd199a1..d6e9649bb 100644 --- a/Dalamud/Interface/Windowing/WindowSystem.cs +++ b/Dalamud/Interface/Windowing/WindowSystem.cs @@ -60,6 +60,12 @@ public class WindowSystem /// public string? Namespace { get; set; } + /// + /// Gets or sets a value indicating whether ATK close events should be inhibited while any window has focus. + /// Does not respect windows that are pinned or clickthrough. + /// + internal static bool ShouldInhibitAtkCloseEvents { get; set; } + /// /// Add a window to this . /// The window system doesn't own your window, it just renders it @@ -130,7 +136,7 @@ public class WindowSystem window.DrawInternal(flags, persistence); } - var focusedWindow = this.windows.FirstOrDefault(window => window.IsFocused && window.RespectCloseHotkey); + var focusedWindow = this.windows.FirstOrDefault(window => window.IsFocused); this.HasAnyFocus = focusedWindow != default; if (this.HasAnyFocus) @@ -155,6 +161,11 @@ public class WindowSystem } } + ShouldInhibitAtkCloseEvents |= this.windows.Any(w => w.IsFocused && + w.RespectCloseHotkey && + !w.IsPinned && + !w.IsClickthrough); + if (hasNamespace) ImGui.PopID(); }