mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-10-31 01:02:51 +00:00 
			
		
		
		
	Passthrough mouse for win32 (#6450)
* passthrough mouse for win32 * remove unused enums
This commit is contained in:
		
							parent
							
								
									5a900f38c5
								
							
						
					
					
						commit
						8354434a37
					
				| @ -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"); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Emmanuel Hansen
						Emmanuel Hansen