aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs
diff options
context:
space:
mode:
authorMary Guillemard <mary@mary.zone>2024-03-02 12:51:05 +0100
committerGitHub <noreply@github.com>2024-03-02 12:51:05 +0100
commitec6cb0abb4b7669895b6e96fd7581c93b5abd691 (patch)
tree128c862ff5faea0b219467656d4023bee7faefb5 /src/Ryujinx/UI/Helpers/Win32NativeInterop.cs
parent53b5985da6b9d7b281d9fc25b93bfd1d1918a107 (diff)
infra: Make Avalonia the default UI (#6375)1.1.1216
* misc: Move Ryujinx project to Ryujinx.Gtk3 This breaks release CI for now but that's fine. Signed-off-by: Mary Guillemard <mary@mary.zone> * misc: Move Ryujinx.Ava project to Ryujinx This breaks CI for now, but it's fine. Signed-off-by: Mary Guillemard <mary@mary.zone> * infra: Make Avalonia the default UI Should fix CI after the previous changes. GTK3 isn't build by the release job anymore, only by PR CI. This also ensure that the test-ava update package is still generated to allow update from the old testing channel. Signed-off-by: Mary Guillemard <mary@mary.zone> * Fix missing copy in create_app_bundle.sh Signed-off-by: Mary Guillemard <mary@mary.zone> * Fix syntax error Signed-off-by: Mary Guillemard <mary@mary.zone> --------- Signed-off-by: Mary Guillemard <mary@mary.zone>
Diffstat (limited to 'src/Ryujinx/UI/Helpers/Win32NativeInterop.cs')
-rw-r--r--src/Ryujinx/UI/Helpers/Win32NativeInterop.cs125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs b/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs
new file mode 100644
index 00000000..4834df80
--- /dev/null
+++ b/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs
@@ -0,0 +1,125 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
+
+namespace Ryujinx.Ava.UI.Helpers
+{
+ [SupportedOSPlatform("windows")]
+ internal partial class Win32NativeInterop
+ {
+ [Flags]
+ public enum ClassStyles : uint
+ {
+ CsClassdc = 0x40,
+ CsOwndc = 0x20,
+ }
+
+ [Flags]
+ public enum WindowStyles : uint
+ {
+ WsChild = 0x40000000,
+ }
+
+ public enum Cursors : uint
+ {
+ IdcArrow = 32512,
+ }
+
+ [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")]
+ public enum WindowsMessages : uint
+ {
+ Mousemove = 0x0200,
+ Lbuttondown = 0x0201,
+ Lbuttonup = 0x0202,
+ Lbuttondblclk = 0x0203,
+ Rbuttondown = 0x0204,
+ Rbuttonup = 0x0205,
+ Rbuttondblclk = 0x0206,
+ Mbuttondown = 0x0207,
+ Mbuttonup = 0x0208,
+ Mbuttondblclk = 0x0209,
+ Mousewheel = 0x020A,
+ Xbuttondown = 0x020B,
+ Xbuttonup = 0x020C,
+ Xbuttondblclk = 0x020D,
+ Mousehwheel = 0x020E,
+ Mouselast = 0x020E,
+ }
+
+ [UnmanagedFunctionPointer(CallingConvention.Winapi)]
+ internal delegate IntPtr WindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam);
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct WndClassEx
+ {
+ public int cbSize;
+ public ClassStyles style;
+ public IntPtr lpfnWndProc; // not WndProc
+ public int cbClsExtra;
+ public int cbWndExtra;
+ public IntPtr hInstance;
+ public IntPtr hIcon;
+ public IntPtr hCursor;
+ public IntPtr hbrBackground;
+ public IntPtr lpszMenuName;
+ public IntPtr lpszClassName;
+ public IntPtr hIconSm;
+
+ public WndClassEx()
+ {
+ cbSize = Marshal.SizeOf<WndClassEx>();
+ }
+ }
+
+ public static IntPtr CreateEmptyCursor()
+ {
+ return CreateCursor(IntPtr.Zero, 0, 0, 1, 1, new byte[] { 0xFF }, new byte[] { 0x00 });
+ }
+
+ public static IntPtr CreateArrowCursor()
+ {
+ return LoadCursor(IntPtr.Zero, (IntPtr)Cursors.IdcArrow);
+ }
+
+ [LibraryImport("user32.dll")]
+ public static partial IntPtr SetCursor(IntPtr handle);
+
+ [LibraryImport("user32.dll")]
+ public static partial IntPtr CreateCursor(IntPtr hInst, int xHotSpot, int yHotSpot, int nWidth, int nHeight, [In] byte[] pvAndPlane, [In] byte[] pvXorPlane);
+
+ [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "RegisterClassExW")]
+ public static partial ushort RegisterClassEx(ref WndClassEx param);
+
+ [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "UnregisterClassW")]
+ public static partial short UnregisterClass([MarshalAs(UnmanagedType.LPWStr)] string lpClassName, IntPtr instance);
+
+ [LibraryImport("user32.dll", EntryPoint = "DefWindowProcW")]
+ public static partial IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam);
+
+ [LibraryImport("kernel32.dll", EntryPoint = "GetModuleHandleA")]
+ public static partial IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPStr)] string lpModuleName);
+
+ [LibraryImport("user32.dll", SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static partial bool DestroyWindow(IntPtr hwnd);
+
+ [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "LoadCursorA")]
+ public static partial IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
+
+ [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "CreateWindowExW")]
+ public static partial IntPtr CreateWindowEx(
+ uint dwExStyle,
+ [MarshalAs(UnmanagedType.LPWStr)] string lpClassName,
+ [MarshalAs(UnmanagedType.LPWStr)] string lpWindowName,
+ WindowStyles dwStyle,
+ int x,
+ int y,
+ int nWidth,
+ int nHeight,
+ IntPtr hWndParent,
+ IntPtr hMenu,
+ IntPtr hInstance,
+ IntPtr lpParam);
+ }
+}