diff --git a/docs/articles/overview-of-wrapper-and-api.md b/docs/articles/overview-of-wrapper-and-api.md index f549530..a7b30c1 100644 --- a/docs/articles/overview-of-wrapper-and-api.md +++ b/docs/articles/overview-of-wrapper-and-api.md @@ -91,6 +91,7 @@ IMaaDisposable Derived: | MaaDbgController.ctor() | `MaaDbgControllerCreate`
`MaaControllerAddSink` | | MaaPlayCoverController.ctor() | `MaaPlayCoverControllerCreate`
`MaaControllerAddSink` | | MaaGamepadController.ctor() | `MaaGamepadControllerCreate`
`MaaControllerAddSink` | +| MaaWlRootsController.ctor() | `MaaWlRootsControllerCreate`
`MaaControllerAddSink` | | IDisposable.Dispose() | `MaaControllerDestroy` | | IMaaOption.SetOption() | `MaaControllerSetOption` | | IMaaController.LinkStart() | `MaaControllerPostConnection` | @@ -105,6 +106,7 @@ IMaaDisposable Derived: | IMaaController.TouchUp() | `MaaControllerPostTouchUp` | | IMaaController.Screencap() | `MaaControllerPostScreencap` | | IMaaController.Scroll() | `MaaControllerPostScroll` | +| IMaaController.Inactive() | `MaaControllerPostInactive` | | IMaaController.Shell() | `MaaControllerPostShell` | | IMaaController.GetShellOutput() | `MaaControllerGetShellOutput` | | IMaaPost.GetStatus() | `MaaControllerStatus` | @@ -113,6 +115,7 @@ IMaaDisposable Derived: | IMaaController.GetCachedImage() | `MaaControllerCachedImage` | | IMaaController.Uuid | `MaaControllerGetUuid` | | IMaaController.GetResolution() | `MaaControllerGetResolution` | +| IMaaController.Info | `MaaControllerGetInfo` | | IMaaDisposableHandle.Handle | *The MaaControllerHandle.* | ## MaaTasker : IMaaTasker diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 06c12fa..7a57581 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -5,7 +5,7 @@ - + diff --git a/src/MaaFramework.Binding.Extensions/Notification/NotificationDetail.cs b/src/MaaFramework.Binding.Extensions/Notification/NotificationDetail.cs index 5304dea..eee2e60 100644 --- a/src/MaaFramework.Binding.Extensions/Notification/NotificationDetail.cs +++ b/src/MaaFramework.Binding.Extensions/Notification/NotificationDetail.cs @@ -16,7 +16,8 @@ public record ControllerActionDetail( [property: JsonPropertyName("ctrl_id")] int ControllerId, [property: JsonPropertyName("uuid")] string Uuid, [property: JsonPropertyName("action")] string Action, - [property: JsonPropertyName("param")] JsonElement Param + [property: JsonPropertyName("param")] JsonElement Param, + [property: JsonPropertyName("info")] JsonElement Info ); /// diff --git a/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaController.cs b/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaController.cs index 6e0acd5..e128ac7 100644 --- a/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaController.cs +++ b/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaController.cs @@ -99,6 +99,9 @@ public static partial class MaaController [LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)] public static partial MaaCtrlId MaaControllerPostScroll(MaaControllerHandle ctrl, int dx, int dy); + [LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)] + public static partial MaaCtrlId MaaControllerPostInactive(MaaControllerHandle ctrl); + [LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)] public static partial MaaCtrlId MaaControllerPostShell(MaaControllerHandle ctrl, string cmd, long timeout); @@ -109,6 +112,9 @@ public static partial class MaaController [LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)] public static partial MaaControllerHandle MaaPlayCoverControllerCreate(string address, string uuid); + [LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)] + public static partial MaaControllerHandle MaaWlRootsControllerCreate(string wlr_socket_path); + /// /// Create a virtual gamepad controller for Windows. /// @@ -154,6 +160,10 @@ public static partial class MaaController [return: MarshalAs(UnmanagedType.U1)] public static partial bool MaaControllerGetResolution(MaaControllerHandle ctrl, out int width, out int height); + [LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool MaaControllerGetInfo(MaaControllerHandle ctrl, MaaStringBufferHandle buffer); + [Obsolete] [LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)] public static partial MaaCtrlId MaaControllerPostPressKey(MaaControllerHandle ctrl, int keycode); diff --git a/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaCustomController.cs b/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaCustomController.cs index 2e6b535..db9981e 100644 --- a/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaCustomController.cs +++ b/src/MaaFramework.Binding.Native/Interop/Framework/Instance/MaaCustomController.cs @@ -110,6 +110,8 @@ private sealed class Delegates(IMaaCustomController managed) public KeyDownDelegate KeyDown = (int keycode, nint transArg) => managed.KeyDown(keycode); public KeyUpDelegate KeyUp = (int keycode, nint transArg) => managed.KeyUp(keycode); public ScrollDelegate Scroll = (int dx, int dy, nint transArg) => managed.Scroll(dx, dy); + public InactiveDelegate Inactive = (nint transArg) => managed.Inactive(); + public GetInfoDelegate GetInfo = (nint transArg, MaaStringBufferHandle buffer) => managed.GetInfo(new MaaStringBuffer(buffer)); }; /// @@ -139,6 +141,8 @@ private sealed class Unmanaged(Delegates delegates) public nint KeyDown = Marshal.GetFunctionPointerForDelegate(delegates.KeyDown); public nint KeyUp = Marshal.GetFunctionPointerForDelegate(delegates.KeyUp); public nint Scroll = Marshal.GetFunctionPointerForDelegate(delegates.Scroll); + public nint Inactive = Marshal.GetFunctionPointerForDelegate(delegates.Inactive); + public nint GetInfo = Marshal.GetFunctionPointerForDelegate(delegates.GetInfo); } [return: MarshalAs(UnmanagedType.U1)] @@ -213,4 +217,12 @@ private sealed class Unmanaged(Delegates delegates) [return: MarshalAs(UnmanagedType.U1)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate bool ScrollDelegate(int dx, int dy, nint transArg); + + [return: MarshalAs(UnmanagedType.U1)] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate bool InactiveDelegate(nint transArg); + + [return: MarshalAs(UnmanagedType.U1)] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate bool GetInfoDelegate(nint transArg, MaaStringBufferHandle buffer); } diff --git a/src/MaaFramework.Binding.Native/MaaController.cs b/src/MaaFramework.Binding.Native/MaaController.cs index b4a693c..47766e2 100644 --- a/src/MaaFramework.Binding.Native/MaaController.cs +++ b/src/MaaFramework.Binding.Native/MaaController.cs @@ -196,6 +196,13 @@ public MaaJob Screencap() public MaaJob Scroll(int dx, int dy) => CreateJob(MaaControllerPostScroll(Handle, dx, dy)); + /// + /// + /// Wrapper of . + /// + public MaaJob Inactive() + => CreateJob(MaaControllerPostInactive(Handle)); + /// /// /// Wrapper of . @@ -287,4 +294,17 @@ public string? Uuid /// public bool GetResolution(out int width, out int height) => MaaControllerGetResolution(Handle, out width, out height); + + /// + /// + /// Wrapper of . + /// + public string? Info + { + get + { + _ = MaaStringBuffer.TryGetValue(out var info, h => MaaControllerGetInfo(Handle, h)); + return info; + } + } } diff --git a/src/MaaFramework.Binding.Native/MaaController/MaaWlRootsController.cs b/src/MaaFramework.Binding.Native/MaaController/MaaWlRootsController.cs new file mode 100644 index 0000000..881234b --- /dev/null +++ b/src/MaaFramework.Binding.Native/MaaController/MaaWlRootsController.cs @@ -0,0 +1,48 @@ +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using static MaaFramework.Binding.Interop.Native.MaaController; + +namespace MaaFramework.Binding; + +/// +/// A wrapper class providing a reference implementation for . +/// +[DebuggerDisplay("{DebuggerDisplay,nq}")] +public class MaaWlRootsController : MaaController +{ +#pragma warning disable IDE0032 // 使用自动属性 + private readonly string _debugWlrSocketPath; +#pragma warning restore IDE0032 // 使用自动属性 + + [ExcludeFromCodeCoverage(Justification = "Debugger display.")] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private string DebuggerDisplay => IsInvalid + ? $"Invalid {GetType().Name}" + : $"{GetType().Name} {{ WlrSocketPath = {_debugWlrSocketPath} }}"; + + /// + /// Creates a instance. + /// + /// The wayland socket path (e.g., "/run/user/1000/wayland-0"). + /// Executes if ; otherwise, not link. + /// Checks LinkStart().Wait() status if ; otherwise, not check. + /// + /// Wrapper of . + /// This controller is designed for wlroots on Linux. + /// + /// + /// + public MaaWlRootsController(string wlrSocketPath, LinkOption link = LinkOption.Start, CheckStatusOption check = CheckStatusOption.ThrowIfNotSucceeded) + { + ArgumentException.ThrowIfNullOrEmpty(wlrSocketPath); + + var handle = MaaWlRootsControllerCreate(wlrSocketPath); + _ = MaaControllerAddSink(handle, MaaEventCallback, (nint)MaaHandleType.Controller); + SetHandle(handle, needReleased: true); + + _debugWlrSocketPath = wlrSocketPath; + + if (link == LinkOption.Start) + LinkStartOnConstructed(check, wlrSocketPath); + } +} diff --git a/src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/README.md b/src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/README.md similarity index 100% rename from src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/README.md rename to src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/README.md diff --git a/src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/det.onnx b/src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/det.onnx similarity index 100% rename from src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/det.onnx rename to src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/det.onnx diff --git a/src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/keys.txt b/src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/keys.txt similarity index 100% rename from src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/keys.txt rename to src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/keys.txt diff --git a/src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/rec.onnx b/src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/rec.onnx similarity index 100% rename from src/MaaFramework.Binding.UnitTests/SampleResource/model/ocr/rec.onnx rename to src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/model/ocr/rec.onnx diff --git a/src/MaaFramework.Binding.UnitTests/SampleResource/pipeline/sample.json b/src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/pipeline/sample.json similarity index 100% rename from src/MaaFramework.Binding.UnitTests/SampleResource/pipeline/sample.json rename to src/MaaFramework.Binding.UnitTests/SampleResource/a_bundle/pipeline/sample.json diff --git a/src/MaaFramework.Binding.UnitTests/SampleResource/properties.json b/src/MaaFramework.Binding.UnitTests/SampleResource/properties.json deleted file mode 100644 index bfbfe52..0000000 --- a/src/MaaFramework.Binding.UnitTests/SampleResource/properties.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "is_base": true -} diff --git a/src/MaaFramework.Binding.UnitTests/Test_Buffers.cs b/src/MaaFramework.Binding.UnitTests/Test_Buffers.cs index 5a55864..c48a305 100644 --- a/src/MaaFramework.Binding.UnitTests/Test_Buffers.cs +++ b/src/MaaFramework.Binding.UnitTests/Test_Buffers.cs @@ -281,8 +281,8 @@ public void Test_IMaaImageBuffer(MaaTypes type, IMaaImageBuffer buffer) CollectionAssert.AreEqual( encodedDataArray, funcArray); - Assert.IsTrue(img.Buffer.TryGetEncodedData(out encodedDataStream) - && img.Buffer.TryGetEncodedData(out encodedDataSpan)); + Assert.IsTrue(buffer.TryGetEncodedData(out encodedDataStream) + && buffer.TryGetEncodedData(out encodedDataSpan)); Assert.IsTrue( MaaImageBuffer.TrySetEncodedData(encodedDataStream, handle => MaaImageBuffer.TryGetEncodedData(handle, out funcArray))); diff --git a/src/MaaFramework.Binding.UnitTests/Test_Common.cs b/src/MaaFramework.Binding.UnitTests/Test_Common.cs index 00360dc..d0cbbd2 100644 --- a/src/MaaFramework.Binding.UnitTests/Test_Common.cs +++ b/src/MaaFramework.Binding.UnitTests/Test_Common.cs @@ -17,10 +17,10 @@ static Common() internal static string Address { get; set; } = string.Empty; internal static string DebugPath { get; set; } = Path.GetFullPath("./debug"); - internal static string BundlePath { get; set; } = Path.GetFullPath("./SampleResource"); + internal static string BundlePath { get; set; } = Path.GetFullPath("./SampleResource/a_bundle"); internal static string AgentPath { get; set; } = Path.GetFullPath($"./MaaAgentBinary"); - internal static string AdbConfig { get; set; } = File.ReadAllText(Path.GetFullPath($"{BundlePath}/controller_config.json")); - internal static string ImagePath { get; set; } = Path.Join(BundlePath, "empty_1920x1080.png"); + internal static string AdbConfig { get; set; } = File.ReadAllText(Path.GetFullPath($"./SampleResource/controller_config.json")); + internal static string ImagePath { get; set; } = Path.GetFullPath("./SampleResource/empty_1920x1080.png"); private static void InitializeInfo(TestContext testContext) { diff --git a/src/MaaFramework.Binding.UnitTests/Test_Custom.cs b/src/MaaFramework.Binding.UnitTests/Test_Custom.cs index 59d40a3..fa9569e 100644 --- a/src/MaaFramework.Binding.UnitTests/Test_Custom.cs +++ b/src/MaaFramework.Binding.UnitTests/Test_Custom.cs @@ -1,6 +1,7 @@ using MaaFramework.Binding.Abstractions; using MaaFramework.Binding.Buffers; using MaaFramework.Binding.Custom; +using System.Text.Json; namespace MaaFramework.Binding.UnitTests; @@ -45,11 +46,41 @@ public bool Analyze(T context, in AnalyzeArgs args, in AnalyzeResults results Assert.AreEqual(RecognitionParam, args.RecognitionParam); var cloneContext = (context as ICloneable).Clone() as IMaaContext; - cloneContext = cloneContext?.Clone(); + cloneContext = cloneContext!.Clone(); #if MAA_NATIVE - cloneContext = (cloneContext as MaaContext)?.Clone(); + cloneContext = (cloneContext as MaaContext)!.Clone(); #endif Assert.IsNotNull(cloneContext); + + Assert.IsFalse( + context.IsCancellationRequested); + Assert.IsTrue( + context.WaitFreezes(TimeSpan.FromSeconds(1))); + + Assert.IsFalse( + context.GetAnchor(DefaultAnchorName, out var nodeName)); + Assert.IsNull( + nodeName); + Assert.IsTrue( + context.SetAnchor(DefaultAnchorName, DefaultAnchorNodeName)); + Assert.IsTrue( + context.GetAnchor(DefaultAnchorName, out nodeName)); + Assert.AreEqual( + DefaultAnchorNodeName, nodeName); + + Assert.IsNotNull( + context.RunTask(DefaultAnchorNodeName)); + Assert.IsTrue( + context.GetHitCount(DefaultAnchorNodeName, out var hitCount)); + Assert.AreNotEqual( + 0, hitCount); + Assert.IsTrue( + context.ClearHitCount(DefaultAnchorNodeName)); + Assert.IsTrue( + context.GetHitCount(DefaultAnchorNodeName, out hitCount)); + Assert.AreEqual( + 0, hitCount); + Assert.IsNull( cloneContext.RunRecognition(DiffEntry, args.Image)); if (!context.Tasker.IsStateless) @@ -73,6 +104,11 @@ public bool Analyze(T context, in AnalyzeArgs args, in AnalyzeResults results recognitionDetail?.HitBox); + using var recoDirectDetail = + context.RunRecognitionDirect(RecoDirectType, RecoDirectParam, args.Image); + Assert.IsNotNull( + recoDirectDetail?.HitBox); + Assert.IsTrue( cloneContext.OverridePipeline(DiffParam)); Assert.AreEqual( @@ -90,8 +126,21 @@ public bool Analyze(T context, in AnalyzeArgs args, in AnalyzeResults results Assert.IsTrue( cloneContext.GetNodeData(DiffEntry, out data)); Assert.IsNotNull(data); - Assert.IsTrue( - data.Contains($"\"next\":[\"{DiffEntry}\"]")); + + using var document = JsonDocument.Parse(data); + var root = document.RootElement; + Assert.IsTrue(root.TryGetProperty("next", out var nextElement), + "Expected JSON to contain a 'next' property."); + Assert.AreEqual(JsonValueKind.Array, nextElement.ValueKind, + "Expected 'next' to be a JSON array."); + var containsDiffEntry = nextElement + .EnumerateArray() + .Any(element => + element.ValueKind == JsonValueKind.Object && + element.TryGetProperty("name", out var nameProperty) && + nameProperty.GetString() == DiffEntry); + Assert.IsTrue(containsDiffEntry, + $"Expected 'next' array to contain an element with name '{DiffEntry}'."); Assert.IsTrue( @@ -100,7 +149,7 @@ public bool Analyze(T context, in AnalyzeArgs args, in AnalyzeResults results results.Detail.TrySetValue(recognitionDetail.Detail)); // return ret; - // Using in assert + // Assert in other testings Detail = recognitionDetail.Detail; Box = $"{results.Box.X}{results.Box.Y}{results.Box.Width}{results.Box.Height}"; @@ -120,6 +169,21 @@ public bool Analyze(T context, in AnalyzeArgs args, in AnalyzeResults results } """; + internal const string RecoDirectType = "ColorMatch"; + internal const string RecoDirectParam = """ + { + "recognition": "ColorMatch", + "lower": [100, 100, 100], + "upper": [255, 255, 255] + } + """; + + internal const string ActionDirectType = "Click"; + internal const string ActionDirectParam = "{}"; + + internal const string DefaultAnchorName = "DefaultAnchorName"; + internal const string DefaultAnchorNodeName = "EmptyNode"; + internal sealed class TestAction : IMaaCustomAction { public string Name { get; set; } = nameof(TestAction); @@ -136,6 +200,11 @@ public bool Run(T context, in RunArgs args, in RunResults results) where T : context.RunAction(DiffEntry, args.RecognitionBox, args.RecognitionDetail.Detail, DiffParam); Assert.IsNotNull( actionDetail); + + using var actionDirectDetail = + context.RunActionDirect(ActionDirectType, ActionDirectParam, args.RecognitionBox, args.RecognitionDetail.Detail); + Assert.IsNotNull( + actionDirectDetail); return true; } } @@ -232,6 +301,13 @@ public bool KeyUp(int keycode) => c.KeyUp(keycode).Wait().IsSucceeded(); public bool Scroll(int dx, int dy) => c.Scroll(dx, dy).Wait().IsSucceeded(); + public bool Inactive() + => c.Inactive().Wait().IsSucceeded(); + public bool GetInfo(IMaaStringBuffer buffer) + { + var info = c.Info; + return info is not null && buffer.TrySetValue(info); + } } internal sealed class TestInvalidResource : IMaaCustom diff --git a/src/MaaFramework.Binding.UnitTests/Test_IMaaController.cs b/src/MaaFramework.Binding.UnitTests/Test_IMaaController.cs index d30be76..32171cd 100644 --- a/src/MaaFramework.Binding.UnitTests/Test_IMaaController.cs +++ b/src/MaaFramework.Binding.UnitTests/Test_IMaaController.cs @@ -364,20 +364,33 @@ public void Interface_Uuid(MaaTypes type, IMaaController maaController) } [TestMethod] - [MaaData(MaaTypes.All, nameof(Data), true, "echo hello", 20000)] - public void Interface_Shell_ShellOutput(MaaTypes type, IMaaController maaController, bool assertSuccess, string cmd, long timeout) + [MaaData(MaaTypes.All, nameof(Data), "echo hello", 20000)] + public void Interface_Shell_ShellOutput(MaaTypes type, IMaaController maaController, string cmd, long timeout) { Assert.IsNotNull(maaController); var job = maaController.Shell(cmd, timeout); - Interface_IMaaPost(assertSuccess, job); + if (maaController is MaaAdbController) + { + Interface_IMaaPost_Success(job); - Assert.IsTrue( - maaController.GetShellOutput(out var output)); - Assert.IsNotNull( - output); - Assert.Contains( - "hello", output); + Assert.IsTrue( + maaController.GetShellOutput(out var output)); + Assert.IsNotNull( + output); + Assert.Contains( + "hello", output); + } + else + { + Interface_IMaaPost_Failed(job); + Assert.IsTrue( + maaController.GetShellOutput(out var output)); + Assert.IsNotNull( + output); + Assert.AreEqual( + string.Empty, output); + } } #region Invalid data tests diff --git a/src/MaaFramework.Binding.UnitTests/Test_IMaaResource.cs b/src/MaaFramework.Binding.UnitTests/Test_IMaaResource.cs index aefe178..6b19edb 100644 --- a/src/MaaFramework.Binding.UnitTests/Test_IMaaResource.cs +++ b/src/MaaFramework.Binding.UnitTests/Test_IMaaResource.cs @@ -1,6 +1,7 @@ using MaaFramework.Binding.Abstractions; using MaaFramework.Binding.Buffers; using MaaFramework.Binding.Notification; +using System.Text.Json; namespace MaaFramework.Binding.UnitTests; @@ -126,11 +127,22 @@ public void Interface_OverridePipeline_OverrideNext_GetNodeData(MaaTypes type, I maaResource.OverrideNext(DiffEntry, [DiffEntry])); Assert.IsTrue( maaResource.GetNodeData(DiffEntry, out var data)); - - Assert.IsNotNull( - data); - Assert.IsTrue( - data.Contains($"\"next\":[\"{DiffEntry}\"]")); + Assert.IsNotNull(data); + + using var document = JsonDocument.Parse(data); + var root = document.RootElement; + Assert.IsTrue(root.TryGetProperty("next", out var nextElement), + "Expected JSON to contain a 'next' property."); + Assert.AreEqual(JsonValueKind.Array, nextElement.ValueKind, + "Expected 'next' to be a JSON array."); + var containsDiffEntry = nextElement + .EnumerateArray() + .Any(element => + element.ValueKind == JsonValueKind.Object && + element.TryGetProperty("name", out var nameProperty) && + nameProperty.GetString() == DiffEntry); + Assert.IsTrue(containsDiffEntry, + $"Expected 'next' array to contain an element with name '{DiffEntry}'."); } [TestMethod] diff --git a/src/MaaFramework.Binding.UnitTests/packages.lock.json b/src/MaaFramework.Binding.UnitTests/packages.lock.json index 6544ab4..dc3e3a7 100644 --- a/src/MaaFramework.Binding.UnitTests/packages.lock.json +++ b/src/MaaFramework.Binding.UnitTests/packages.lock.json @@ -45,33 +45,33 @@ }, "Maa.Framework.Runtime.linux-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "WkHvm/NwCPXNu79049RC67aYTfyyQ7NejJWCKac7Tv8OB28DAbGbAovqOKHPxKP2GM8f37EJyE4Sur32DMB8ZA==" + "resolved": "5.8.1", + "contentHash": "ZmGWlMnxFLQ3IQPRJ2ivgPu09ufFp4x3hRD4gQmB7SShNHa5RXDCDp+Iih6W+5v1SY+1sq3xLbD0yiMAzsAcZg==" }, "Maa.Framework.Runtime.linux-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "5C761AldXHPliilRMMmXA3c9ojxYhtIvFZ21RYBuT9E3tVQUO51WIVfHpDpyArvoaSMKfe/qXZNG4toeE9K/Qw==" + "resolved": "5.8.1", + "contentHash": "5OfYvM3DKUqO567Rbsw1vXSdeVHykG4c8kGH37i2etbNBCRkBrsgYCtAFldHQryZGMcC8WKwnCg7wE4RbZCRGg==" }, "Maa.Framework.Runtime.osx-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "tMr6B3uNlD/dbjfC8Ac9VQWE2xJfTHQyqAIyD5HWxam6qiFjcsa1JVj53gMhf9d8+HXjx1iSmCIVIP57Mvxw4w==" + "resolved": "5.8.1", + "contentHash": "bA0TqJuJFkg7qIRyGMYpE8u1SSDOYmXgAEiF01ORP+3jgMLaUD6DtpoQoPkGrLs5AE5JDZg0soImznTJOJUZkQ==" }, "Maa.Framework.Runtime.osx-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "DJFamv6Xd3DgGQg/Oig6iBLLwFVpK38Dp50CnKR7WdppnC08tq57wQuykqQOapUm/oGmLRgO8O2mlOSGcUSWkg==" + "resolved": "5.8.1", + "contentHash": "JTcAfsmGUE2FVhR3oFZe1t66W/yKQZMHkQbSA8I2FLU/irjHm6dl5LMgPEevDu9aNwpqvpZ1Mj3VxtMaTUW6PA==" }, "Maa.Framework.Runtime.win-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "vkANhfQVJJohKjgHWrFa32WDlL6OrahmvZaFquH+kvuSxihfNDS5E578iEPp012eH5DAtZYnE/KegPwcY7zuQw==" + "resolved": "5.8.1", + "contentHash": "JJm0C0bLgNCk4RMm+vytHuw9LAjhi9VXJKHYXUkSfwb06CVFyOCOBQ9IJ0y3TncoBDdMceqj4LASTVGASBzIVg==" }, "Maa.Framework.Runtime.win-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "kF8895AF7im/WjsHXFUORhWub7kW4YxfS6yQ782O+YcKnTW4kYhWW2ZT4WtDI4M3SH8bcyTI5gyrZZUk7fTN2g==" + "resolved": "5.8.1", + "contentHash": "4gXP+p7xyeW2m8Og89TNJ57SaEFe1TTQ6gku/ytezhbYXxuHkb4caVcW1+uY8l7t39rwq1r0vfCAXqy8aK3pig==" }, "Microsoft.ApplicationInsights": { "type": "Transitive", @@ -174,7 +174,7 @@ "type": "Project", "dependencies": { "Maa.Framework.Native": "[1.0.0-dev, )", - "Maa.Framework.Runtimes": "[5.6.0, )" + "Maa.Framework.Runtimes": "[5.8.1, )" } }, "Maa.Framework.Binding": { @@ -207,16 +207,16 @@ }, "Maa.Framework.Runtimes": { "type": "CentralTransitive", - "requested": "[5.6.0, )", - "resolved": "5.6.0", - "contentHash": "tudf2vMWH5KRGLVn+j9T6eaK1cRhjtANGnzGOaIu/v7BzDAeyaoqxJPd8DMd7FtdZNfT/6Q13j250CbuoArdag==", + "requested": "[5.8.1, )", + "resolved": "5.8.1", + "contentHash": "D5FxCNgUEfdKLrrSdP/cQ8AAiXwcBJsskODDTWKnZNR+QE8je5jicSRbviodE5XCmx28x4nlOK6yMayCPGen0Q==", "dependencies": { - "Maa.Framework.Runtime.linux-arm64": "5.6.0", - "Maa.Framework.Runtime.linux-x64": "5.6.0", - "Maa.Framework.Runtime.osx-arm64": "5.6.0", - "Maa.Framework.Runtime.osx-x64": "5.6.0", - "Maa.Framework.Runtime.win-arm64": "5.6.0", - "Maa.Framework.Runtime.win-x64": "5.6.0" + "Maa.Framework.Runtime.linux-arm64": "5.8.1", + "Maa.Framework.Runtime.linux-x64": "5.8.1", + "Maa.Framework.Runtime.osx-arm64": "5.8.1", + "Maa.Framework.Runtime.osx-x64": "5.8.1", + "Maa.Framework.Runtime.win-arm64": "5.8.1", + "Maa.Framework.Runtime.win-x64": "5.8.1" } } }, @@ -264,33 +264,33 @@ }, "Maa.Framework.Runtime.linux-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "WkHvm/NwCPXNu79049RC67aYTfyyQ7NejJWCKac7Tv8OB28DAbGbAovqOKHPxKP2GM8f37EJyE4Sur32DMB8ZA==" + "resolved": "5.8.1", + "contentHash": "ZmGWlMnxFLQ3IQPRJ2ivgPu09ufFp4x3hRD4gQmB7SShNHa5RXDCDp+Iih6W+5v1SY+1sq3xLbD0yiMAzsAcZg==" }, "Maa.Framework.Runtime.linux-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "5C761AldXHPliilRMMmXA3c9ojxYhtIvFZ21RYBuT9E3tVQUO51WIVfHpDpyArvoaSMKfe/qXZNG4toeE9K/Qw==" + "resolved": "5.8.1", + "contentHash": "5OfYvM3DKUqO567Rbsw1vXSdeVHykG4c8kGH37i2etbNBCRkBrsgYCtAFldHQryZGMcC8WKwnCg7wE4RbZCRGg==" }, "Maa.Framework.Runtime.osx-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "tMr6B3uNlD/dbjfC8Ac9VQWE2xJfTHQyqAIyD5HWxam6qiFjcsa1JVj53gMhf9d8+HXjx1iSmCIVIP57Mvxw4w==" + "resolved": "5.8.1", + "contentHash": "bA0TqJuJFkg7qIRyGMYpE8u1SSDOYmXgAEiF01ORP+3jgMLaUD6DtpoQoPkGrLs5AE5JDZg0soImznTJOJUZkQ==" }, "Maa.Framework.Runtime.osx-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "DJFamv6Xd3DgGQg/Oig6iBLLwFVpK38Dp50CnKR7WdppnC08tq57wQuykqQOapUm/oGmLRgO8O2mlOSGcUSWkg==" + "resolved": "5.8.1", + "contentHash": "JTcAfsmGUE2FVhR3oFZe1t66W/yKQZMHkQbSA8I2FLU/irjHm6dl5LMgPEevDu9aNwpqvpZ1Mj3VxtMaTUW6PA==" }, "Maa.Framework.Runtime.win-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "vkANhfQVJJohKjgHWrFa32WDlL6OrahmvZaFquH+kvuSxihfNDS5E578iEPp012eH5DAtZYnE/KegPwcY7zuQw==" + "resolved": "5.8.1", + "contentHash": "JJm0C0bLgNCk4RMm+vytHuw9LAjhi9VXJKHYXUkSfwb06CVFyOCOBQ9IJ0y3TncoBDdMceqj4LASTVGASBzIVg==" }, "Maa.Framework.Runtime.win-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "kF8895AF7im/WjsHXFUORhWub7kW4YxfS6yQ782O+YcKnTW4kYhWW2ZT4WtDI4M3SH8bcyTI5gyrZZUk7fTN2g==" + "resolved": "5.8.1", + "contentHash": "4gXP+p7xyeW2m8Og89TNJ57SaEFe1TTQ6gku/ytezhbYXxuHkb4caVcW1+uY8l7t39rwq1r0vfCAXqy8aK3pig==" }, "Microsoft.ApplicationInsights": { "type": "Transitive", @@ -401,7 +401,7 @@ "type": "Project", "dependencies": { "Maa.Framework.Native": "[1.0.0-dev, )", - "Maa.Framework.Runtimes": "[5.6.0, )" + "Maa.Framework.Runtimes": "[5.8.1, )" } }, "Maa.Framework.Binding": { @@ -434,16 +434,16 @@ }, "Maa.Framework.Runtimes": { "type": "CentralTransitive", - "requested": "[5.6.0, )", - "resolved": "5.6.0", - "contentHash": "tudf2vMWH5KRGLVn+j9T6eaK1cRhjtANGnzGOaIu/v7BzDAeyaoqxJPd8DMd7FtdZNfT/6Q13j250CbuoArdag==", + "requested": "[5.8.1, )", + "resolved": "5.8.1", + "contentHash": "D5FxCNgUEfdKLrrSdP/cQ8AAiXwcBJsskODDTWKnZNR+QE8je5jicSRbviodE5XCmx28x4nlOK6yMayCPGen0Q==", "dependencies": { - "Maa.Framework.Runtime.linux-arm64": "5.6.0", - "Maa.Framework.Runtime.linux-x64": "5.6.0", - "Maa.Framework.Runtime.osx-arm64": "5.6.0", - "Maa.Framework.Runtime.osx-x64": "5.6.0", - "Maa.Framework.Runtime.win-arm64": "5.6.0", - "Maa.Framework.Runtime.win-x64": "5.6.0" + "Maa.Framework.Runtime.linux-arm64": "5.8.1", + "Maa.Framework.Runtime.linux-x64": "5.8.1", + "Maa.Framework.Runtime.osx-arm64": "5.8.1", + "Maa.Framework.Runtime.osx-x64": "5.8.1", + "Maa.Framework.Runtime.win-arm64": "5.8.1", + "Maa.Framework.Runtime.win-x64": "5.8.1" } } } diff --git a/src/MaaFramework.Binding/Custom/IMaaCustomController.cs b/src/MaaFramework.Binding/Custom/IMaaCustomController.cs index 2387f80..1948fee 100644 --- a/src/MaaFramework.Binding/Custom/IMaaCustomController.cs +++ b/src/MaaFramework.Binding/Custom/IMaaCustomController.cs @@ -35,4 +35,10 @@ public interface IMaaCustomController : IMaaCustom, IDisposable bool KeyDown(int keycode); bool KeyUp(int keycode); bool Scroll(int dx, int dy); + bool Inactive(); + + /// + /// Optional, Write result (JSON string) to buffer. + /// + bool GetInfo(IMaaStringBuffer buffer); } diff --git a/src/MaaFramework.Binding/Enums/Controllers/Win32InputMethod.cs b/src/MaaFramework.Binding/Enums/Controllers/Win32InputMethod.cs index 1190406..33cbfb5 100644 --- a/src/MaaFramework.Binding/Enums/Controllers/Win32InputMethod.cs +++ b/src/MaaFramework.Binding/Enums/Controllers/Win32InputMethod.cs @@ -17,20 +17,24 @@ namespace MaaFramework.Binding; /// No bitwise OR, select ONE method only. /// No default value. Client should choose one as default. /// Different applications process input differently, there is no universal solution. -/// | Method | Compatibility | Require Admin | Seize Mouse | Background Support | Notes | -/// |--------------------------|---------------|---------------|--------------|--------------------|------------------------------------| -/// | Seize | High | No | Yes | No | | -/// | SendMessage | Medium | Maybe | No | Yes | | -/// | PostMessage | Medium | Maybe | No | Yes | | -/// | LegacyEvent | Low | No | Yes | No | | -/// | PostThreadMessage | Low | Maybe | No | Yes | | -/// | SendMessageWithCursorPos | Medium | Maybe | Briefly | Yes | Designed for apps that check real cursor position | -/// | PostMessageWithCursorPos | Medium | Maybe | Briefly | Yes | Designed for apps that check real cursor position | +/// | Method | Compatibility | Require Admin | Seize Mouse | Background Support | Notes | +/// |--------------------------|---------------|---------------|--------------|--------------------|------------------------------------------| +/// | Seize | High | No | Yes | No | | +/// | SendMessage | Medium | Maybe | No | Yes | | +/// | PostMessage | Medium | Maybe | No | Yes | | +/// | LegacyEvent | Low | No | Yes | No | | +/// | PostThreadMessage | Low | Maybe | No | Yes | | +/// | SendMessageWithCursorPos | Medium | Maybe | Briefly | Yes | Moves cursor to target position, then restores | +/// | PostMessageWithCursorPos | Medium | Maybe | Briefly | Yes | Moves cursor to target position, then restores | +/// | SendMessageWithWindowPos | Medium | Maybe | No | Yes | Moves window to align target with cursor, then restores | +/// | PostMessageWithWindowPos | Medium | Maybe | No | Yes | Moves window to align target with cursor, then restores | /// Note: /// - Admin rights mainly depend on the target application's privilege level. /// If the target runs as admin, MaaFramework should also run as admin for compatibility. /// - "WithCursorPos" methods briefly move the cursor to target position, send message, /// then restore cursor position. This "briefly" seizes the mouse but won't block user operations. +/// - "WithWindowPos" methods briefly move the window so the target aligns with the current cursor +/// position, send message, then restore the window position. The cursor is not moved. /// public enum Win32InputMethod : System.UInt64 { @@ -42,5 +46,7 @@ public enum Win32InputMethod : System.UInt64 PostThreadMessage = (1 << 4), SendMessageWithCursorPos = (1 << 5), PostMessageWithCursorPos = (1 << 6), + SendMessageWithWindowPos = (1 << 7), + PostMessageWithWindowPos = (1 << 8), } diff --git a/src/MaaFramework.Binding/Enums/Controllers/Win32ScreencapMethod.cs b/src/MaaFramework.Binding/Enums/Controllers/Win32ScreencapMethod.cs index 63a9bfe..0995c18 100644 --- a/src/MaaFramework.Binding/Enums/Controllers/Win32ScreencapMethod.cs +++ b/src/MaaFramework.Binding/Enums/Controllers/Win32ScreencapMethod.cs @@ -25,7 +25,10 @@ namespace MaaFramework.Binding; /// | DXGI_DesktopDup_Window | Very Fast | Low | No | No | Desktop duplication then crop | /// | PrintWindow | Medium | Medium | No | Yes | | /// | ScreenDC | Fast | High | No | No | | -/// Note: When a window is minimized on Windows, all screencap methods will fail. Avoid minimizing the target window. +/// Note: FramePool and PrintWindow support pseudo-minimize — when the target window +/// is minimized, they make it transparent and click-through, then restore it without +/// activation, allowing screencap to continue without disturbing the user. +/// Other screencap methods will fail when the target window is minimized. /// public enum Win32ScreencapMethod : System.UInt64 { diff --git a/src/MaaFramework.Binding/IMaaController.cs b/src/MaaFramework.Binding/IMaaController.cs index 2a5a776..0f11c6b 100644 --- a/src/MaaFramework.Binding/IMaaController.cs +++ b/src/MaaFramework.Binding/IMaaController.cs @@ -154,6 +154,17 @@ public interface IMaaController : IMaaCommon, IMaaOption, IMaa /// MaaJob Scroll(int dx, int dy); + /// + /// Appends a job for inactive action. + /// + /// An inactive action . + /// + /// For Win32 controllers, this restores window position (removes topmost) and unblocks user input. + /// For other controllers, this is a no-op that always succeeds. + /// + /// + MaaJob Inactive(); + /// /// Appends a job for shell command action. /// @@ -193,9 +204,9 @@ public interface IMaaController : IMaaCommon, IMaaOption, IMaa bool GetCachedImage(IMaaImageBuffer image); /// - /// Gets the uuid string of the . + /// Gets the uuid of the . /// - /// A if the hash was successfully got; otherwise, . + /// A if the uuid was successfully got; otherwise, . string? Uuid { get; } /// @@ -210,4 +221,10 @@ public interface IMaaController : IMaaCommon, IMaaOption, IMaa /// so its dimensions may differ from this raw resolution. /// bool GetResolution(out int width, out int height); + + /// + /// Gets the information of the . + /// + /// A if the information was successfully got; otherwise, . + string? Info { get; } } diff --git a/src/MaaFramework.Binding/MaaMsg.cs b/src/MaaFramework.Binding/MaaMsg.cs index d120395..d1af735 100644 --- a/src/MaaFramework.Binding/MaaMsg.cs +++ b/src/MaaFramework.Binding/MaaMsg.cs @@ -12,7 +12,7 @@ namespace MaaFramework.Binding.Notification; -// MaaApiDocument _version: (main) v5.6.0 +// MaaApiDocument _version: (main) v5.8.1 /// /// A callback consists of a message and a payload. /// The message is a string that indicates the type of the message. @@ -66,7 +66,7 @@ public static class Action /// Message for the controller actions. /// /// - /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, } + /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, info: object, } /// public const string Starting = "Controller.Action.Starting"; @@ -74,7 +74,7 @@ public static class Action /// Message for the controller actions. /// /// - /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, } + /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, info: object, } /// public const string Prefix = "Controller.Action"; @@ -82,7 +82,7 @@ public static class Action /// Message for the controller actions. /// /// - /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, } + /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, info: object, } /// public const string Succeeded = "Controller.Action.Succeeded"; @@ -90,7 +90,7 @@ public static class Action /// Message for the controller actions. /// /// - /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, } + /// details_json: { ctrl_id: number, uuid: string, action: string, param: object, info: object, } /// public const string Failed = "Controller.Action.Failed"; diff --git a/src/MaaFramework/packages.lock.json b/src/MaaFramework/packages.lock.json index 799cd4d..33e8ad8 100644 --- a/src/MaaFramework/packages.lock.json +++ b/src/MaaFramework/packages.lock.json @@ -4,16 +4,16 @@ "net7.0": { "Maa.Framework.Runtimes": { "type": "Direct", - "requested": "[5.6.0, )", - "resolved": "5.6.0", - "contentHash": "tudf2vMWH5KRGLVn+j9T6eaK1cRhjtANGnzGOaIu/v7BzDAeyaoqxJPd8DMd7FtdZNfT/6Q13j250CbuoArdag==", + "requested": "[5.8.1, )", + "resolved": "5.8.1", + "contentHash": "D5FxCNgUEfdKLrrSdP/cQ8AAiXwcBJsskODDTWKnZNR+QE8je5jicSRbviodE5XCmx28x4nlOK6yMayCPGen0Q==", "dependencies": { - "Maa.Framework.Runtime.linux-arm64": "5.6.0", - "Maa.Framework.Runtime.linux-x64": "5.6.0", - "Maa.Framework.Runtime.osx-arm64": "5.6.0", - "Maa.Framework.Runtime.osx-x64": "5.6.0", - "Maa.Framework.Runtime.win-arm64": "5.6.0", - "Maa.Framework.Runtime.win-x64": "5.6.0" + "Maa.Framework.Runtime.linux-arm64": "5.8.1", + "Maa.Framework.Runtime.linux-x64": "5.8.1", + "Maa.Framework.Runtime.osx-arm64": "5.8.1", + "Maa.Framework.Runtime.osx-x64": "5.8.1", + "Maa.Framework.Runtime.win-arm64": "5.8.1", + "Maa.Framework.Runtime.win-x64": "5.8.1" } }, "SonarAnalyzer.CSharp": { @@ -24,33 +24,33 @@ }, "Maa.Framework.Runtime.linux-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "WkHvm/NwCPXNu79049RC67aYTfyyQ7NejJWCKac7Tv8OB28DAbGbAovqOKHPxKP2GM8f37EJyE4Sur32DMB8ZA==" + "resolved": "5.8.1", + "contentHash": "ZmGWlMnxFLQ3IQPRJ2ivgPu09ufFp4x3hRD4gQmB7SShNHa5RXDCDp+Iih6W+5v1SY+1sq3xLbD0yiMAzsAcZg==" }, "Maa.Framework.Runtime.linux-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "5C761AldXHPliilRMMmXA3c9ojxYhtIvFZ21RYBuT9E3tVQUO51WIVfHpDpyArvoaSMKfe/qXZNG4toeE9K/Qw==" + "resolved": "5.8.1", + "contentHash": "5OfYvM3DKUqO567Rbsw1vXSdeVHykG4c8kGH37i2etbNBCRkBrsgYCtAFldHQryZGMcC8WKwnCg7wE4RbZCRGg==" }, "Maa.Framework.Runtime.osx-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "tMr6B3uNlD/dbjfC8Ac9VQWE2xJfTHQyqAIyD5HWxam6qiFjcsa1JVj53gMhf9d8+HXjx1iSmCIVIP57Mvxw4w==" + "resolved": "5.8.1", + "contentHash": "bA0TqJuJFkg7qIRyGMYpE8u1SSDOYmXgAEiF01ORP+3jgMLaUD6DtpoQoPkGrLs5AE5JDZg0soImznTJOJUZkQ==" }, "Maa.Framework.Runtime.osx-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "DJFamv6Xd3DgGQg/Oig6iBLLwFVpK38Dp50CnKR7WdppnC08tq57wQuykqQOapUm/oGmLRgO8O2mlOSGcUSWkg==" + "resolved": "5.8.1", + "contentHash": "JTcAfsmGUE2FVhR3oFZe1t66W/yKQZMHkQbSA8I2FLU/irjHm6dl5LMgPEevDu9aNwpqvpZ1Mj3VxtMaTUW6PA==" }, "Maa.Framework.Runtime.win-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "vkANhfQVJJohKjgHWrFa32WDlL6OrahmvZaFquH+kvuSxihfNDS5E578iEPp012eH5DAtZYnE/KegPwcY7zuQw==" + "resolved": "5.8.1", + "contentHash": "JJm0C0bLgNCk4RMm+vytHuw9LAjhi9VXJKHYXUkSfwb06CVFyOCOBQ9IJ0y3TncoBDdMceqj4LASTVGASBzIVg==" }, "Maa.Framework.Runtime.win-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "kF8895AF7im/WjsHXFUORhWub7kW4YxfS6yQ782O+YcKnTW4kYhWW2ZT4WtDI4M3SH8bcyTI5gyrZZUk7fTN2g==" + "resolved": "5.8.1", + "contentHash": "4gXP+p7xyeW2m8Og89TNJ57SaEFe1TTQ6gku/ytezhbYXxuHkb4caVcW1+uY8l7t39rwq1r0vfCAXqy8aK3pig==" }, "Maa.Framework.Binding": { "type": "Project" @@ -78,16 +78,16 @@ "net9.0": { "Maa.Framework.Runtimes": { "type": "Direct", - "requested": "[5.6.0, )", - "resolved": "5.6.0", - "contentHash": "tudf2vMWH5KRGLVn+j9T6eaK1cRhjtANGnzGOaIu/v7BzDAeyaoqxJPd8DMd7FtdZNfT/6Q13j250CbuoArdag==", + "requested": "[5.8.1, )", + "resolved": "5.8.1", + "contentHash": "D5FxCNgUEfdKLrrSdP/cQ8AAiXwcBJsskODDTWKnZNR+QE8je5jicSRbviodE5XCmx28x4nlOK6yMayCPGen0Q==", "dependencies": { - "Maa.Framework.Runtime.linux-arm64": "5.6.0", - "Maa.Framework.Runtime.linux-x64": "5.6.0", - "Maa.Framework.Runtime.osx-arm64": "5.6.0", - "Maa.Framework.Runtime.osx-x64": "5.6.0", - "Maa.Framework.Runtime.win-arm64": "5.6.0", - "Maa.Framework.Runtime.win-x64": "5.6.0" + "Maa.Framework.Runtime.linux-arm64": "5.8.1", + "Maa.Framework.Runtime.linux-x64": "5.8.1", + "Maa.Framework.Runtime.osx-arm64": "5.8.1", + "Maa.Framework.Runtime.osx-x64": "5.8.1", + "Maa.Framework.Runtime.win-arm64": "5.8.1", + "Maa.Framework.Runtime.win-x64": "5.8.1" } }, "SonarAnalyzer.CSharp": { @@ -98,33 +98,33 @@ }, "Maa.Framework.Runtime.linux-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "WkHvm/NwCPXNu79049RC67aYTfyyQ7NejJWCKac7Tv8OB28DAbGbAovqOKHPxKP2GM8f37EJyE4Sur32DMB8ZA==" + "resolved": "5.8.1", + "contentHash": "ZmGWlMnxFLQ3IQPRJ2ivgPu09ufFp4x3hRD4gQmB7SShNHa5RXDCDp+Iih6W+5v1SY+1sq3xLbD0yiMAzsAcZg==" }, "Maa.Framework.Runtime.linux-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "5C761AldXHPliilRMMmXA3c9ojxYhtIvFZ21RYBuT9E3tVQUO51WIVfHpDpyArvoaSMKfe/qXZNG4toeE9K/Qw==" + "resolved": "5.8.1", + "contentHash": "5OfYvM3DKUqO567Rbsw1vXSdeVHykG4c8kGH37i2etbNBCRkBrsgYCtAFldHQryZGMcC8WKwnCg7wE4RbZCRGg==" }, "Maa.Framework.Runtime.osx-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "tMr6B3uNlD/dbjfC8Ac9VQWE2xJfTHQyqAIyD5HWxam6qiFjcsa1JVj53gMhf9d8+HXjx1iSmCIVIP57Mvxw4w==" + "resolved": "5.8.1", + "contentHash": "bA0TqJuJFkg7qIRyGMYpE8u1SSDOYmXgAEiF01ORP+3jgMLaUD6DtpoQoPkGrLs5AE5JDZg0soImznTJOJUZkQ==" }, "Maa.Framework.Runtime.osx-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "DJFamv6Xd3DgGQg/Oig6iBLLwFVpK38Dp50CnKR7WdppnC08tq57wQuykqQOapUm/oGmLRgO8O2mlOSGcUSWkg==" + "resolved": "5.8.1", + "contentHash": "JTcAfsmGUE2FVhR3oFZe1t66W/yKQZMHkQbSA8I2FLU/irjHm6dl5LMgPEevDu9aNwpqvpZ1Mj3VxtMaTUW6PA==" }, "Maa.Framework.Runtime.win-arm64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "vkANhfQVJJohKjgHWrFa32WDlL6OrahmvZaFquH+kvuSxihfNDS5E578iEPp012eH5DAtZYnE/KegPwcY7zuQw==" + "resolved": "5.8.1", + "contentHash": "JJm0C0bLgNCk4RMm+vytHuw9LAjhi9VXJKHYXUkSfwb06CVFyOCOBQ9IJ0y3TncoBDdMceqj4LASTVGASBzIVg==" }, "Maa.Framework.Runtime.win-x64": { "type": "Transitive", - "resolved": "5.6.0", - "contentHash": "kF8895AF7im/WjsHXFUORhWub7kW4YxfS6yQ782O+YcKnTW4kYhWW2ZT4WtDI4M3SH8bcyTI5gyrZZUk7fTN2g==" + "resolved": "5.8.1", + "contentHash": "4gXP+p7xyeW2m8Og89TNJ57SaEFe1TTQ6gku/ytezhbYXxuHkb4caVcW1+uY8l7t39rwq1r0vfCAXqy8aK3pig==" }, "Maa.Framework.Binding": { "type": "Project"