mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 08:18:58 -06:00 
			
		
		
		
	Passthrough mouse for win32 (#6450)
* passthrough mouse for win32 * remove unused enums
This commit is contained in:
		@@ -8,6 +8,8 @@ namespace Ryujinx.Ava.UI.Helpers
 | 
			
		||||
    [SupportedOSPlatform("windows")]
 | 
			
		||||
    internal partial class Win32NativeInterop
 | 
			
		||||
    {
 | 
			
		||||
        internal const int GWLP_WNDPROC = -4;
 | 
			
		||||
 | 
			
		||||
        [Flags]
 | 
			
		||||
        public enum ClassStyles : uint
 | 
			
		||||
        {
 | 
			
		||||
@@ -29,22 +31,7 @@ namespace Ryujinx.Ava.UI.Helpers
 | 
			
		||||
        [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,
 | 
			
		||||
            NcHitTest = 0x0084,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [UnmanagedFunctionPointer(CallingConvention.Winapi)]
 | 
			
		||||
@@ -121,5 +108,11 @@ namespace Ryujinx.Ava.UI.Helpers
 | 
			
		||||
           IntPtr hMenu,
 | 
			
		||||
           IntPtr hInstance,
 | 
			
		||||
           IntPtr lpParam);
 | 
			
		||||
 | 
			
		||||
        [LibraryImport("user32.dll", SetLastError = true)]
 | 
			
		||||
        public static partial IntPtr SetWindowLongPtrW(IntPtr hWnd, int nIndex, IntPtr value);
 | 
			
		||||
 | 
			
		||||
        [LibraryImport("user32.dll", SetLastError = true)]
 | 
			
		||||
        public static partial IntPtr SetWindowLongW(IntPtr hWnd, int nIndex, int value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -141,80 +141,10 @@ namespace Ryujinx.Ava.UI.Renderer
 | 
			
		||||
 | 
			
		||||
            _wndProcDelegate = delegate (IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam)
 | 
			
		||||
            {
 | 
			
		||||
                if (VisualRoot != null)
 | 
			
		||||
                switch (msg)
 | 
			
		||||
                {
 | 
			
		||||
                    if (msg == WindowsMessages.Lbuttondown ||
 | 
			
		||||
                        msg == WindowsMessages.Rbuttondown ||
 | 
			
		||||
                        msg == WindowsMessages.Lbuttonup ||
 | 
			
		||||
                        msg == WindowsMessages.Rbuttonup ||
 | 
			
		||||
                        msg == WindowsMessages.Mousemove)
 | 
			
		||||
                    {
 | 
			
		||||
                        Point rootVisualPosition = this.TranslatePoint(new Point((long)lParam & 0xFFFF, (long)lParam >> 16 & 0xFFFF), this).Value;
 | 
			
		||||
                        Pointer pointer = new(0, PointerType.Mouse, true);
 | 
			
		||||
 | 
			
		||||
#pragma warning disable CS0618 // Type or member is obsolete (As of Avalonia 11, the constructors for PointerPressedEventArgs & PointerEventArgs are marked as obsolete)
 | 
			
		||||
                        switch (msg)
 | 
			
		||||
                        {
 | 
			
		||||
                            case WindowsMessages.Lbuttondown:
 | 
			
		||||
                            case WindowsMessages.Rbuttondown:
 | 
			
		||||
                                {
 | 
			
		||||
                                    bool isLeft = msg == WindowsMessages.Lbuttondown;
 | 
			
		||||
                                    RawInputModifiers pointerPointModifier = isLeft ? RawInputModifiers.LeftMouseButton : RawInputModifiers.RightMouseButton;
 | 
			
		||||
                                    PointerPointProperties properties = new(pointerPointModifier, isLeft ? PointerUpdateKind.LeftButtonPressed : PointerUpdateKind.RightButtonPressed);
 | 
			
		||||
 | 
			
		||||
                                    var evnt = new PointerPressedEventArgs(
 | 
			
		||||
                                        this,
 | 
			
		||||
                                        pointer,
 | 
			
		||||
                                        this,
 | 
			
		||||
                                        rootVisualPosition,
 | 
			
		||||
                                        (ulong)Environment.TickCount64,
 | 
			
		||||
                                        properties,
 | 
			
		||||
                                        KeyModifiers.None);
 | 
			
		||||
 | 
			
		||||
                                    RaiseEvent(evnt);
 | 
			
		||||
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                            case WindowsMessages.Lbuttonup:
 | 
			
		||||
                            case WindowsMessages.Rbuttonup:
 | 
			
		||||
                                {
 | 
			
		||||
                                    bool isLeft = msg == WindowsMessages.Lbuttonup;
 | 
			
		||||
                                    RawInputModifiers pointerPointModifier = isLeft ? RawInputModifiers.LeftMouseButton : RawInputModifiers.RightMouseButton;
 | 
			
		||||
                                    PointerPointProperties properties = new(pointerPointModifier, isLeft ? PointerUpdateKind.LeftButtonReleased : PointerUpdateKind.RightButtonReleased);
 | 
			
		||||
 | 
			
		||||
                                    var evnt = new PointerReleasedEventArgs(
 | 
			
		||||
                                        this,
 | 
			
		||||
                                        pointer,
 | 
			
		||||
                                        this,
 | 
			
		||||
                                        rootVisualPosition,
 | 
			
		||||
                                        (ulong)Environment.TickCount64,
 | 
			
		||||
                                        properties,
 | 
			
		||||
                                        KeyModifiers.None,
 | 
			
		||||
                                        isLeft ? MouseButton.Left : MouseButton.Right);
 | 
			
		||||
 | 
			
		||||
                                    RaiseEvent(evnt);
 | 
			
		||||
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                            case WindowsMessages.Mousemove:
 | 
			
		||||
                                {
 | 
			
		||||
                                    var evnt = new PointerEventArgs(
 | 
			
		||||
                                        PointerMovedEvent,
 | 
			
		||||
                                        this,
 | 
			
		||||
                                        pointer,
 | 
			
		||||
                                        this,
 | 
			
		||||
                                        rootVisualPosition,
 | 
			
		||||
                                        (ulong)Environment.TickCount64,
 | 
			
		||||
                                        new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.Other),
 | 
			
		||||
                                        KeyModifiers.None);
 | 
			
		||||
 | 
			
		||||
                                    RaiseEvent(evnt);
 | 
			
		||||
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                        }
 | 
			
		||||
#pragma warning restore CS0618
 | 
			
		||||
                    }
 | 
			
		||||
                    case WindowsMessages.NcHitTest:
 | 
			
		||||
                        return -1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return DefWindowProc(hWnd, msg, wParam, lParam);
 | 
			
		||||
@@ -234,6 +164,8 @@ namespace Ryujinx.Ava.UI.Renderer
 | 
			
		||||
 | 
			
		||||
            WindowHandle = CreateWindowEx(0, _className, "NativeWindow", WindowStyles.WsChild, 0, 0, 640, 480, control.Handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
 | 
			
		||||
 | 
			
		||||
            SetWindowLongPtrW(control.Handle, GWLP_WNDPROC, wndClassEx.lpfnWndProc);
 | 
			
		||||
 | 
			
		||||
            Marshal.FreeHGlobal(wndClassEx.lpszClassName);
 | 
			
		||||
 | 
			
		||||
            return new PlatformHandle(WindowHandle, "HWND");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user