mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-13 12:14:16 +01:00
Let DI handle lifetime and make Plugin Service.
This commit is contained in:
parent
bd8da4bebf
commit
07a92ba025
3 changed files with 15 additions and 24 deletions
|
|
@ -151,9 +151,6 @@ internal sealed class Dalamud : IServiceType
|
||||||
// will not receive any windows messages
|
// will not receive any windows messages
|
||||||
Service<DalamudIME>.GetNullable()?.Dispose();
|
Service<DalamudIME>.GetNullable()?.Dispose();
|
||||||
|
|
||||||
// this must be done before unloading interface manager, since it relies on the window handle members.
|
|
||||||
Service<DragDropManager>.GetNullable()?.Dispose();
|
|
||||||
|
|
||||||
// this must be done before unloading plugins, or it can cause a race condition
|
// this must be done before unloading plugins, or it can cause a race condition
|
||||||
// due to rendering happening on another thread, where a plugin might receive
|
// due to rendering happening on another thread, where a plugin might receive
|
||||||
// a render call after it has been disposed, which can crash if it attempts to
|
// a render call after it has been disposed, which can crash if it attempts to
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Dalamud.Interface.Internal;
|
using Dalamud.Interface.Internal;
|
||||||
|
using Dalamud.IoC;
|
||||||
|
using Dalamud.IoC.Internal;
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
||||||
|
|
@ -12,22 +14,19 @@ namespace Dalamud.Interface.DragDrop;
|
||||||
/// A manager that keeps state of external windows drag and drop events,
|
/// A manager that keeps state of external windows drag and drop events,
|
||||||
/// and can be used to create ImGui drag and drop sources and targets for those external events.
|
/// and can be used to create ImGui drag and drop sources and targets for those external events.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[PluginInterface]
|
||||||
[ServiceManager.EarlyLoadedService]
|
[ServiceManager.EarlyLoadedService]
|
||||||
|
[InherentDependency<InterfaceManager.InterfaceManagerWithScene>]
|
||||||
internal partial class DragDropManager : IDisposable, IDragDropManager, IServiceType
|
internal partial class DragDropManager : IDisposable, IDragDropManager, IServiceType
|
||||||
{
|
{
|
||||||
private InterfaceManager? interfaceManager;
|
private readonly InterfaceManager interfaceManager = Service<InterfaceManager>.Get();
|
||||||
private int lastDropFrame = -2;
|
private int lastDropFrame = -2;
|
||||||
private int lastTooltipFrame = -1;
|
private int lastTooltipFrame = -1;
|
||||||
|
|
||||||
|
|
||||||
[ServiceManager.ServiceConstructor]
|
[ServiceManager.ServiceConstructor]
|
||||||
private DragDropManager()
|
private DragDropManager()
|
||||||
{
|
=> this.Enable();
|
||||||
Service<InterfaceManager.InterfaceManagerWithScene>.GetAsync().ContinueWith(task =>
|
|
||||||
{
|
|
||||||
this.interfaceManager = task.Result.Manager;
|
|
||||||
this.Enable();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary> Gets a value indicating whether external drag and drop is available at all. </summary>
|
/// <summary> Gets a value indicating whether external drag and drop is available at all. </summary>
|
||||||
public bool ServiceAvailable { get; private set; }
|
public bool ServiceAvailable { get; private set; }
|
||||||
|
|
@ -51,16 +50,16 @@ internal partial class DragDropManager : IDisposable, IDragDropManager, IService
|
||||||
/// <summary> Enable external drag and drop. </summary>
|
/// <summary> Enable external drag and drop. </summary>
|
||||||
public void Enable()
|
public void Enable()
|
||||||
{
|
{
|
||||||
if (this.ServiceAvailable || this.interfaceManager == null)
|
if (this.ServiceAvailable)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var ret2 = DragDropInterop.RegisterDragDrop(this.interfaceManager.WindowHandlePtr, this);
|
var ret = DragDropInterop.RegisterDragDrop(this.interfaceManager.WindowHandlePtr, this);
|
||||||
Log.Information($"[DragDrop] Registered window {this.interfaceManager.WindowHandlePtr} for external drag and drop operations. ({ret2})");
|
Log.Information($"[DragDrop] Registered window {this.interfaceManager.WindowHandlePtr} for external drag and drop operations. ({ret})");
|
||||||
Marshal.ThrowExceptionForHR(ret2);
|
Marshal.ThrowExceptionForHR(ret);
|
||||||
this.ServiceAvailable = true;
|
this.ServiceAvailable = true;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
@ -79,8 +78,9 @@ internal partial class DragDropManager : IDisposable, IDragDropManager, IService
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
DragDropInterop.RevokeDragDrop(this.interfaceManager!.WindowHandlePtr);
|
var ret = DragDropInterop.RevokeDragDrop(this.interfaceManager!.WindowHandlePtr);
|
||||||
Log.Information($"[DragDrop] Disabled external drag and drop operations for window {this.interfaceManager.WindowHandlePtr}.");
|
Log.Information($"[DragDrop] Disabled external drag and drop operations for window {this.interfaceManager.WindowHandlePtr}. ({ret})");
|
||||||
|
Marshal.ThrowExceptionForHR(ret);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,6 @@ public sealed class UiBuilder : IDisposable
|
||||||
private readonly string namespaceName;
|
private readonly string namespaceName;
|
||||||
private readonly InterfaceManager interfaceManager = Service<InterfaceManager>.Get();
|
private readonly InterfaceManager interfaceManager = Service<InterfaceManager>.Get();
|
||||||
private readonly GameFontManager gameFontManager = Service<GameFontManager>.Get();
|
private readonly GameFontManager gameFontManager = Service<GameFontManager>.Get();
|
||||||
private readonly DragDropManager dragDropManager = Service<DragDropManager>.Get();
|
|
||||||
|
|
||||||
[ServiceManager.ServiceDependency]
|
[ServiceManager.ServiceDependency]
|
||||||
private readonly DalamudConfiguration configuration = Service<DalamudConfiguration>.Get();
|
private readonly DalamudConfiguration configuration = Service<DalamudConfiguration>.Get();
|
||||||
|
|
@ -102,11 +101,6 @@ public sealed class UiBuilder : IDisposable
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event Action HideUi;
|
public event Action HideUi;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the manager for external, WinAPI-based drag and drop functionality.
|
|
||||||
/// </summary>
|
|
||||||
public IDragDropManager DragDropManager => this.dragDropManager;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the default Dalamud font based on Noto Sans CJK Medium in 17pt - supporting all game languages and icons.
|
/// Gets the default Dalamud font based on Noto Sans CJK Medium in 17pt - supporting all game languages and icons.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue