mirror of
https://github.com/ryujinx-mirror/ryujinx.git
synced 2024-11-22 01:55:10 +00:00
Passthrough mouse for win32 (#6450)
* passthrough mouse for win32 * remove unused enums
This commit is contained in:
parent
5a900f38c5
commit
8354434a37
2 changed files with 14 additions and 89 deletions
|
@ -8,6 +8,8 @@ namespace Ryujinx.Ava.UI.Helpers
|
||||||
[SupportedOSPlatform("windows")]
|
[SupportedOSPlatform("windows")]
|
||||||
internal partial class Win32NativeInterop
|
internal partial class Win32NativeInterop
|
||||||
{
|
{
|
||||||
|
internal const int GWLP_WNDPROC = -4;
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum ClassStyles : uint
|
public enum ClassStyles : uint
|
||||||
{
|
{
|
||||||
|
@ -29,22 +31,7 @@ namespace Ryujinx.Ava.UI.Helpers
|
||||||
[SuppressMessage("Design", "CA1069: Enums values should not be duplicated")]
|
[SuppressMessage("Design", "CA1069: Enums values should not be duplicated")]
|
||||||
public enum WindowsMessages : uint
|
public enum WindowsMessages : uint
|
||||||
{
|
{
|
||||||
Mousemove = 0x0200,
|
NcHitTest = 0x0084,
|
||||||
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)]
|
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
|
||||||
|
@ -121,5 +108,11 @@ namespace Ryujinx.Ava.UI.Helpers
|
||||||
IntPtr hMenu,
|
IntPtr hMenu,
|
||||||
IntPtr hInstance,
|
IntPtr hInstance,
|
||||||
IntPtr lpParam);
|
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)
|
_wndProcDelegate = delegate (IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
if (VisualRoot != null)
|
switch (msg)
|
||||||
{
|
{
|
||||||
if (msg == WindowsMessages.Lbuttondown ||
|
case WindowsMessages.NcHitTest:
|
||||||
msg == WindowsMessages.Rbuttondown ||
|
return -1;
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
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);
|
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);
|
Marshal.FreeHGlobal(wndClassEx.lpszClassName);
|
||||||
|
|
||||||
return new PlatformHandle(WindowHandle, "HWND");
|
return new PlatformHandle(WindowHandle, "HWND");
|
||||||
|
|
Loading…
Reference in a new issue