diff --git a/.gitattributes b/.gitattributes
index 627dcc833..5e5a77124 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,5 +1,5 @@
-src/InfiniFrame.NativeBridge/Native/Dependencies/* linguist-vendored
-src/InfiniFrame.NativeBridge/Native/Dependencies/**/* linguist-vendored
+src/InfiniFrame.NativeBridge/Native/src/Dependencies/* linguist-vendored
+src/InfiniFrame.NativeBridge/Native/src/Dependencies/**/* linguist-vendored
*.sh text eol=lf
.devcontainer/devcontainer.json text working-tree-encoding=UTF-8 eol=lf
\ No newline at end of file
diff --git a/.github/actions/setup-dependencies-native/action.yml b/.github/actions/setup-dependencies-native/action.yml
index ead308bc3..c7c4373a2 100644
--- a/.github/actions/setup-dependencies-native/action.yml
+++ b/.github/actions/setup-dependencies-native/action.yml
@@ -1,5 +1,5 @@
name: Setup Native Dependencies
-description: Install and cache Native related dependencies for Linux/macOS runners.
+description: Install and cache Native related dependencies and optional NativeBridge NuGet restore.
inputs:
brew-cache-key:
@@ -10,6 +10,10 @@ inputs:
description: Homebrew cache restore key prefix for macOS runners
required: false
default: ""
+ restore-nativebridge-packages:
+ description: Restore InfiniFrame.NativeBridge NuGet packages on Windows
+ required: false
+ default: "false"
runs:
using: composite
@@ -96,3 +100,9 @@ runs:
if ! command -v pwsh >/dev/null 2>&1; then
brew list --cask powershell >/dev/null 2>&1 || brew install --cask powershell
fi
+
+ - name: Restore NativeBridge NuGet packages (Windows)
+ if: runner.os == 'Windows' && inputs['restore-nativebridge-packages'] == 'true'
+ shell: pwsh
+ run: |
+ dotnet restore ./src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj
diff --git a/.github/workflows/ci-codeql.yml b/.github/workflows/ci-codeql.yml
index 2464640f8..cf07feba2 100644
--- a/.github/workflows/ci-codeql.yml
+++ b/.github/workflows/ci-codeql.yml
@@ -194,6 +194,7 @@ jobs:
with:
brew-cache-key: ${{ runner.os }}-brew-codeql-${{ hashFiles('.github/actions/setup-dependencies-native/action.yml', '.github/workflows/shared-testing-macos.yml') }}
brew-restore-key: ${{ runner.os }}-brew-codeql-
+ restore-nativebridge-packages: 'true'
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
@@ -269,6 +270,7 @@ jobs:
with:
brew-cache-key: ${{ matrix.os }}-${{ matrix.arch }}-brew-codeql-${{ hashFiles('.github/actions/setup-dependencies-native/action.yml', '.github/workflows/ci-codeql.yml') }}
brew-restore-key: ${{ matrix.os }}-${{ matrix.arch }}-brew-codeql-
+ restore-nativebridge-packages: 'true'
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
diff --git a/.github/workflows/shared-release-build.yml b/.github/workflows/shared-release-build.yml
index 0f2069225..5be107d48 100644
--- a/.github/workflows/shared-release-build.yml
+++ b/.github/workflows/shared-release-build.yml
@@ -62,6 +62,7 @@ jobs:
with:
brew-cache-key: ${{ matrix.os }}-${{ matrix.arch }}-brew-native-${{ hashFiles('.github/actions/setup-dependencies-native/action.yml', '.github/workflows/shared-release-build.yml') }}
brew-restore-key: ${{ matrix.os }}-${{ matrix.arch }}-brew-native-
+ restore-nativebridge-packages: 'true'
- name: Build Native
shell: bash
diff --git a/.github/workflows/shared-testing-build.yml b/.github/workflows/shared-testing-build.yml
index 10bcc7472..507621fa4 100644
--- a/.github/workflows/shared-testing-build.yml
+++ b/.github/workflows/shared-testing-build.yml
@@ -68,6 +68,7 @@ jobs:
with:
brew-cache-key: ${{ matrix.os }}-${{ matrix.arch }}-brew-native-${{ hashFiles('.github/actions/setup-dependencies-native/action.yml', '.github/workflows/shared-testing-build.yml') }}
brew-restore-key: ${{ matrix.os }}-${{ matrix.arch }}-brew-native-
+ restore-nativebridge-packages: 'true'
- name: Build Native
shell: pwsh
diff --git a/.gitignore b/.gitignore
index db4b656ba..dc6e1bf7e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -356,8 +356,8 @@ healthchecksdb
/src/InfiniFrame.NativeBridge/Native/cmake-build-release-linux/
/src/InfiniFrame.NativeBridge/Native/cmake-build-release-linux-wsl/
/src/InfiniFrame.NativeBridge/Native/cmake-build-release-windows/
-/src/InfiniFrame.NativeBridge/Native/Embedded/InfiniFrameJs/InfiniFrameJs.cpp
-/src/InfiniFrame.NativeBridge/Native/Embedded/InfiniFrameJs/InfiniFrameJs.h
+/src/InfiniFrame.NativeBridge/Native/src/Embedded/InfiniFrameJs/InfiniFrameJs.cpp
+/src/InfiniFrame.NativeBridge/Native/src/Embedded/InfiniFrameJs/InfiniFrameJs.h
# wwwroot folders from js web based projects
/examples/InfiniFrameExample.WebApp.React/wwwroot/
diff --git a/Directory.Packages.props b/Directory.Packages.props
index ee789ec54..67cf251a7 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -26,6 +26,8 @@
+
+
@@ -38,4 +40,4 @@
-
\ No newline at end of file
+
diff --git a/docs/docs/migration/photino-breaking-changes.md b/docs/docs/migration/photino-breaking-changes.md
index cd0970993..ec0892fc5 100644
--- a/docs/docs/migration/photino-breaking-changes.md
+++ b/docs/docs/migration/photino-breaking-changes.md
@@ -26,12 +26,12 @@ This document walks through what changed to help you migrate.
| Native DLL | `Photino.Native` | `InfiniFrame.Native` (internal) |
| C++ class | `Photino` | `InfiniFrameWindow` |
| C++ init params | `PhotinoInitParams` | `InfiniFrameInitParams` |
-| Exported function prefix | `Photino_` | `InfiniFrame_` |
+| Exported function prefix | `Photino_` | `InfiniFrameNative_` |
| Default window title | `"Photino"` | `"InfiniFrame"` |
| Default user agent | `"Photino WebView"` | `"InfiniFrame WebView"` |
| Default temp path | `%LocalAppData%\Photino` (Windows only) | `%TEMP%\infiniframe` (all platforms) |
-Every type that was prefixed `Photino` is now prefixed `InfiniFrame`. If you're calling the native DLL directly via P/Invoke, all exported symbol names need to change from `Photino_*` to `InfiniFrame_*`.
+Every type that was prefixed `Photino` is now prefixed `InfiniFrame`. If you're calling the native DLL directly via P/Invoke, all exported symbol names need to change from `Photino_*` to `InfiniFrameNative_*`.
## Entry Point and Builder API
@@ -288,7 +288,7 @@ static extern void Photino_SetTitle(IntPtr instance, string title);
// InfiniFrame
[LibraryImport("InfiniFrame.Native", ...)]
-static partial void InfiniFrame_SetTitle(IntPtr instance, ...);
+static partial void InfiniFrameNative_SetTitle(IntPtr instance, ...);
```
### String ownership
@@ -298,8 +298,8 @@ Photino has no explicit API for freeing native-allocated strings, which causes m
InfiniFrame exports explicit free functions that must be called on any string returned from the native layer:
```csharp
-InfiniFrame_FreeString(ptr);
-InfiniFrame_FreeStringArray(ptr, count);
+InfiniFrameNative_FreeString(ptr);
+InfiniFrameNative_FreeStringArray(ptr, count);
```
The managed wrapper calls these automatically. If you're calling native exports directly, you're responsible for invoking them yourself.
@@ -313,7 +313,7 @@ The native `SaveFileDialog` export gained a `defaultFileName` parameter:
Photino_ShowSaveFile(title, defaultPath, filters, count)
// InfiniFrame
-InfiniFrame_ShowSaveFile(title, defaultPath, filters, count, defaultFileName)
+InfiniFrameNative_ShowSaveFile(title, defaultPath, filters, count, defaultFileName)
```
## Known Photino Issues Addressed
@@ -321,8 +321,8 @@ InfiniFrame_ShowSaveFile(title, defaultPath, filters, count, defaultFileName)
| Photino Issue | Description | How InfiniFrame addresses it |
|------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|
| [photino.native #173/174](https://github.com/tryphotino/photino.native/issues/173) | Custom scheme handlers completely broken on Windows (`WebResourceRequested` never fires) | Rewritten registration path; scheme handlers tested end-to-end in examples |
-| [photino.native #165](https://github.com/tryphotino/photino.native/issues/165) | Memory leak in `SendWebMessage` on Windows | Explicit `InfiniFrame_FreeString` ownership model; Pimpl isolates per-window native allocations |
-| [photino.native #158](https://github.com/tryphotino/photino.native/issues/158) | No way to programmatically focus a window | `InfiniFrame_SetFocused` / `InfiniFrame_GetFocused` exported and exposed via `IInfiniFrameWindow.Focused` |
+| [photino.native #165](https://github.com/tryphotino/photino.native/issues/165) | Memory leak in `SendWebMessage` on Windows | Explicit `InfiniFrameNative_FreeString` ownership model; Pimpl isolates per-window native allocations |
+| [photino.native #158](https://github.com/tryphotino/photino.native/issues/158) | No way to programmatically focus a window | `InfiniFrameNative_SetFocused` / `InfiniFrameNative_GetFocused` exported and exposed via `IInfiniFrameWindow.Focused` |
| [photino.native #163](https://github.com/tryphotino/photino.native/issues/163) | UTF encoding bug in `SetWebView2RuntimePath` silently corrupts non-ASCII paths | `simdutf` used for all UTF-8/UTF-16 conversions on Windows |
| [photino.native #141](https://github.com/tryphotino/photino.native/issues/141) | Stack overflow in `WaitForExit` on Linux | Per-window independent message loops; no shared global `MessageLoopState` lock |
| [photino.NET #75](https://github.com/tryphotino/photino.NET/issues/75) | `RegisterWindowClosingHandler` does not fire on Linux | Closing handler rewritten using the GTK `delete-event` signal correctly |
diff --git a/native-vendor-deps.json b/native-vendor-deps.json
index e9d736af1..b639bc384 100644
--- a/native-vendor-deps.json
+++ b/native-vendor-deps.json
@@ -7,18 +7,18 @@
"assets": [
{
"asset": "simdjson.h",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdjson/simdjson.h"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdjson/simdjson.h"
},
{
"asset": "simdjson.cpp",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdjson/simdjson.cpp"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdjson/simdjson.cpp"
}
],
"source_files": [],
"license_files": [
{
"source": "https://raw.githubusercontent.com/simdjson/simdjson/{tag}/LICENSE",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdjson/LICENSE"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdjson/LICENSE"
}
]
},
@@ -29,26 +29,26 @@
"assets": [
{
"asset": "simdutf.h",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdutf/simdutf.h"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdutf/simdutf.h"
},
{
"asset": "simdutf.cpp",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdutf/simdutf.cpp"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdutf/simdutf.cpp"
},
{
"asset": "simdutf_c.h",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdutf/simdutf_c.h"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdutf/simdutf_c.h"
}
],
"source_files": [],
"license_files": [
{
"source": "https://raw.githubusercontent.com/simdutf/simdutf/{tag}/LICENSE-MIT",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdutf/LICENSE-MIT"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdutf/LICENSE-MIT"
},
{
"source": "https://raw.githubusercontent.com/simdutf/simdutf/{tag}/LICENSE-APACHE",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/simdutf/LICENSE-APACHE"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/simdutf/LICENSE-APACHE"
}
]
},
@@ -60,17 +60,17 @@
"source_files": [
{
"source": "https://raw.githubusercontent.com/mohabouje/WinToast/{tag}/include/wintoastlib.h",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/wintoastlib/wintoastlib.h"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/wintoastlib/wintoastlib.h"
},
{
"source": "https://raw.githubusercontent.com/mohabouje/WinToast/{tag}/src/wintoastlib.cpp",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/wintoastlib/wintoastlib.cpp"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/wintoastlib/wintoastlib.cpp"
}
],
"license_files": [
{
"source": "https://raw.githubusercontent.com/mohabouje/WinToast/{tag}/LICENSE.txt",
- "destination": "src/InfiniFrame.NativeBridge/Native/Dependencies/wintoastlib/LICENSE.txt"
+ "destination": "src/InfiniFrame.NativeBridge/Native/src/Dependencies/wintoastlib/LICENSE.txt"
}
]
}
diff --git a/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj b/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj
index ee24b38d4..a57bea433 100644
--- a/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj
+++ b/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj
@@ -39,6 +39,14 @@
+
+
diff --git a/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj.DotSettings b/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj.DotSettings
index fd1a4a531..9a82f24d4 100644
--- a/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj.DotSettings
+++ b/src/InfiniFrame.NativeBridge/InfiniFrame.NativeBridge.csproj.DotSettings
@@ -1,3 +1,6 @@
True
- True
\ No newline at end of file
+ True
+ True
+ True
+ True
\ No newline at end of file
diff --git a/src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNative.cs b/src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNative.cs
deleted file mode 100644
index f3fae3bab..000000000
--- a/src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNative.cs
+++ /dev/null
@@ -1,398 +0,0 @@
-// ---------------------------------------------------------------------------------------------------------------------
-// Imports
-// ---------------------------------------------------------------------------------------------------------------------
-using InfiniFrame.NativeBridge.Delegates;
-using InfiniFrame.NativeBridge.Dialogs;
-using InfiniFrame.NativeBridge.Parameters;
-using System.Drawing;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Runtime.InteropServices.Marshalling;
-using static InfiniFrame.NativeBridge.ArtifactManifest;
-
-namespace InfiniFrame.NativeBridge;
-// ---------------------------------------------------------------------------------------------------------------------
-// Code
-// ---------------------------------------------------------------------------------------------------------------------
-public static partial class InfiniFrameNative {
-
- #region MARSHAL CALLS FROM Non-UI Thread to UI Thread
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_Invoke", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus Invoke(IntPtr instance, Action callback);
- #endregion
- #region Register
- // ReSharper disable once UnusedMethodReturnValue.Local
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_register_win32", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus RegisterWin32(IntPtr hInstance);
-
- // ReSharper disable once UnusedMethodReturnValue.Local
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_register_mac", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus RegisterMac();
- #endregion
-
- #region CTOR-DTOR
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_ctor", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus Constructor([MarshalUsing(typeof(InfiniFrameNativeParametersMarshaller))] in InfiniFrameNativeParameters parameters, out IntPtr value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_dtor"), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus Destructor(IntPtr instance);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_AddCustomSchemeName", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus AddCustomSchemeName(IntPtr instance, string scheme);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_Close", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus Close(IntPtr instance);
- #endregion
-
- #region Get
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_getHwnd_win32", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetWindowHandlerWin32(IntPtr instance, out IntPtr value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetAllMonitors", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetAllMonitors(IntPtr instance, CppGetAllMonitorsDelegate callback);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetTransparentEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetTransparentEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetContextMenuEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetContextMenuEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetDevToolsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetDevToolsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetFullScreen", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetFullScreen(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool fullScreen);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetGrantBrowserPermissions", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetGrantBrowserPermissions(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool grant);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetUserAgent", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetUserAgent(IntPtr instance, out IntPtr value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetMediaAutoplayEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetMediaAutoplayEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetFileSystemAccessEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetFileSystemAccessEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetWebSecurityEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetWebSecurityEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetJavascriptClipboardAccessEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetJavascriptClipboardAccessEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetMediaStreamEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetMediaStreamEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetSmoothScrollingEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetSmoothScrollingEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetIgnoreCertificateErrorsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetIgnoreCertificateErrorsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetNotificationsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetNotificationsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetPosition", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetPosition(IntPtr instance, out int x, out int y);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetResizable", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetResizable(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool resizable);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetScreenDpi", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetScreenDpi(IntPtr instance, out uint value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetSize(IntPtr instance, out int width, out int height);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetMaxSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetMaxSize(IntPtr instance, out int maxWidth, out int maxHeight);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetMinSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetMinSize(IntPtr instance, out int minWidth, out int minHeight);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetTitle", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetTitle(IntPtr instance, out IntPtr value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetTopmost", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetTopmost(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool topmost);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetZoom", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetZoom(IntPtr instance, out int zoom);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetMaximized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetMaximized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool maximized);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetMinimized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetMinimized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool minimized);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetZoomEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetZoomEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool zoomEnabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetIconFileName", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetIconFileName(IntPtr instance, out IntPtr value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetFocused", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus GetFocused(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool isFocused);
- #endregion
-
- #region Navigate
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_NavigateToString", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus NavigateToString(IntPtr instance, string content);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_NavigateToUrl", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus NavigateToUrl(IntPtr instance, string url);
- #endregion
-
- #region Set
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_setWebView2RuntimePath_win32", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetWebView2RuntimePath_win32(IntPtr instance, string webView2RuntimePath);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetTransparentEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetTransparentEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetContextMenuEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetContextMenuEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetDevToolsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetDevToolsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool enabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetFullScreen", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetFullScreen(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool fullScreen);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetMaximized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetMaximized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool maximized);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetMaxSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetMaxSize(IntPtr instance, int maxWidth, int maxHeight);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetMinimized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetMinimized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool minimized);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetMinSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetMinSize(IntPtr instance, int minWidth, int minHeight);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetResizable", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetResizable(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool resizable);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetPosition", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetPosition(IntPtr instance, int x, int y);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetSize(IntPtr instance, int width, int height);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetTitle", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetTitle(IntPtr instance, string? title);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetTopmost", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetTopmost(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool topmost);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetIconFile", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetIconFile(IntPtr instance, string filename);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetZoom", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetZoom(IntPtr instance, int zoom);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetZoomEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetZoomEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool zoomEnabled);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SetFocused", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SetFocused(IntPtr instance);
- #endregion
-
- #region Misc
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_Center", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus Center(IntPtr instance);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_Restore", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus Restore(IntPtr instance);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_ClearBrowserAutoFill", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus ClearBrowserAutoFill(IntPtr instance);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_SendWebMessage", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus SendWebMessage(IntPtr instance, string message);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_ShowNotification", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus ShowNotification(IntPtr instance, string title, string body);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_WaitForExit", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus WaitForExit(IntPtr instance);
- #endregion
-
- #region Dialog
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_ShowOpenFile", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus ShowOpenFile(IntPtr inst, string title, string defaultPath, [MarshalAs(UnmanagedType.I1)] bool multiSelect, string[] filters, int filtersCount, out int resultCount, out IntPtr values);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_ShowOpenFolder", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus ShowOpenFolder(IntPtr inst, string title, string defaultPath, [MarshalAs(UnmanagedType.I1)] bool multiSelect, out int resultCount, out IntPtr values);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_ShowSaveFile", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus ShowSaveFile(IntPtr inst, string title, string defaultPath, string[] filters, int filtersCount, string? defaultFileName, out IntPtr value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_ShowMessage", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus ShowMessage(IntPtr inst, string title, string text, InfiniFrameDialogButtons buttons, InfiniFrameDialogIcon icon, out InfiniFrameDialogResult value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_FreeString", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus FreeString(IntPtr value);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_FreeStringArray", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- internal static partial InfiniFrameNativeInteropStatus FreeStringArray(IntPtr values, int count);
-
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrame_GetLastErrorMessage", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
- private static partial InfiniFrameNativeInteropStatus GetLastErrorMessagePtr(out IntPtr value);
- #endregion
-
- #region Overloads
- internal static string? PtrToNativeString(IntPtr ptr) {
- if (ptr == IntPtr.Zero) return null;
-
- return OperatingSystem.IsWindows()
- ? Marshal.PtrToStringUni(ptr)
- : Marshal.PtrToStringUTF8(ptr);
- }
-
- internal static InfiniFrameNativeInteropStatus GetHeight(IntPtr instance, out int height)
- => GetSize(instance, out _, out height);
-
- internal static InfiniFrameNativeInteropStatus GetWidth(IntPtr instance, out int width)
- => GetSize(instance, out width, out _);
-
- internal static InfiniFrameNativeInteropStatus GetMaxHeight(IntPtr instance, out int maxHeight)
- => GetMaxSize(instance, out _, out maxHeight);
-
- internal static InfiniFrameNativeInteropStatus GetMaxWidth(IntPtr instance, out int maxWidth)
- => GetMaxSize(instance, out maxWidth, out _);
-
- internal static InfiniFrameNativeInteropStatus GetMinHeight(IntPtr instance, out int minHeight)
- => GetMinSize(instance, out _, out minHeight);
-
- internal static InfiniFrameNativeInteropStatus GetMinWidth(IntPtr instance, out int minWidth)
- => GetMinSize(instance, out minWidth, out _);
-
- internal static InfiniFrameNativeInteropStatus GetLeft(IntPtr instance, out int left)
- => GetPosition(instance, out left, out _);
-
- internal static InfiniFrameNativeInteropStatus GetTop(IntPtr instance, out int top)
- => GetPosition(instance, out _, out top);
-
- internal static InfiniFrameNativeInteropStatus GetSize(IntPtr instance, out Size size) {
- InfiniFrameNativeInteropStatus status = GetSize(instance, out int width, out int height);
- size = new Size(width, height);
- return status;
- }
-
- internal static InfiniFrameNativeInteropStatus GetMaxSize(IntPtr instance, out Size size) {
- InfiniFrameNativeInteropStatus status = GetMaxSize(instance, out int width, out int height);
- size = new Size(width, height);
- return status;
- }
-
- internal static InfiniFrameNativeInteropStatus GetMinSize(IntPtr instance, out Size size) {
- InfiniFrameNativeInteropStatus status = GetMinSize(instance, out int width, out int height);
- size = new Size(width, height);
- return status;
- }
-
- internal static InfiniFrameNativeInteropStatus GetPosition(IntPtr instance, out Point position) {
- InfiniFrameNativeInteropStatus status = GetPosition(instance, out int left, out int top);
- position = new Point(left, top);
- return status;
- }
-
- internal static InfiniFrameNativeInteropStatus GetWindowRectangle(IntPtr instance, out int x, out int y, out int width, out int height) {
- InfiniFrameNativeInteropStatus sizeStatus = GetSize(instance, out width, out height);
- if (sizeStatus != InfiniFrameNativeInteropStatus.Success) {
- x = 0;
- y = 0;
- return sizeStatus;
- }
-
- return GetPosition(instance, out x, out y);
- }
-
- internal static InfiniFrameNativeInteropStatus GetWindowRectangle(IntPtr instance, out Rectangle rectangle) {
- InfiniFrameNativeInteropStatus status = GetWindowRectangle(instance, out int x, out int y, out int width, out int height);
- rectangle = new Rectangle(x, y, width, height);
- return status;
- }
-
- internal static InfiniFrameNativeInteropStatus GetUserAgent(IntPtr instance, out string? userAgent) {
- InfiniFrameNativeInteropStatus status = GetUserAgent(instance, out IntPtr ptr);
- try {
- userAgent = PtrToNativeString(ptr);
- }
- finally {
- if (ptr != IntPtr.Zero) {
- FreeString(ptr);
- }
- }
-
- return status;
- }
-
- internal static InfiniFrameNativeInteropStatus GetTitle(IntPtr instance, out string? title) {
- InfiniFrameNativeInteropStatus status = GetTitle(instance, out IntPtr ptr);
- try {
- title = PtrToNativeString(ptr);
- }
- finally {
- if (ptr != IntPtr.Zero) {
- FreeString(ptr);
- }
- }
-
- return status;
- }
-
- internal static InfiniFrameNativeInteropStatus GetIconFileName(IntPtr instance, out string iconFileName) {
- InfiniFrameNativeInteropStatus status = GetIconFileName(instance, out IntPtr ptr);
- try {
- iconFileName = PtrToNativeString(ptr) ?? string.Empty;
- }
- finally {
- if (ptr != IntPtr.Zero) {
- FreeString(ptr);
- }
- }
-
- return status;
- }
-
- internal static string? GetLastErrorMessage() {
- InfiniFrameNativeInteropStatus status = GetLastErrorMessagePtr(out IntPtr ptr);
- if (status != InfiniFrameNativeInteropStatus.Success || ptr == IntPtr.Zero) return null;
-
- try {
- return PtrToNativeString(ptr);
- }
- finally {
- FreeString(ptr);
- }
- }
-
- internal static InfiniFrameNativeInteropStatus EnsureSucceeded(InfiniFrameNativeInteropStatus status, string operationName) {
-
- int fallbackLastError = Marshal.GetLastPInvokeError();
-
- if (status is InfiniFrameNativeInteropStatus.Success && fallbackLastError is 0) return status;
-
- InfiniFrameNativeInteropStatus fallbackStatus = GetLastErrorMessagePtr(out IntPtr ptr);
-
- string? fallbackMessage;
- if (fallbackStatus != InfiniFrameNativeInteropStatus.Success || ptr == IntPtr.Zero) {
- fallbackMessage = "No native error message provided.";
- }
- else {
- try {
- fallbackMessage = PtrToNativeString(ptr);
- }
- finally {
- FreeString(ptr);
- }
- }
-
- throw new ApplicationException($"Native interop call '{operationName}' failed with unknown status state. Fallback last error {fallbackLastError}. {fallbackMessage} {fallbackStatus}");
- }
- #endregion
-}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.CustomSchemes.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.CustomSchemes.cs
new file mode 100644
index 000000000..3c1ab8959
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.CustomSchemes.cs
@@ -0,0 +1,14 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_AddCustomSchemeName", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus AddCustomSchemeName(IntPtr instance, string scheme);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Dialog.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Dialog.cs
new file mode 100644
index 000000000..8725f0910
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Dialog.cs
@@ -0,0 +1,68 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System;
+using InfiniFrame.NativeBridge.Dialogs;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_ShowOpenFile", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ private static partial InfiniFrameNativeInteropStatus ShowOpenFilePtr(IntPtr inst, string title, string defaultPath, [MarshalAs(UnmanagedType.I1)] bool multiSelect, string[] filters, int filtersCount, out int resultCount, out IntPtr values);
+ internal static InfiniFrameNativeInteropStatus ShowOpenFile(IntPtr instance, string title, string defaultPath, bool multiSelect, string[] filters, int filtersCount, out string?[] values) {
+ InfiniFrameNativeInteropStatus status = ShowOpenFilePtr(instance, title, defaultPath, multiSelect, filters, filtersCount, out int resultCount, out IntPtr ptrValues);
+ values = PtrToNativeStringArray(ptrValues, resultCount);
+ return status;
+ }
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_ShowOpenFolder", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ private static partial InfiniFrameNativeInteropStatus ShowOpenFolderPtr(IntPtr inst, string title, string defaultPath, [MarshalAs(UnmanagedType.I1)] bool multiSelect, out int resultCount, out IntPtr values);
+ internal static InfiniFrameNativeInteropStatus ShowOpenFolder(IntPtr instance, string title, string defaultPath, bool multiSelect, out string?[] values) {
+ InfiniFrameNativeInteropStatus status = ShowOpenFolderPtr(instance, title, defaultPath, multiSelect, out int resultCount, out IntPtr ptrValues);
+ values = PtrToNativeStringArray(ptrValues, resultCount);
+ return status;
+ }
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_ShowSaveFile", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ private static partial InfiniFrameNativeInteropStatus ShowSaveFilePtr(IntPtr inst, string title, string defaultPath, string[] filters, int filtersCount, string? defaultFileName, out IntPtr value);
+ internal static InfiniFrameNativeInteropStatus ShowSaveFile(IntPtr instance, string title, string defaultPath, string[] filters, int filtersCount, string? defaultFileName, out string? value) {
+ InfiniFrameNativeInteropStatus status = ShowSaveFilePtr(instance, title, defaultPath, filters, filtersCount, defaultFileName, out IntPtr ptrValue);
+ try {
+ value = PtrToNativeString(ptrValue);
+ }
+ finally {
+ if (ptrValue != IntPtr.Zero) {
+ FreeString(ptrValue);
+ }
+ }
+
+ return status;
+ }
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_ShowMessage", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus ShowMessage(IntPtr inst, string title, string text, InfiniFrameDialogButtons buttons, InfiniFrameDialogIcon icon, out InfiniFrameDialogResult value);
+
+ private static string?[] PtrToNativeStringArray(IntPtr valuesPtr, int count) {
+ if (valuesPtr == IntPtr.Zero || count <= 0) {
+ return Array.Empty();
+ }
+
+ try {
+ IntPtr[] ptrArray = new IntPtr[count];
+ string?[] values = new string?[count];
+ Marshal.Copy(valuesPtr, ptrArray, 0, count);
+ for (int i = 0; i < count; i++) {
+ values[i] = PtrToNativeString(ptrArray[i]);
+ }
+
+ return values;
+ }
+ finally {
+ FreeStringArray(valuesPtr, count);
+ }
+ }
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Dispatch.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Dispatch.cs
new file mode 100644
index 000000000..f34e9718a
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Dispatch.cs
@@ -0,0 +1,14 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_Invoke", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus Invoke(IntPtr instance, Action callback);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Events.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Events.cs
new file mode 100644
index 000000000..cc5e011a5
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Events.cs
@@ -0,0 +1,30 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using InfiniFrame.NativeBridge.Delegates;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetClosingCallback", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetClosingCallback(IntPtr instance, CppClosingDelegate callback);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_setClosedCallback", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetClosedCallback(IntPtr instance, CppClosedDelegate callback);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetFocusInCallback", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetFocusInCallback(IntPtr instance, CppFocusInDelegate callback);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetFocusOutCallback", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetFocusOutCallback(IntPtr instance, CppFocusOutDelegate callback);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetMovedCallback", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetMovedCallback(IntPtr instance, CppMovedDelegate callback);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetResizedCallback", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetResizedCallback(IntPtr instance, CppResizedDelegate callback);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Lifecycle.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Lifecycle.cs
new file mode 100644
index 000000000..9706fa3e9
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Lifecycle.cs
@@ -0,0 +1,25 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using InfiniFrame.NativeBridge.Parameters;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.Marshalling;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_ctor", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus Constructor([MarshalUsing(typeof(InfiniFrameNativeParametersMarshaller))] in InfiniFrameNativeParameters parameters, out IntPtr value);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_dtor"), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus Destructor(IntPtr instance);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_Close", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus Close(IntPtr instance);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_WaitForExit", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus WaitForExit(IntPtr instance);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Memory.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Memory.cs
new file mode 100644
index 000000000..ada2ca8e5
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Memory.cs
@@ -0,0 +1,32 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_FreeString", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus FreeString(IntPtr value);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_FreeStringArray", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus FreeStringArray(IntPtr values, int count);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetLastErrorMessage", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ private static partial InfiniFrameNativeInteropStatus GetLastErrorMessagePtr(out IntPtr value);
+
+ internal static string? GetLastErrorMessage() {
+ InfiniFrameNativeInteropStatus status = GetLastErrorMessagePtr(out IntPtr ptr);
+ if (status != InfiniFrameNativeInteropStatus.Success || ptr == IntPtr.Zero) return null;
+
+ try {
+ return PtrToNativeString(ptr);
+ }
+ finally {
+ FreeString(ptr);
+ }
+ }
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Monitors.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Monitors.cs
new file mode 100644
index 000000000..1b3e7f7b6
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Monitors.cs
@@ -0,0 +1,15 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using InfiniFrame.NativeBridge.Delegates;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetAllMonitors", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetAllMonitors(IntPtr instance, CppGetAllMonitorsDelegate callback);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Platform.MacOs.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Platform.MacOs.cs
new file mode 100644
index 000000000..c7efcc656
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Platform.MacOs.cs
@@ -0,0 +1,14 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_register_mac", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus RegisterMac();
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Platform.Windows.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Platform.Windows.cs
new file mode 100644
index 000000000..7fbebb5e3
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Platform.Windows.cs
@@ -0,0 +1,24 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_register_win32", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus RegisterWin32(IntPtr hInstance);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_getHwnd_win32", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetWindowHandlerWin32(IntPtr instance, out IntPtr value);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_setWebView2RuntimePath_win32", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetWebView2RuntimePath_win32(IntPtr instance, string webView2RuntimePath);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetNotificationsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetNotificationsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Actions.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Actions.cs
new file mode 100644
index 000000000..0509a826b
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Actions.cs
@@ -0,0 +1,27 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_Center", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus Center(IntPtr instance);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_Restore", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus Restore(IntPtr instance);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_ClearBrowserAutoFill", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus ClearBrowserAutoFill(IntPtr instance);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetFocused", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetFocused(IntPtr instance);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_ShowNotification", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus ShowNotification(IntPtr instance, string title, string body);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Get.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Get.cs
new file mode 100644
index 000000000..840ee9f0d
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Get.cs
@@ -0,0 +1,132 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetTransparentEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetTransparentEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetContextMenuEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetContextMenuEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetZoomEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetZoomEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool zoomEnabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetDevToolsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetDevToolsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetFullScreen", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetFullScreen(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool fullScreen);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetGrantBrowserPermissions", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetGrantBrowserPermissions(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool grant);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetMediaAutoplayEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetMediaAutoplayEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetFileSystemAccessEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetFileSystemAccessEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetWebSecurityEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetWebSecurityEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetJavascriptClipboardAccessEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetJavascriptClipboardAccessEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetMediaStreamEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetMediaStreamEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetSmoothScrollingEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetSmoothScrollingEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetIgnoreCertificateErrorsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetIgnoreCertificateErrorsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetMaximized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetMaximized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool maximized);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetMinimized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetMinimized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool minimized);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetResizable", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetResizable(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool resizable);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetTopmost", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetTopmost(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool topmost);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetFocused", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetFocused(IntPtr instance, [MarshalAs(UnmanagedType.I1)] out bool isFocused);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetPosition", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetPosition(IntPtr instance, out int x, out int y);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetSize(IntPtr instance, out int width, out int height);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetMaxSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetMaxSize(IntPtr instance, out int maxWidth, out int maxHeight);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetMinSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetMinSize(IntPtr instance, out int minWidth, out int minHeight);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetScreenDpi", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetScreenDpi(IntPtr instance, out uint value);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetZoom", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus GetZoom(IntPtr instance, out int zoom);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetUserAgent", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ private static partial InfiniFrameNativeInteropStatus GetUserAgentPtr(IntPtr instance, out IntPtr value);
+ internal static InfiniFrameNativeInteropStatus GetUserAgent(IntPtr instance, out string? userAgent) {
+ InfiniFrameNativeInteropStatus status = GetUserAgentPtr(instance, out IntPtr ptr);
+ try {
+ userAgent = PtrToNativeString(ptr);
+ }
+ finally {
+ if (ptr != IntPtr.Zero) {
+ FreeString(ptr);
+ }
+ }
+
+ return status;
+ }
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetTitle", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ private static partial InfiniFrameNativeInteropStatus GetTitlePtr(IntPtr instance, out IntPtr value);
+ internal static InfiniFrameNativeInteropStatus GetTitle(IntPtr instance, out string? title) {
+ InfiniFrameNativeInteropStatus status = GetTitlePtr(instance, out IntPtr ptr);
+ try {
+ title = PtrToNativeString(ptr);
+ }
+ finally {
+ if (ptr != IntPtr.Zero) {
+ FreeString(ptr);
+ }
+ }
+
+ return status;
+ }
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_GetIconFileName", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ private static partial InfiniFrameNativeInteropStatus GetIconFileNamePtr(IntPtr instance, out IntPtr value);
+ internal static InfiniFrameNativeInteropStatus GetIconFileName(IntPtr instance, out string iconFileName) {
+ InfiniFrameNativeInteropStatus status = GetIconFileNamePtr(instance, out IntPtr ptr);
+ try {
+ iconFileName = PtrToNativeString(ptr) ?? string.Empty;
+ }
+ finally {
+ if (ptr != IntPtr.Zero) {
+ FreeString(ptr);
+ }
+ }
+
+ return status;
+ }
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Navigation.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Navigation.cs
new file mode 100644
index 000000000..345b5a3f1
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Navigation.cs
@@ -0,0 +1,21 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_NavigateToString", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus NavigateToString(IntPtr instance, string content);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_NavigateToUrl", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus NavigateToUrl(IntPtr instance, string url);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SendWebMessage", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SendWebMessage(IntPtr instance, string message);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Set.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Set.cs
new file mode 100644
index 000000000..fb8ccfa79
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Exports/InfiniFrameNative.Window.Set.cs
@@ -0,0 +1,60 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetTransparentEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetTransparentEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetContextMenuEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetContextMenuEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetZoomEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetZoomEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool zoomEnabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetDevToolsEnabled", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetDevToolsEnabled(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool enabled);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetFullScreen", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetFullScreen(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool fullScreen);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetMaximized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetMaximized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool maximized);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetMinimized", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetMinimized(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool minimized);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetResizable", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetResizable(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool resizable);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetTopmost", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetTopmost(IntPtr instance, [MarshalAs(UnmanagedType.I1)] bool topmost);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetIconFile", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetIconFile(IntPtr instance, string filename);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetTitle", SetLastError = true, StringMarshalling = StringMarshalling.Utf8), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetTitle(IntPtr instance, string? title);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetZoom", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetZoom(IntPtr instance, int zoom);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetPosition", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetPosition(IntPtr instance, int x, int y);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetSize(IntPtr instance, int width, int height);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetMaxSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetMaxSize(IntPtr instance, int maxWidth, int maxHeight);
+
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNative_SetMinSize", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ internal static partial InfiniFrameNativeInteropStatus SetMinSize(IntPtr instance, int minWidth, int minHeight);
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/NativeApi/InfiniFrameNative.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/InfiniFrameNative.cs
new file mode 100644
index 000000000..5e874a70d
--- /dev/null
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/InfiniFrameNative.cs
@@ -0,0 +1,99 @@
+// ---------------------------------------------------------------------------------------------------------------------
+// Imports
+// ---------------------------------------------------------------------------------------------------------------------
+using System.Drawing;
+using System.Runtime.InteropServices;
+
+namespace InfiniFrame.NativeBridge;
+// ---------------------------------------------------------------------------------------------------------------------
+// Code
+// ---------------------------------------------------------------------------------------------------------------------
+public partial class InfiniFrameNative {
+ internal static string? PtrToNativeString(IntPtr ptr) {
+ if (ptr == IntPtr.Zero) return null;
+
+ return OperatingSystem.IsWindows()
+ ? Marshal.PtrToStringUni(ptr)
+ : Marshal.PtrToStringUTF8(ptr);
+ }
+
+ internal static InfiniFrameNativeInteropStatus GetHeight(IntPtr instance, out int height)
+ => GetSize(instance, out _, out height);
+
+ internal static InfiniFrameNativeInteropStatus GetWidth(IntPtr instance, out int width)
+ => GetSize(instance, out width, out _);
+
+ internal static InfiniFrameNativeInteropStatus GetMaxHeight(IntPtr instance, out int maxHeight)
+ => GetMaxSize(instance, out _, out maxHeight);
+
+ internal static InfiniFrameNativeInteropStatus GetMaxWidth(IntPtr instance, out int maxWidth)
+ => GetMaxSize(instance, out maxWidth, out _);
+
+ internal static InfiniFrameNativeInteropStatus GetMinHeight(IntPtr instance, out int minHeight)
+ => GetMinSize(instance, out _, out minHeight);
+
+ internal static InfiniFrameNativeInteropStatus GetMinWidth(IntPtr instance, out int minWidth)
+ => GetMinSize(instance, out minWidth, out _);
+
+ internal static InfiniFrameNativeInteropStatus GetLeft(IntPtr instance, out int left)
+ => GetPosition(instance, out left, out _);
+
+ internal static InfiniFrameNativeInteropStatus GetTop(IntPtr instance, out int top)
+ => GetPosition(instance, out _, out top);
+
+ internal static InfiniFrameNativeInteropStatus GetSize(IntPtr instance, out Size size) {
+ InfiniFrameNativeInteropStatus status = GetSize(instance, out int width, out int height);
+ size = new Size(width, height);
+ return status;
+ }
+
+ internal static InfiniFrameNativeInteropStatus GetMaxSize(IntPtr instance, out Size size) {
+ InfiniFrameNativeInteropStatus status = GetMaxSize(instance, out int width, out int height);
+ size = new Size(width, height);
+ return status;
+ }
+
+ internal static InfiniFrameNativeInteropStatus GetMinSize(IntPtr instance, out Size size) {
+ InfiniFrameNativeInteropStatus status = GetMinSize(instance, out int width, out int height);
+ size = new Size(width, height);
+ return status;
+ }
+
+ internal static InfiniFrameNativeInteropStatus GetPosition(IntPtr instance, out Point position) {
+ InfiniFrameNativeInteropStatus status = GetPosition(instance, out int left, out int top);
+ position = new Point(left, top);
+ return status;
+ }
+
+ internal static InfiniFrameNativeInteropStatus GetWindowRectangle(IntPtr instance, out int x, out int y, out int width, out int height) {
+ InfiniFrameNativeInteropStatus sizeStatus = GetSize(instance, out width, out height);
+ if (sizeStatus != InfiniFrameNativeInteropStatus.Success) {
+ x = 0;
+ y = 0;
+ return sizeStatus;
+ }
+
+ return GetPosition(instance, out x, out y);
+ }
+
+ internal static InfiniFrameNativeInteropStatus GetWindowRectangle(IntPtr instance, out Rectangle rectangle) {
+ InfiniFrameNativeInteropStatus status = GetWindowRectangle(instance, out int x, out int y, out int width, out int height);
+ rectangle = new Rectangle(x, y, width, height);
+ return status;
+ }
+
+ internal static InfiniFrameNativeInteropStatus EnsureSucceeded(InfiniFrameNativeInteropStatus status, string operationName) {
+
+ int fallbackLastError = Marshal.GetLastPInvokeError();
+
+ if (status is InfiniFrameNativeInteropStatus.Success && fallbackLastError is 0) return status;
+
+ const string noNativeMessage = "No native error message provided.";
+ string fallbackMessage = GetLastErrorMessage() ?? noNativeMessage;
+ InfiniFrameNativeInteropStatus fallbackStatus = fallbackMessage == noNativeMessage
+ ? InfiniFrameNativeInteropStatus.OperationFailed
+ : InfiniFrameNativeInteropStatus.Success;
+
+ throw new ApplicationException($"Native interop call '{operationName}' failed with unknown status state. Fallback last error {fallbackLastError}. {fallbackMessage} {fallbackStatus}");
+ }
+}
diff --git a/src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNativeInteropStatus.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/InfiniFrameNativeInteropStatus.cs
similarity index 100%
rename from src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNativeInteropStatus.cs
rename to src/InfiniFrame.NativeBridge/Managed/NativeApi/InfiniFrameNativeInteropStatus.cs
diff --git a/src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNativeTesting.cs b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Testing/InfiniFrameNative.Testing.cs
similarity index 67%
rename from src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNativeTesting.cs
rename to src/InfiniFrame.NativeBridge/Managed/NativeApi/Testing/InfiniFrameNative.Testing.cs
index cb545f853..068dbd2bf 100644
--- a/src/InfiniFrame.NativeBridge/Managed/LibraryImports/InfiniFrameNativeTesting.cs
+++ b/src/InfiniFrame.NativeBridge/Managed/NativeApi/Testing/InfiniFrameNative.Testing.cs
@@ -5,22 +5,20 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;
-using static InfiniFrame.NativeBridge.ArtifactManifest;
namespace InfiniFrame.NativeBridge;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static partial class InfiniFrameNativeTesting {
-// #if InfiniFrameNativeTestExports
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrameNativeTests_NativeParametersReturnAsIs", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+public partial class InfiniFrameNativeTesting {
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNativeTests_NativeParametersReturnAsIs", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
private static partial InfiniFrameNativeInteropStatus NativeParametersReturnAsIsNative(
[MarshalUsing(typeof(InfiniFrameNativeParametersMarshaller))]
in InfiniFrameNativeParameters parameters,
out IntPtr newParameters
);
- [LibraryImport(NativeLibraryName, EntryPoint = "InfiniFrameNativeTests_FreeInitParams", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
+ [LibraryImport(ArtifactManifest.NativeLibraryName, EntryPoint = "InfiniFrameNativeTests_FreeInitParams", SetLastError = true), UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
private static partial InfiniFrameNativeInteropStatus FreeInitParamsNative(IntPtr parameters);
///
@@ -45,15 +43,4 @@ internal static void FreeInitParams(IntPtr newParametersPtr) {
FreeInitParamsNative(newParametersPtr),
nameof(FreeInitParamsNative));
}
-// #else
-// internal static IntPtr NativeParametersReturnAsIsPtr(ref InfiniFrameNativeParameters parameters) {
-// throw new PlatformNotSupportedException("InfiniFrame native test exports are not enabled for this build.");
-// }
-//
-// internal static void FreeInitParams(IntPtr newParametersPtr) {
-// if (newParametersPtr != IntPtr.Zero) {
-// throw new PlatformNotSupportedException("InfiniFrame native test exports are not enabled for this build.");
-// }
-// }
-// #endif
}
diff --git a/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.Impl.cmake b/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.Impl.cmake
index c8dbf964f..98a514271 100644
--- a/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.Impl.cmake
+++ b/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.Impl.cmake
@@ -38,7 +38,7 @@ file(WRITE "${OUTPUT_SOURCE}" "// ----------------------------------------------
// Generated at: ${GENERATED_AT}
// -----------------------------------------------------------------------------
-#include \"Embedded/InfiniFrameJs/InfiniFrameJs.h\"
+#include \"src/Embedded/InfiniFrameJs/InfiniFrameJs.h\"
alignas(16) const unsigned char GInfiniframeJsData[] = {${BYTES}};
diff --git a/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.cmake b/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.cmake
index c070b48e2..68ee86191 100644
--- a/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.cmake
+++ b/src/InfiniFrame.NativeBridge/Native/.cmake/Embed.InfiniFrameJs.cmake
@@ -1,4 +1,4 @@
-function(infiniframe_setup_embed_js target_name)
+function(infiniframe_setup_embed_js target_name)
get_filename_component(native_dir "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/.." ABSOLUTE)
get_filename_component(native_bridge_dir "${native_dir}/.." ABSOLUTE)
get_filename_component(src_dir "${native_bridge_dir}/.." ABSOLUTE)
@@ -18,7 +18,7 @@
set(js_input "${js_project_dir}/wwwroot/InfiniFrame.js")
- set(embed_dir "${CMAKE_SOURCE_DIR}/Embedded/InfiniFrameJs")
+ set(embed_dir "${CMAKE_SOURCE_DIR}/src/Embedded/InfiniFrameJs")
set(header_output "${embed_dir}/InfiniFrameJs.h")
set(source_output "${embed_dir}/InfiniFrameJs.cpp")
diff --git a/src/InfiniFrame.NativeBridge/Native/.cmake/NativeDependencies.cmake b/src/InfiniFrame.NativeBridge/Native/.cmake/NativeDependencies.cmake
index 5a853febb..7c49a77a6 100644
--- a/src/InfiniFrame.NativeBridge/Native/.cmake/NativeDependencies.cmake
+++ b/src/InfiniFrame.NativeBridge/Native/.cmake/NativeDependencies.cmake
@@ -5,8 +5,8 @@
# - `simdjson::simdjson`
# - `simdutf::simdutf`
# - `wintoastlib::wintoastlib` (Windows only)
-# - Restores NuGet packages needed for Windows SDK-style dependencies.
-# - Reads `packages.config` as the single source of truth for package versions.
+# - Resolves NuGet packages needed for Windows SDK-style dependencies.
+# - Uses versions passed from CMake cache vars.
# - Resolves and creates imported interface targets:
# - `webview2::sdk` (Windows only)
# - `wil::headers` (Windows only)
@@ -43,27 +43,78 @@ function(_infiniframe_resolve_base_dir out_var required_relative_path)
set(${out_var} "${_resolved}" PARENT_SCOPE)
endfunction()
-# Read a NuGet package version from `packages.config`.
+# Walk parent directories from `${CMAKE_SOURCE_DIR}` to find `Directory.Packages.props`.
# Params:
-# - packages_config: absolute path to `packages.config`
-# - package_id: package id as defined in ``
-# - out_var: parent-scope variable receiving parsed version string
-# Fails with `FATAL_ERROR` when the package/version entry is missing.
-function(infiniframe_read_package_version packages_config package_id out_var)
- message(STATUS "Reading package version for '${package_id}' from ${packages_config}")
- file(READ "${packages_config}" _packages_content)
+# - out_var: parent-scope variable receiving full path when found, otherwise empty
+function(infiniframe_find_directory_packages_props out_var)
+ if (DEFINED INFINIFRAME_DIRECTORY_PACKAGES_PROPS AND NOT "${INFINIFRAME_DIRECTORY_PACKAGES_PROPS}" STREQUAL "")
+ if (EXISTS "${INFINIFRAME_DIRECTORY_PACKAGES_PROPS}")
+ set(${out_var} "${INFINIFRAME_DIRECTORY_PACKAGES_PROPS}" PARENT_SCOPE)
+ return()
+ endif ()
+ endif ()
+
+ set(_current_dir "${CMAKE_SOURCE_DIR}")
+ while (TRUE)
+ set(_candidate "${_current_dir}/Directory.Packages.props")
+ if (EXISTS "${_candidate}")
+ set(${out_var} "${_candidate}" PARENT_SCOPE)
+ return()
+ endif ()
+
+ get_filename_component(_parent_dir "${_current_dir}" DIRECTORY)
+ if ("${_parent_dir}" STREQUAL "${_current_dir}")
+ break()
+ endif ()
+ set(_current_dir "${_parent_dir}")
+ endwhile ()
+
+ set(${out_var} "" PARENT_SCOPE)
+endfunction()
+
+# Read package version from a `` entry in
+# `Directory.Packages.props`.
+# Params:
+# - props_path: full path to Directory.Packages.props
+# - package_id: e.g. `Microsoft.Web.WebView2`
+# - out_var: parent-scope variable receiving the value
+function(infiniframe_read_central_package_version props_path package_id out_var)
+ file(READ "${props_path}" _props_content)
string(REPLACE "." "\\." _package_id_regex "${package_id}")
string(
REGEX MATCH
- "]*id=\"${_package_id_regex}\"[^>]*version=\"([^\"]+)\""
+ "]*Include=\"${_package_id_regex}\"[^>]*Version=\"([^\"]+)\""
_match
- "${_packages_content}"
+ "${_props_content}"
)
if (NOT CMAKE_MATCH_1)
- message(FATAL_ERROR "${package_id} package version not found in ${packages_config}")
+ message(FATAL_ERROR "PackageVersion for '${package_id}' not found in ${props_path}")
endif ()
- message(STATUS " ${package_id} version: ${CMAKE_MATCH_1}")
- set(${out_var} "${CMAKE_MATCH_1}" PARENT_SCOPE)
+ string(STRIP "${CMAKE_MATCH_1}" _value)
+ set(${out_var} "${_value}" PARENT_SCOPE)
+endfunction()
+
+# Resolve package version from CMake cache variable or Directory.Packages.props.
+# Params:
+# - package_id: package id as defined in ``
+# - cmake_var_name: cache variable expected to contain the package version
+# - out_var: parent-scope variable receiving parsed version string
+function(infiniframe_get_package_version package_id cmake_var_name out_var)
+ if (DEFINED ${cmake_var_name} AND NOT "${${cmake_var_name}}" STREQUAL "")
+ message(STATUS "Using ${package_id} version from -D${cmake_var_name}=${${cmake_var_name}}")
+ set(${out_var} "${${cmake_var_name}}" PARENT_SCOPE)
+ return()
+ endif ()
+
+ infiniframe_find_directory_packages_props(_directory_packages_props_path)
+ if (_directory_packages_props_path)
+ infiniframe_read_central_package_version("${_directory_packages_props_path}" "${package_id}" _version_from_props)
+ message(STATUS "Using ${package_id} version from ${_directory_packages_props_path}=${_version_from_props}")
+ set(${out_var} "${_version_from_props}" PARENT_SCOPE)
+ return()
+ endif ()
+
+ message(FATAL_ERROR "Missing ${package_id} version. Pass -D${cmake_var_name}= or set -DINFINIFRAME_DIRECTORY_PACKAGES_PROPS=.")
endfunction()
# Create a vendored static library target and namespaced alias from local source/header files.
@@ -97,23 +148,6 @@ function(infiniframe_add_vendor_static_library vendor_name vendor_dir source_nam
message(STATUS " created target '${_target_name}' and alias '${vendor_name}::${vendor_name}'")
endfunction()
-# Restore NuGet packages declared in `packages.config` into `${CMAKE_SOURCE_DIR}/packages`.
-# Params:
-# - packages_config_path: path to `packages.config`
-# Fails with `FATAL_ERROR` when restore returns non-zero.
-function(infiniframe_restore_nuget_packages packages_config_path)
- message(STATUS "Restoring NuGet packages using ${packages_config_path}")
- execute_process(
- COMMAND nuget restore "${packages_config_path}" -PackagesDirectory "${CMAKE_SOURCE_DIR}/packages"
- WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
- RESULT_VARIABLE _nuget_result
- )
- if (NOT _nuget_result EQUAL 0)
- message(FATAL_ERROR "NuGet restore failed")
- endif ()
- message(STATUS "NuGet restore succeeded")
-endfunction()
-
# Determine Windows architecture folder token from current CMake generator platform.
# Params:
# - out_var: parent-scope variable receiving one of `x64` or `arm64`
@@ -138,10 +172,24 @@ endfunction()
# Fails with `FATAL_ERROR` if no candidate is valid.
function(infiniframe_resolve_webview2_base_dir webview2_version out_var)
message(STATUS "Resolving WebView2 SDK path for version ${webview2_version}")
+ set(_nuget_roots "")
+ if (DEFINED INFINIFRAME_NUGET_PACKAGES_ROOT AND NOT "${INFINIFRAME_NUGET_PACKAGES_ROOT}" STREQUAL "")
+ list(APPEND _nuget_roots "${INFINIFRAME_NUGET_PACKAGES_ROOT}")
+ endif ()
+ if (DEFINED ENV{NUGET_PACKAGES} AND NOT "$ENV{NUGET_PACKAGES}" STREQUAL "")
+ list(APPEND _nuget_roots "$ENV{NUGET_PACKAGES}")
+ endif ()
+ if (DEFINED ENV{USERPROFILE} AND NOT "$ENV{USERPROFILE}" STREQUAL "")
+ list(APPEND _nuget_roots "$ENV{USERPROFILE}/.nuget/packages")
+ endif ()
+
set(_candidates
"${CMAKE_SOURCE_DIR}/packages/Microsoft.Web.WebView2.${webview2_version}/build/native"
- "$ENV{USERPROFILE}/.nuget/packages/microsoft.web.webview2/${webview2_version}/build/native"
+ "${CMAKE_SOURCE_DIR}/packages/microsoft.web.webview2/${webview2_version}/build/native"
)
+ foreach (_root IN LISTS _nuget_roots)
+ list(APPEND _candidates "${_root}/microsoft.web.webview2/${webview2_version}/build/native")
+ endforeach ()
_infiniframe_resolve_base_dir(_base_dir "include/WebView2.h" ${_candidates})
if (NOT _base_dir)
message(FATAL_ERROR "WebView2 headers not found")
@@ -159,10 +207,24 @@ endfunction()
# Fails with `FATAL_ERROR` if neither layout exists.
function(infiniframe_resolve_wil_include_dir winimpl_version out_var)
message(STATUS "Resolving WIL include path for version ${winimpl_version}")
+ set(_nuget_roots "")
+ if (DEFINED INFINIFRAME_NUGET_PACKAGES_ROOT AND NOT "${INFINIFRAME_NUGET_PACKAGES_ROOT}" STREQUAL "")
+ list(APPEND _nuget_roots "${INFINIFRAME_NUGET_PACKAGES_ROOT}")
+ endif ()
+ if (DEFINED ENV{NUGET_PACKAGES} AND NOT "$ENV{NUGET_PACKAGES}" STREQUAL "")
+ list(APPEND _nuget_roots "$ENV{NUGET_PACKAGES}")
+ endif ()
+ if (DEFINED ENV{USERPROFILE} AND NOT "$ENV{USERPROFILE}" STREQUAL "")
+ list(APPEND _nuget_roots "$ENV{USERPROFILE}/.nuget/packages")
+ endif ()
+
set(_candidates
"${CMAKE_SOURCE_DIR}/packages/Microsoft.Windows.ImplementationLibrary.${winimpl_version}"
- "$ENV{USERPROFILE}/.nuget/packages/microsoft.windows.implementationlibrary/${winimpl_version}"
+ "${CMAKE_SOURCE_DIR}/packages/microsoft.windows.implementationlibrary/${winimpl_version}"
)
+ foreach (_root IN LISTS _nuget_roots)
+ list(APPEND _candidates "${_root}/microsoft.windows.implementationlibrary/${winimpl_version}")
+ endforeach ()
_infiniframe_resolve_base_dir(_base_include "include/wil/com.h" ${_candidates})
if (_base_include)
@@ -209,32 +271,26 @@ endfunction()
# Main module entrypoint. Sets up all dependency targets used by `InfiniFrame.Native`.
# Behavior:
# - Always configures vendored `simdjson` and `simdutf`.
-# - On Windows also configures vendored `wintoastlib`, restores NuGet, resolves
+# - On Windows also configures vendored `wintoastlib`, resolves
# WebView2/WIL from package versions, and creates imported SDK targets.
# Exports to parent scope on Windows:
# - `INFINIFRAME_WEBVIEW2_BASE_DIR`
# - `INFINIFRAME_WINDOWS_ARCH_DIR`
function(infiniframe_setup_dependencies)
message(STATUS "Setting up InfiniFrame native dependencies")
- infiniframe_add_vendor_static_library("simdjson" "${CMAKE_SOURCE_DIR}/Dependencies/simdjson" "simdjson.cpp" "simdjson.h")
- infiniframe_add_vendor_static_library("simdutf" "${CMAKE_SOURCE_DIR}/Dependencies/simdutf" "simdutf.cpp" "simdutf.h")
+ infiniframe_add_vendor_static_library("simdjson" "${CMAKE_SOURCE_DIR}/src/Dependencies/simdjson" "simdjson.cpp" "simdjson.h")
+ infiniframe_add_vendor_static_library("simdutf" "${CMAKE_SOURCE_DIR}/src/Dependencies/simdutf" "simdutf.cpp" "simdutf.h")
if (NOT WIN32)
message(STATUS "Windows-specific dependencies skipped on non-Windows host")
return()
endif ()
- infiniframe_add_vendor_static_library("wintoastlib" "${CMAKE_SOURCE_DIR}/Dependencies/wintoastlib" "wintoastlib.cpp" "wintoastlib.h")
-
- set(_packages_config_path "${CMAKE_SOURCE_DIR}/packages.config")
- if (NOT EXISTS "${_packages_config_path}")
- message(FATAL_ERROR "packages.config not found at ${_packages_config_path}")
- endif ()
+ infiniframe_add_vendor_static_library("wintoastlib" "${CMAKE_SOURCE_DIR}/src/Dependencies/wintoastlib" "wintoastlib.cpp" "wintoastlib.h")
- infiniframe_restore_nuget_packages("${_packages_config_path}")
infiniframe_detect_windows_arch_dir(_win_arch_dir)
- infiniframe_read_package_version("${_packages_config_path}" "Microsoft.Web.WebView2" _webview2_version)
- infiniframe_read_package_version("${_packages_config_path}" "Microsoft.Windows.ImplementationLibrary" _winimpl_version)
+ infiniframe_get_package_version("Microsoft.Web.WebView2" "INFINIFRAME_WEBVIEW2_VERSION" _webview2_version)
+ infiniframe_get_package_version("Microsoft.Windows.ImplementationLibrary" "INFINIFRAME_WINDOWS_IMPLEMENTATION_LIBRARY_VERSION" _winimpl_version)
infiniframe_resolve_webview2_base_dir("${_webview2_version}" _webview2_base_dir)
infiniframe_resolve_wil_include_dir("${_winimpl_version}" _wil_include_dir)
infiniframe_add_imported_windows_sdk_targets("${_webview2_base_dir}" "${_win_arch_dir}" "${_wil_include_dir}")
diff --git a/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Linux.cmake b/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Linux.cmake
index 65eb1aaec..4f388c370 100644
--- a/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Linux.cmake
+++ b/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Linux.cmake
@@ -32,6 +32,7 @@ function(infiniframe_configure_linux_target target_name common_sources test_sour
target_include_directories(${target_name} PRIVATE
"${CMAKE_SOURCE_DIR}"
+ "${CMAKE_SOURCE_DIR}/src"
${GTK3_INCLUDE_DIRS}
${WEBKIT2_INCLUDE_DIRS}
${LIBNOTIFY_INCLUDE_DIRS}
diff --git a/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.MacOS.cmake b/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.MacOS.cmake
index 90f94f39d..4d74d7bbe 100644
--- a/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.MacOS.cmake
+++ b/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.MacOS.cmake
@@ -18,7 +18,10 @@ function(infiniframe_configure_macos_target target_name common_sources test_sour
LANGUAGE OBJCXX
)
- target_include_directories(${target_name} PRIVATE "${CMAKE_SOURCE_DIR}")
+ target_include_directories(${target_name} PRIVATE
+ "${CMAKE_SOURCE_DIR}"
+ "${CMAKE_SOURCE_DIR}/src"
+ )
set_target_properties(${target_name} PROPERTIES
PREFIX ""
diff --git a/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Windows.cmake b/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Windows.cmake
index 9d327792c..c1cb1f146 100644
--- a/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Windows.cmake
+++ b/src/InfiniFrame.NativeBridge/Native/.cmake/Platform.Windows.cmake
@@ -23,6 +23,7 @@ function(infiniframe_configure_windows_target target_name common_sources test_so
target_include_directories(${target_name} PRIVATE
"${CMAKE_SOURCE_DIR}"
+ "${CMAKE_SOURCE_DIR}/src"
)
target_link_libraries(${target_name} PRIVATE
@@ -67,4 +68,4 @@ function(infiniframe_configure_windows_target target_name common_sources test_so
"$/WebView2Loader.dll"
COMMENT "Copying WebView2Loader.dll"
)
-endfunction()
\ No newline at end of file
+endfunction()
diff --git a/src/InfiniFrame.NativeBridge/Native/.idea/cmake.xml b/src/InfiniFrame.NativeBridge/Native/.idea/cmake.xml
index 5231c7877..d4f39e3ac 100644
--- a/src/InfiniFrame.NativeBridge/Native/.idea/cmake.xml
+++ b/src/InfiniFrame.NativeBridge/Native/.idea/cmake.xml
@@ -7,7 +7,7 @@
-
+
\ No newline at end of file
diff --git a/src/InfiniFrame.NativeBridge/Native/CMakeLists.txt b/src/InfiniFrame.NativeBridge/Native/CMakeLists.txt
index 9c92fcbfb..ecd670c33 100644
--- a/src/InfiniFrame.NativeBridge/Native/CMakeLists.txt
+++ b/src/InfiniFrame.NativeBridge/Native/CMakeLists.txt
@@ -34,117 +34,128 @@ infiniframe_setup_dependencies()
# Source Files
# ----------------------------------------------------------------------------------------------------------------------
set(COMMON_SOURCES
- Public/Exports/Exports.Platform.cpp
- Public/Exports/Exports.Lifecycle.cpp
- Public/Exports/Exports.WindowState.cpp
- Public/Exports/Exports.WindowCommands.cpp
- Public/Exports/Exports.Dialog.cpp
- Public/Exports/Exports.Events.cpp
- Public/Exports/Exports.Memory.cpp
- Platform/Shared/WindowEvents.cpp
- Platform/Shared/WindowState.cpp
+ src/Runtime/Shared/Window/WindowEvents.cpp
+ src/Runtime/Shared/Window/WindowState.cpp
+ src/Api/Exports/Exports.CustomSchemes.cpp
+ src/Api/Exports/Exports.Dispatch.cpp
+ src/Api/Exports/Exports.Dialog.cpp
+ src/Api/Exports/Exports.Events.cpp
+ src/Api/Exports/Exports.Lifecycle.cpp
+ src/Api/Exports/Exports.Memory.cpp
+ src/Api/Exports/Exports.Monitors.cpp
+ src/Api/Exports/Exports.Platform.MacOs.cpp
+ src/Api/Exports/Exports.Platform.Windows.cpp
+ src/Api/Exports/Exports.Window.Actions.cpp
+ src/Api/Exports/Exports.Window.Getters.cpp
+ src/Api/Exports/Exports.Window.Navigation.cpp
+ src/Api/Exports/Exports.Window.Setters.cpp
)
set(TEST_SOURCES
- Public/Exports/Exports.Tests.cpp
+ src/Api/Testing/Exports.Tests.cpp
)
set(WINDOWS_SOURCES
- Platform/Windows/Core/WindowCore.Win32.cpp
- Platform/Windows/Core/WindowTracing.Win32.cpp
- Platform/Windows/Core/WindowEncoding.Win32.cpp
- Platform/Windows/Core/WindowStorage.Win32.cpp
- Platform/Windows/Core/WindowOwnership.Win32.cpp
- Platform/Windows/Core/WindowLifecycle.Win32.cpp
- Platform/Windows/Core/WindowProc.Win32.cpp
- Platform/Windows/Core/WindowState.Win32.cpp
- Platform/Windows/Core/UiDispatcher.Win32.cpp
- Platform/Windows/WebView/WebView2Host.Win32.cpp
- Platform/Windows/WebView/WebView2Runtime.Win32.cpp
- Platform/Windows/WebView/WebView2Controller.Win32.cpp
- Platform/Windows/WebView/WebView2Attach.Win32.cpp
- Platform/Windows/WebView/WebView2CustomSchemes.Win32.cpp
- Platform/Windows/WebView/WebView2Settings.Win32.cpp
- Platform/Windows/Monitors.Win32.cpp
- Platform/Windows/Notifications.WinToast.cpp
- Platform/Windows/Dpi.Win32.cpp
- Platform/Windows/DarkMode.cpp
- Platform/Windows/Dialog.cpp
+ src/Runtime/Platform/Windows/DarkMode.h
+ src/Runtime/Platform/Windows/ToastHandler.h
+ src/Runtime/Platform/Windows/Window.Win32.Context.h
+ src/Runtime/Platform/Windows/Window.Win32.Internal.h
+
+ src/Runtime/Platform/Windows/Core/UiDispatcher.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowCore.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowEncoding.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowLifecycle.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowOwnership.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowProc.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowState.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowStorage.Win32.cpp
+ src/Runtime/Platform/Windows/Core/WindowTracing.Win32.cpp
+ src/Runtime/Platform/Windows/DarkMode.cpp
+ src/Runtime/Platform/Windows/Dialog.cpp
+ src/Runtime/Platform/Windows/Dpi.Win32.cpp
+ src/Runtime/Platform/Windows/Monitors.Win32.cpp
+ src/Runtime/Platform/Windows/Notifications.WinToast.cpp
+ src/Runtime/Platform/Windows/WebView/WebView2Attach.Win32.cpp
+ src/Runtime/Platform/Windows/WebView/WebView2Controller.Win32.cpp
+ src/Runtime/Platform/Windows/WebView/WebView2CustomSchemes.Win32.cpp
+ src/Runtime/Platform/Windows/WebView/WebView2Host.Win32.cpp
+ src/Runtime/Platform/Windows/WebView/WebView2Runtime.Win32.cpp
+ src/Runtime/Platform/Windows/WebView/WebView2Settings.Win32.cpp
)
set(LINUX_SOURCES
- Platform/Linux/Core/WindowCore.Gtk.cpp
- Platform/Linux/Core/WindowInitialization.Gtk.cpp
- Platform/Linux/Core/WindowLifecycle.Gtk.cpp
- Platform/Linux/Core/WindowState.Gtk.cpp
- Platform/Linux/Core/WindowEvents.Gtk.cpp
- Platform/Linux/Core/UiDispatcher.Gtk.cpp
- Platform/Linux/Core/WindowSignals.Gtk.cpp
- Platform/Linux/WebKit/WebKitHost.Gtk.cpp
- Platform/Linux/WebKit/WebKitSettings.Gtk.cpp
- Platform/Linux/WebKit/WebKitMessaging.Gtk.cpp
- Platform/Linux/WebKit/WebKitCustomSchemes.Gtk.cpp
- Platform/Linux/Notifications.LibNotify.cpp
- Platform/Linux/Monitors.Gtk.cpp
- Platform/Linux/Dialog.cpp
+ src/Runtime/Platform/Linux/WebKit/WebKit.Gtk.Internal.h
+ src/Runtime/Platform/Linux/Window.Gtk.Internal.h
+
+ src/Runtime/Platform/Linux/Core/UiDispatcher.Gtk.cpp
+ src/Runtime/Platform/Linux/Core/WindowCore.Gtk.cpp
+ src/Runtime/Platform/Linux/Core/WindowEvents.Gtk.cpp
+ src/Runtime/Platform/Linux/Core/WindowInitialization.Gtk.cpp
+ src/Runtime/Platform/Linux/Core/WindowLifecycle.Gtk.cpp
+ src/Runtime/Platform/Linux/Core/WindowSignals.Gtk.cpp
+ src/Runtime/Platform/Linux/Core/WindowState.Gtk.cpp
+ src/Runtime/Platform/Linux/Dialog.cpp
+ src/Runtime/Platform/Linux/Monitors.Gtk.cpp
+ src/Runtime/Platform/Linux/Notifications.LibNotify.cpp
+ src/Runtime/Platform/Linux/WebKit/WebKitCustomSchemes.Gtk.cpp
+ src/Runtime/Platform/Linux/WebKit/WebKitHost.Gtk.cpp
+ src/Runtime/Platform/Linux/WebKit/WebKitMessaging.Gtk.cpp
+ src/Runtime/Platform/Linux/WebKit/WebKitSettings.Gtk.cpp
)
set(MAC_SOURCES
- Platform/Mac/Delegates/AppDelegate.mm
- Platform/Mac/Delegates/UiDelegate.mm
- Platform/Mac/Delegates/WindowDelegate.mm
- Platform/Mac/Delegates/NavigationDelegate.mm
- Platform/Mac/Delegates/UrlSchemeHandler.mm
- Platform/Mac/NSWindowBorderless.mm
- Platform/Mac/Dialog.mm
- Platform/Mac/Notifications.UserNotifications.mm
- Platform/Mac/Monitors.Cocoa.mm
- Platform/Mac/Core/WindowCore.Cocoa.mm
- Platform/Mac/Core/WindowLifecycle.Cocoa.mm
- Platform/Mac/Core/WindowState.Cocoa.mm
- Platform/Mac/Core/WindowEvents.Cocoa.mm
- Platform/Mac/Core/UiDispatcher.Cocoa.mm
- Platform/Mac/WebKit/WebKitBridge.Cocoa.mm
- Platform/Mac/WebKit/WebKitCustomSchemes.Cocoa.mm
- Platform/Mac/WebKit/WebKitHost.Cocoa.mm
+ src/Runtime/Platform/Mac/Delegates/AppDelegate.h
+ src/Runtime/Platform/Mac/Delegates/NavigationDelegate.h
+ src/Runtime/Platform/Mac/Delegates/UiDelegate.h
+ src/Runtime/Platform/Mac/Delegates/UrlSchemeHandler.h
+ src/Runtime/Platform/Mac/Delegates/WindowDelegate.h
+ src/Runtime/Platform/Mac/NSWindowBorderless.h
+ src/Runtime/Platform/Mac/Window.Cocoa.Internal.h
+
+ src/Runtime/Platform/Mac/Core/UiDispatcher.Cocoa.mm
+ src/Runtime/Platform/Mac/Core/WindowCore.Cocoa.mm
+ src/Runtime/Platform/Mac/Core/WindowEvents.Cocoa.mm
+ src/Runtime/Platform/Mac/Core/WindowLifecycle.Cocoa.mm
+ src/Runtime/Platform/Mac/Core/WindowState.Cocoa.mm
+ src/Runtime/Platform/Mac/Delegates/AppDelegate.mm
+ src/Runtime/Platform/Mac/Delegates/NavigationDelegate.mm
+ src/Runtime/Platform/Mac/Delegates/UiDelegate.mm
+ src/Runtime/Platform/Mac/Delegates/UrlSchemeHandler.mm
+ src/Runtime/Platform/Mac/Delegates/WindowDelegate.mm
+ src/Runtime/Platform/Mac/Dialog.mm
+ src/Runtime/Platform/Mac/Monitors.Cocoa.mm
+ src/Runtime/Platform/Mac/NSWindowBorderless.mm
+ src/Runtime/Platform/Mac/Notifications.UserNotifications.mm
+ src/Runtime/Platform/Mac/WebKit/WebKitBridge.Cocoa.mm
+ src/Runtime/Platform/Mac/WebKit/WebKitCustomSchemes.Cocoa.mm
+ src/Runtime/Platform/Mac/WebKit/WebKitHost.Cocoa.mm
)
set(HEADER_FILES
- Public/InfiniFrame.h
- Public/InfiniFrameWindow.h
- Public/InfiniFrameDialog.h
- Embedded/Embedded.h
- Embedded/InfiniFrameJs/InfiniFrameJs.h
- Types/Basic.h
- Types/DialogResult.h
- Types/DialogButtons.h
- Types/DialogIcon.h
- Types/Monitor.h
- Public/InfiniFrameInitParams.h
- Types/Callbacks.h
- Utils/Dimensions.h
- Utils/ErrorCode.h
- Utils/Result.h
- Utils/StringCopy.h
- Utils/StringArrayCopy.h
- Utils/WindowsHandles.h
- Utils/Event.h
- Public/Exports/Exports.h
- Utils/ExportGuards.h
- Platform/Shared/CustomSchemeResponse.h
- Platform/Windows/ToastHandler.h
- Platform/Windows/Window.Win32.Internal.h
- Platform/Windows/Window.Win32.Context.h
- Platform/Windows/DarkMode.h
- Platform/Mac/Delegates/AppDelegate.h
- Platform/Mac/Delegates/NavigationDelegate.h
- Platform/Mac/NSWindowBorderless.h
- Platform/Mac/Delegates/UiDelegate.h
- Platform/Mac/Delegates/WindowDelegate.h
- Platform/Mac/Delegates/UrlSchemeHandler.h
- Platform/Linux/Window.Gtk.Internal.h
- Platform/Linux/WebKit/WebKit.Gtk.Internal.h
- Platform/Mac/Window.Cocoa.Internal.h
+ src/Embedded/Embedded.h
+ src/Embedded/InfiniFrameJs/InfiniFrameJs.h
+ src/Runtime/Shared/WebView/CustomSchemeResponse.h
+ src/Api/Exports/Exports.h
+ src/Api/Utilities/ExportErrorState.h
+ src/Api/Utilities/ExportExecution.h
+ src/Api/Utilities/ExportStringHelpers.h
+ src/Api/Utilities/ExportValidation.h
+ src/Api/Utilities/Utilities.h
+ src/Runtime/Shared/Window/InfiniFrame.h
+ src/Runtime/Shared/Window/InfiniFrameDialog.h
+ src/Runtime/Shared/Window/InfiniFrameInitParams.h
+ src/Runtime/Shared/Window/InfiniFrameWindow.h
+ src/Runtime/Shared/Types/Basic.h
+ src/Runtime/Shared/Types/Callbacks.h
+ src/Runtime/Shared/Types/DialogButtons.h
+ src/Runtime/Shared/Types/DialogIcon.h
+ src/Runtime/Shared/Types/DialogResult.h
+ src/Runtime/Shared/Types/Monitor.h
+ src/Runtime/Shared/Utilities/Dimensions.h
+ src/Runtime/Shared/Utilities/ErrorCode.h
+ src/Runtime/Shared/Utilities/InteropStatus.h
+ src/Runtime/Shared/Utilities/StringArrayCopy.h
+ src/Runtime/Shared/Utilities/StringCopy.h
)
if (WIN32)
diff --git a/src/InfiniFrame.NativeBridge/Native/Public/Exports/Exports.Events.cpp b/src/InfiniFrame.NativeBridge/Native/Public/Exports/Exports.Events.cpp
deleted file mode 100644
index b124e901c..000000000
--- a/src/InfiniFrame.NativeBridge/Native/Public/Exports/Exports.Events.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-// ---------------------------------------------------------------------------------------------------------------------
-// Imports
-// ---------------------------------------------------------------------------------------------------------------------
-#include "Public/Exports/Exports.h"
-// ---------------------------------------------------------------------------------------------------------------------
-// Code
-// ---------------------------------------------------------------------------------------------------------------------
-extern "C" {
-EXPORTED InteropStatus InfiniFrame_AddCustomSchemeName(InfiniFrameWindow* instance, const AutoString scheme) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- if (!EnsureNotNull(scheme, "scheme"))
- return;
- window->AddCustomSchemeName(scheme);
- });
-}
-
-EXPORTED InteropStatus InfiniFrame_GetAllMonitors(InfiniFrameWindow* instance, const GetAllMonitorsCallback callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- if (callback == nullptr)
- throw std::invalid_argument("Argument 'callback' is null.");
- window->GetAllMonitors(callback);
- });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetClosingCallback(InfiniFrameWindow* instance, const ClosingCallback callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetClosingCallback(callback); });
-}
-
-EXPORTED InteropStatus InfiniFrame_setClosedClosedCallback(InfiniFrameWindow* instance, const ClosedCallback callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetClosedCallback(callback); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetFocusInCallback(InfiniFrameWindow* instance, const FocusInCallback callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetFocusInCallback(callback); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetFocusOutCallback(InfiniFrameWindow* instance, const FocusOutCallback callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetFocusOutCallback(callback); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetMovedCallback(InfiniFrameWindow* instance, const MovedCallback callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetMovedCallback(callback); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetResizedCallback(InfiniFrameWindow* instance, const ResizedCallback callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetResizedCallback(callback); });
-}
-
-EXPORTED InteropStatus InfiniFrame_Invoke(InfiniFrameWindow* instance, const ACTION callback) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- if (callback == nullptr)
- throw std::invalid_argument("Argument 'callback' is null.");
- window->Invoke(callback);
- });
-}
-}
diff --git a/src/InfiniFrame.NativeBridge/Native/Public/Exports/Exports.WindowCommands.cpp b/src/InfiniFrame.NativeBridge/Native/Public/Exports/Exports.WindowCommands.cpp
deleted file mode 100644
index 4d3819fd8..000000000
--- a/src/InfiniFrame.NativeBridge/Native/Public/Exports/Exports.WindowCommands.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// ---------------------------------------------------------------------------------------------------------------------
-// Imports
-// ---------------------------------------------------------------------------------------------------------------------
-#include "Public/Exports/Exports.h"
-// ---------------------------------------------------------------------------------------------------------------------
-// Code
-// ---------------------------------------------------------------------------------------------------------------------
-extern "C" {
-EXPORTED InteropStatus InfiniFrame_Center(InfiniFrameWindow* instance) {
- return RunWindowExportStatus(instance, [](InfiniFrameWindow* window) { window->Center(); });
-}
-
-EXPORTED InteropStatus InfiniFrame_ClearBrowserAutoFill(InfiniFrameWindow* instance) {
- return RunWindowExportStatus(instance, [](InfiniFrameWindow* window) { window->ClearBrowserAutoFill(); });
-}
-
-EXPORTED InteropStatus InfiniFrame_NavigateToString(InfiniFrameWindow* instance, const AutoString content) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- if (!EnsureNotNull(content, "content"))
- return;
- window->NavigateToString(content);
- });
-}
-
-EXPORTED InteropStatus InfiniFrame_NavigateToUrl(InfiniFrameWindow* instance, const AutoString url) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- if (!EnsureNotNull(url, "url"))
- return;
- window->NavigateToUrl(url);
- });
-}
-
-EXPORTED InteropStatus InfiniFrame_Restore(InfiniFrameWindow* instance) {
- return RunWindowExportStatus(instance, [](InfiniFrameWindow* window) { window->Restore(); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SendWebMessage(InfiniFrameWindow* instance, const AutoString message) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- window->SendWebMessage(NullToEmpty(message));
- });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetTransparentEnabled(InfiniFrameWindow* instance, const bool enabled) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetTransparentEnabled(enabled); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetContextMenuEnabled(InfiniFrameWindow* instance, const bool enabled) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetContextMenuEnabled(enabled); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetZoomEnabled(InfiniFrameWindow* instance, const bool enabled) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetZoomEnabled(enabled); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetDevToolsEnabled(InfiniFrameWindow* instance, const bool enabled) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetDevToolsEnabled(enabled); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetFullScreen(InfiniFrameWindow* instance, const bool fullScreen) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetFullScreen(fullScreen); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetIconFile(InfiniFrameWindow* instance, const AutoString filename) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- window->SetIconFile(NullToEmpty(filename));
- });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetMaximized(InfiniFrameWindow* instance, const bool maximized) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetMaximized(maximized); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetMaxSize(InfiniFrameWindow* instance, const int width, const int height) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetMaxSize(width, height); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetMinimized(InfiniFrameWindow* instance, const bool minimized) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetMinimized(minimized); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetMinSize(InfiniFrameWindow* instance, const int width, const int height) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetMinSize(width, height); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetPosition(InfiniFrameWindow* instance, const int x, const int y) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetPosition(x, y); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetResizable(InfiniFrameWindow* instance, const bool resizable) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetResizable(resizable); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetSize(InfiniFrameWindow* instance, const int width, const int height) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetSize(width, height); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetTitle(InfiniFrameWindow* instance, const AutoString title) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetTitle(NullToEmpty(title)); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetTopmost(InfiniFrameWindow* instance, const bool topmost) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetTopmost(topmost); });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetZoom(InfiniFrameWindow* instance, const int zoom) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) { window->SetZoom(zoom); });
-}
-
-EXPORTED InteropStatus
-InfiniFrame_ShowNotification(InfiniFrameWindow* instance, const AutoString title, const AutoString body) {
- return RunWindowExportStatus(instance, [&](InfiniFrameWindow* window) {
- window->ShowNotification(NullToEmpty(title), NullToEmpty(body));
- });
-}
-
-EXPORTED InteropStatus InfiniFrame_SetFocused(InfiniFrameWindow* instance) {
- return RunWindowExportStatus(instance, [](InfiniFrameWindow* window) { window->SetFocused(); });
-}
-}
diff --git a/src/InfiniFrame.NativeBridge/Native/Public/InfiniFrame.h b/src/InfiniFrame.NativeBridge/Native/Public/InfiniFrame.h
deleted file mode 100644
index 5ded59cf3..000000000
--- a/src/InfiniFrame.NativeBridge/Native/Public/InfiniFrame.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-// ---------------------------------------------------------------------------------------------------------------------
-// Imports
-// ---------------------------------------------------------------------------------------------------------------------
-#include "Public/InfiniFrameInitParams.h"
-#include "Public/InfiniFrameWindow.h"
-#include "Public/InfiniFrameDialog.h"
-
-#include "Types/Basic.h"
-#include "Types/Callbacks.h"
-
-#include "Utils/Dimensions.h"
-#include "Utils/StringCopy.h"
-#include "Utils/Event.h"
diff --git a/src/InfiniFrame.NativeBridge/Native/Utils/Event.h b/src/InfiniFrame.NativeBridge/Native/Utils/Event.h
deleted file mode 100644
index 54f9db76c..000000000
--- a/src/InfiniFrame.NativeBridge/Native/Utils/Event.h
+++ /dev/null
@@ -1,140 +0,0 @@
-#pragma once
-// ---------------------------------------------------------------------------------------------------------------------
-// Imports
-// ---------------------------------------------------------------------------------------------------------------------
-#include
-#include