Better cleanup logic

This commit is contained in:
Soreepeong 2023-12-08 23:33:35 +09:00
parent 8967174cd9
commit 2521658a98

View file

@ -32,6 +32,7 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable
private readonly nint clipboardUserDataOriginal; private readonly nint clipboardUserDataOriginal;
private readonly delegate* unmanaged<nint, byte*, void> setTextOriginal; private readonly delegate* unmanaged<nint, byte*, void> setTextOriginal;
private readonly delegate* unmanaged<nint, byte*> getTextOriginal; private readonly delegate* unmanaged<nint, byte*> getTextOriginal;
private GCHandle clipboardUserData;
[ServiceManager.ServiceConstructor] [ServiceManager.ServiceConstructor]
private ImGuiClipboardConfig(InterfaceManager.InterfaceManagerWithScene imws) private ImGuiClipboardConfig(InterfaceManager.InterfaceManagerWithScene imws)
@ -46,7 +47,7 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable
this.clipboardUserDataOriginal = io.ClipboardUserData; this.clipboardUserDataOriginal = io.ClipboardUserData;
io.SetClipboardTextFn = (nint)(delegate* unmanaged<nint, byte*, void>)(&StaticSetClipboardTextImpl); io.SetClipboardTextFn = (nint)(delegate* unmanaged<nint, byte*, void>)(&StaticSetClipboardTextImpl);
io.GetClipboardTextFn = (nint)(delegate* unmanaged<nint, byte*>)&StaticGetClipboardTextImpl; io.GetClipboardTextFn = (nint)(delegate* unmanaged<nint, byte*>)&StaticGetClipboardTextImpl;
io.ClipboardUserData = GCHandle.ToIntPtr(GCHandle.Alloc(this)); io.ClipboardUserData = GCHandle.ToIntPtr(this.clipboardUserData = GCHandle.Alloc(this));
return; return;
[UnmanagedCallersOnly] [UnmanagedCallersOnly]
@ -76,14 +77,15 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable
private void ReleaseUnmanagedResources() private void ReleaseUnmanagedResources()
{ {
var io = ImGui.GetIO(); if (!this.clipboardUserData.IsAllocated)
if (io.ClipboardUserData == default)
return; return;
GCHandle.FromIntPtr(io.ClipboardUserData).Free(); var io = ImGui.GetIO();
io.SetClipboardTextFn = (nint)this.setTextOriginal; io.SetClipboardTextFn = (nint)this.setTextOriginal;
io.GetClipboardTextFn = (nint)this.getTextOriginal; io.GetClipboardTextFn = (nint)this.getTextOriginal;
io.ClipboardUserData = this.clipboardUserDataOriginal; io.ClipboardUserData = this.clipboardUserDataOriginal;
this.clipboardUserData.Free();
} }
private void SetClipboardTextImpl(byte* text) private void SetClipboardTextImpl(byte* text)