[PATCH 0/9] Implement DInput8 mouse using RawInput and XInput2 RawEvents only
Rémi Bernon
rbernon at codeweavers.com
Wed Sep 25 04:35:36 CDT 2019
This patch series should fix several spurious mouse movement issues
that has been reported in recent Unity Engine versions, but in other
games such as Fallout 4 as well.
AFAICS the issue comes from the combination of:
1) The reconciliation that is done between relative mouse movements as
received from RawMotion XInput2 events and the absolute mouse
position received from MotionNotify and ButtonPress/ButtonRelease
events and the order they are received in.
2) The rapid activation and deactivation of XInput2 events that happens
every time the cursor clipping rectangle is reset - and several games
do that on every frame.
This first implements dinput8 mouse on top of RawInput API instead of
low-level mouse hooks. Then, to address 1) it makes XInput2 raw events
the only source of information for the mouse RawInput messages; and to
address 2) we now always listen to these events, from the desktop
window thread.
The first two patches have already been sent as part of the patches
implementing WM_INPUT messages for HID devices [1].
Patches 3-6 would also be re-used for the dinput8 keyboard state
inconsistency issue while windows are in background - if listening to
keyboard events while in background is deemed acceptable.
[1] https://www.winehq.org/pipermail/wine-devel/2019-September/151003.html
Rémi Bernon (9):
server: Add send_hardware_message flags for rawinput translation.
server: Implement rawinput hardware message broadcast.
user32: Add __wine_send_input flags to hint raw input translation.
user32: Add support for RIDEV_INPUTSINK flag in
RegisterRawInputDevices.
user32: Implement GetRegisteredRawInputDevices.
dinput8: Add support for dinput devices that use raw input interface.
dinput8: Use raw input interface for dinput8 mouse device.
winex11.drv: Advertise XInput2 version 2.1 support.
winex11.drv: Listen to RawMotion and RawButton* events in the desktop
thread.
dlls/dinput/device_private.h | 3 +
dlls/dinput/dinput_main.c | 84 +++++++++++++++++++-
dlls/dinput/mouse.c | 117 ++++++++++++++++++++++++++-
dlls/dinput8/tests/device.c | 23 +-----
dlls/user32/input.c | 4 +-
dlls/user32/rawinput.c | 64 ++++++++++++++-
dlls/user32/tests/rawinput.c | 2 -
dlls/user32/user32.spec | 2 +-
dlls/wineandroid.drv/keyboard.c | 2 +-
dlls/wineandroid.drv/window.c | 4 +-
dlls/winemac.drv/ime.c | 4 +-
dlls/winemac.drv/keyboard.c | 2 +-
dlls/winemac.drv/mouse.c | 2 +-
dlls/winex11.drv/event.c | 10 ++-
dlls/winex11.drv/keyboard.c | 2 +-
dlls/winex11.drv/mouse.c | 128 +++++++++++++++++-------------
dlls/winex11.drv/x11drv.h | 6 +-
dlls/winex11.drv/x11drv_main.c | 4 +
include/winuser.h | 2 +-
server/protocol.def | 9 +++
server/queue.c | 135 ++++++++++++++++++++++++++------
21 files changed, 489 insertions(+), 120 deletions(-)
--
2.23.0
More information about the wine-devel
mailing list