Browse Source

Sample wasm extension don

Krzysztof Krysiński 1 year ago
parent
commit
29092c3508

+ 13 - 0
src/PixiEditor.Extensions.Wasm/ExtensionEvents.cs

@@ -0,0 +1,13 @@
+using System.Runtime.CompilerServices;
+
+namespace PixiEditor.Extensions.Wasm;
+
+public static class ExtensionEvents
+{
+    public static event Action OnInitialized;
+
+    internal static void Initialize()
+    {
+        OnInitialized?.Invoke();
+    }
+}

+ 5 - 0
src/PixiEditor.Extensions.Wasm/Interop.cs

@@ -10,4 +10,9 @@ internal class Interop
 
     [MethodImpl(MethodImplOptions.InternalCall)]
     internal static extern void CreatePopupWindow(string title, string body);
+
+    internal static void Initialize()
+    {
+        ExtensionEvents.Initialize();
+    }
 }

+ 15 - 1
src/PixiEditor.Extensions.Wasm/native/api_interop.c

@@ -2,7 +2,7 @@
 #include <string.h>
 #include <assert.h>
 
-MonoMethod* method_entry;
+MonoMethod* method_init;
 
 __attribute__((import_name("log_message")))
 void log_message(const char* message);
@@ -10,6 +10,20 @@ void log_message(const char* message);
 __attribute__((import_name("create_popup_window")))
 void create_popup_window(const char* title, const char* content);
 
+__attribute((export_name("initialize")))
+void initialize()
+{
+    if (!method_init) {
+        method_init = lookup_dotnet_method("PixiEditor.Extensions.Wasm.dll", "PixiEditor.Extensions.Wasm", "Interop", "Initialize", -1);
+        assert(method_init);
+    }
+
+    void* method_params[] = {  };
+    MonoObject* exception;
+    mono_wasm_invoke_method(method_init, NULL, method_params, &exception);
+    assert(!exception);
+}
+
 /*__attribute__((export_name("entry")))
 void entry()
 {

+ 1 - 0
src/PixiEditor.Extensions.WasmRuntime/PixiEditorApiLinkerExtensions.cs

@@ -16,6 +16,7 @@ public static class PixiEditorApiLinkerExtensions
         {
             string title = MemoryUtility.GetStringFromWasmMemory(titleOffset, instance.Instance.GetMemory("memory"));
             string body = MemoryUtility.GetStringFromWasmMemory(bodyOffset, instance.Instance.GetMemory("memory"));
+            instance.Api.WindowProvider.CreatePopupWindow(title, body).ShowDialog();
         });
     }
 }

+ 6 - 0
src/PixiEditor.Extensions.WasmRuntime/WasmExtensionInstance.cs

@@ -25,6 +25,12 @@ public class WasmExtensionInstance : Extension
         Instance = Linker.Instantiate(Store, Module);
     }
 
+    protected override void OnInitialized()
+    {
+        Instance.GetAction("initialize").Invoke();
+        base.OnInitialized();
+    }
+
     protected override void OnLoaded()
     {
         Instance.GetFunction("_start").Invoke();

+ 12 - 4
src/WasmSampleExtension/Program.cs

@@ -1,11 +1,19 @@
-namespace SampleExtension.WASM;
+using PixiEditor.Extensions.Wasm;
+
+namespace SampleExtension.WASM;
 
 public static class Program
 {
+    static SampleExtension extension = new SampleExtension();
     public static void Main(string[] args)
     {
-        SampleExtension sampleExtension = new SampleExtension();
-        sampleExtension.OnLoaded();
-        sampleExtension.OnInitialized();
+        ExtensionEvents.OnInitialized += OnExtensionInitialized;
+        extension = new SampleExtension();
+        extension.OnLoaded();
+    }
+
+    private static void OnExtensionInitialized()
+    {
+        extension.OnInitialized();
     }
 }

+ 2 - 1
src/WasmSampleExtension/WasmSampleExtension.csproj

@@ -4,9 +4,10 @@
     <TargetFramework>net8.0</TargetFramework>
     <OutputType>Exe</OutputType>
     <ImplicitUsings>enable</ImplicitUsings>
-    <Nullable>enable</Nullable>
+    <Nullable>disable</Nullable>
     <PublishTrimmed>true</PublishTrimmed>
     <MSBuildEnableWorkloadResolver>false</MSBuildEnableWorkloadResolver>
+    <OutputPath>..\PixiEditor.AvaloniaUI.Desktop\bin\Debug\net8.0\Extensions</OutputPath>
   </PropertyGroup>
 
   <Import Project="..\PixiEditor.Extensions.Wasm\build\PixiEditor.Extensions.Wasm.targets"/>