From 2521658a984f2b605c320952745ac9eae27a8b94 Mon Sep 17 00:00:00 2001 From: Soreepeong Date: Fri, 8 Dec 2023 23:33:35 +0900 Subject: [PATCH] Better cleanup logic --- Dalamud/Interface/Internal/ImGuiClipboardConfig.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs b/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs index 5dc04d736..db47d9734 100644 --- a/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs +++ b/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs @@ -32,6 +32,7 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable private readonly nint clipboardUserDataOriginal; private readonly delegate* unmanaged setTextOriginal; private readonly delegate* unmanaged getTextOriginal; + private GCHandle clipboardUserData; [ServiceManager.ServiceConstructor] private ImGuiClipboardConfig(InterfaceManager.InterfaceManagerWithScene imws) @@ -46,7 +47,7 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable this.clipboardUserDataOriginal = io.ClipboardUserData; io.SetClipboardTextFn = (nint)(delegate* unmanaged)(&StaticSetClipboardTextImpl); io.GetClipboardTextFn = (nint)(delegate* unmanaged)&StaticGetClipboardTextImpl; - io.ClipboardUserData = GCHandle.ToIntPtr(GCHandle.Alloc(this)); + io.ClipboardUserData = GCHandle.ToIntPtr(this.clipboardUserData = GCHandle.Alloc(this)); return; [UnmanagedCallersOnly] @@ -76,14 +77,15 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable private void ReleaseUnmanagedResources() { - var io = ImGui.GetIO(); - if (io.ClipboardUserData == default) + if (!this.clipboardUserData.IsAllocated) return; - GCHandle.FromIntPtr(io.ClipboardUserData).Free(); + var io = ImGui.GetIO(); io.SetClipboardTextFn = (nint)this.setTextOriginal; io.GetClipboardTextFn = (nint)this.getTextOriginal; io.ClipboardUserData = this.clipboardUserDataOriginal; + + this.clipboardUserData.Free(); } private void SetClipboardTextImpl(byte* text)