fix: always set IsFocused to false when closing a window

This commit is contained in:
goat 2021-09-02 17:31:19 +02:00
parent 395328eb17
commit 3f927ee7f0
No known key found for this signature in database
GPG key ID: F18F057873895461
4 changed files with 21 additions and 7 deletions

View file

@ -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;

View file

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

View file

@ -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;
}
/// <summary>
@ -174,6 +170,8 @@ namespace Dalamud.Interface.Windowing
{
this.internalLastIsOpen = this.internalIsOpen;
this.OnClose();
this.IsFocused = false;
}
return;

View file

@ -11,6 +11,8 @@ namespace Dalamud.Interface.Windowing
/// </summary>
public class WindowSystem
{
private static DateTimeOffset lastAnyFocus;
private readonly List<Window> windows = new();
/// <summary>
@ -28,6 +30,11 @@ namespace Dalamud.Interface.Windowing
/// </summary>
public static bool HasAnyWindowSystemFocus { get; internal set; }
/// <summary>
/// Gets the timespan since the last time any window was focused.
/// </summary>
public static TimeSpan TimeSinceLastAnyFocus => DateTimeOffset.Now - lastAnyFocus;
/// <summary>
/// Gets a value indicating whether any window in this <see cref="WindowSystem"/> 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();