[PATCH v2 3/5] user32: Add RAWINPUT parameter to __wine_send_input.

Rémi Bernon rbernon at codeweavers.com
Wed Apr 14 17:23:48 CDT 2021


On 4/9/21 1:11 PM, Rémi Bernon wrote:
> And send_hardware_message.
> 
> This makes it possible to use __wine_send_input to send extended input
> data, such as HID device notifications and WM_INPUT messages carrying
> HID reports.
> 
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
>   dlls/user32/input.c             | 6 +++---
>   dlls/user32/message.c           | 2 +-
>   dlls/user32/user32.spec         | 2 +-
>   dlls/user32/user_private.h      | 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/keyboard.c     | 2 +-
>   dlls/winex11.drv/mouse.c        | 8 ++++----
>   include/winuser.h               | 2 +-
>   12 files changed, 19 insertions(+), 19 deletions(-)
> 
> diff --git a/dlls/user32/input.c b/dlls/user32/input.c
> index 7cf7e53a6c8..805bfe3e9de 100644
> --- a/dlls/user32/input.c
> +++ b/dlls/user32/input.c
> @@ -119,9 +119,9 @@ BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret )
>    *
>    * Internal SendInput function to allow the graphics driver to inject real events.
>    */
> -BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input )
> +BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input, const RAWINPUT *rawinput )
>   {
> -    NTSTATUS status = send_hardware_message( hwnd, input, 0 );
> +    NTSTATUS status = send_hardware_message( hwnd, input, rawinput, 0 );
>       if (status) SetLastError( RtlNtStatusToDosError(status) );
>       return !status;
>   }
> @@ -210,7 +210,7 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
>               update_mouse_coords( &input );
>               /* fallthrough */
>           case INPUT_KEYBOARD:
> -            status = send_hardware_message( 0, &input, SEND_HWMSG_INJECTED );
> +            status = send_hardware_message( 0, &input, NULL, SEND_HWMSG_INJECTED );
>               break;
>           case INPUT_HARDWARE:
>               SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
> diff --git a/dlls/user32/message.c b/dlls/user32/message.c
> index def59998a52..f87ef9fb3af 100644
> --- a/dlls/user32/message.c
> +++ b/dlls/user32/message.c
> @@ -3227,7 +3227,7 @@ static BOOL send_message( struct send_message_info *info, DWORD_PTR *res_ptr, BO
>   /***********************************************************************
>    *		send_hardware_message
>    */
> -NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags )
> +NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *rawinput, UINT flags )
>   {
>       struct user_key_state_info *key_state_info = get_user_thread_info()->key_state;
>       struct send_message_info info;
> diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
> index 4ef75247d71..190ee74fd6c 100644
> --- a/dlls/user32/user32.spec
> +++ b/dlls/user32/user32.spec
> @@ -834,5 +834,5 @@
>   # All functions must be prefixed with '__wine_' (for internal functions)
>   # or 'wine_' (for user-visible functions) to avoid namespace conflicts.
>   #
> -@ cdecl __wine_send_input(long ptr)
> +@ cdecl __wine_send_input(long ptr ptr)
>   @ cdecl __wine_set_pixel_format(long long)
> diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
> index 7761a1ceb4f..dfd52421e66 100644
> --- a/dlls/user32/user_private.h
> +++ b/dlls/user32/user_private.h
> @@ -263,7 +263,7 @@ extern RECT get_virtual_screen_rect(void) DECLSPEC_HIDDEN;
>   extern LRESULT call_current_hook( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam ) DECLSPEC_HIDDEN;
>   extern DWORD get_input_codepage( void ) DECLSPEC_HIDDEN;
>   extern BOOL map_wparam_AtoW( UINT message, WPARAM *wparam, enum wm_char_mapping mapping ) DECLSPEC_HIDDEN;
> -extern NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) DECLSPEC_HIDDEN;
> +extern NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *rawinput, UINT flags ) DECLSPEC_HIDDEN;
>   extern LRESULT MSG_SendInternalMessageTimeout( DWORD dest_pid, DWORD dest_tid,
>                                                  UINT msg, WPARAM wparam, LPARAM lparam,
>                                                  UINT flags, UINT timeout, PDWORD_PTR res_ptr ) DECLSPEC_HIDDEN;
> diff --git a/dlls/wineandroid.drv/keyboard.c b/dlls/wineandroid.drv/keyboard.c
> index 1c8a1e4f68f..0a6ede0ec5f 100644
> --- a/dlls/wineandroid.drv/keyboard.c
> +++ b/dlls/wineandroid.drv/keyboard.c
> @@ -680,7 +680,7 @@ static void send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD flags )
>       input.u.ki.time        = 0;
>       input.u.ki.dwExtraInfo = 0;
>   
> -    __wine_send_input( hwnd, &input );
> +    __wine_send_input( hwnd, &input, NULL );
>   }
>   
>   /***********************************************************************
> diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c
> index 79bc471a984..1cb1bbbadc9 100644
> --- a/dlls/wineandroid.drv/window.c
> +++ b/dlls/wineandroid.drv/window.c
> @@ -521,7 +521,7 @@ static int process_events( DWORD mask )
>                       }
>                       SERVER_END_REQ;
>                   }
> -                __wine_send_input( capture ? capture : event->data.motion.hwnd, &event->data.motion.input );
> +                __wine_send_input( capture ? capture : event->data.motion.hwnd, &event->data.motion.input, NULL );
>               }
>               break;
>   
> @@ -535,7 +535,7 @@ static int process_events( DWORD mask )
>                         event->data.kbd.input.u.ki.wVk, event->data.kbd.input.u.ki.wVk,
>                         event->data.kbd.input.u.ki.wScan );
>               update_keyboard_lock_state( event->data.kbd.input.u.ki.wVk, event->data.kbd.lock_state );
> -            __wine_send_input( 0, &event->data.kbd.input );
> +            __wine_send_input( 0, &event->data.kbd.input, NULL );
>               break;
>   
>           default:
> diff --git a/dlls/winemac.drv/ime.c b/dlls/winemac.drv/ime.c
> index dabe6654f98..f2368c10743 100644
> --- a/dlls/winemac.drv/ime.c
> +++ b/dlls/winemac.drv/ime.c
> @@ -1427,10 +1427,10 @@ void macdrv_im_set_text(const macdrv_event *event)
>               {
>                   input.ki.wScan      = chars[i];
>                   input.ki.dwFlags    = KEYEVENTF_UNICODE;
> -                __wine_send_input(hwnd, &input);
> +                __wine_send_input(hwnd, &input, NULL);
>   
>                   input.ki.dwFlags    = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
> -                __wine_send_input(hwnd, &input);
> +                __wine_send_input(hwnd, &input, NULL);
>               }
>           }
>   
> diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c
> index 1b74300e93a..1ea15f59341 100644
> --- a/dlls/winemac.drv/keyboard.c
> +++ b/dlls/winemac.drv/keyboard.c
> @@ -929,7 +929,7 @@ static void macdrv_send_keyboard_input(HWND hwnd, WORD vkey, WORD scan, DWORD fl
>       input.ki.time           = time;
>       input.ki.dwExtraInfo    = 0;
>   
> -    __wine_send_input(hwnd, &input);
> +    __wine_send_input(hwnd, &input, NULL);
>   }
>   
>   
> diff --git a/dlls/winemac.drv/mouse.c b/dlls/winemac.drv/mouse.c
> index dd6443fe1ba..d2278ae0e4c 100644
> --- a/dlls/winemac.drv/mouse.c
> +++ b/dlls/winemac.drv/mouse.c
> @@ -165,7 +165,7 @@ static void send_mouse_input(HWND hwnd, macdrv_window cocoa_window, UINT flags,
>       input.mi.time           = time;
>       input.mi.dwExtraInfo    = 0;
>   
> -    __wine_send_input(top_level_hwnd, &input);
> +    __wine_send_input(top_level_hwnd, &input, NULL);
>   }
>   
>   
> diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
> index 35a801fc895..01620c5e4a4 100644
> --- a/dlls/winex11.drv/keyboard.c
> +++ b/dlls/winex11.drv/keyboard.c
> @@ -1148,7 +1148,7 @@ static void X11DRV_send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD f
>       input.u.ki.time        = time;
>       input.u.ki.dwExtraInfo = 0;
>   
> -    __wine_send_input( hwnd, &input );
> +    __wine_send_input( hwnd, &input, NULL );
>   }
>   
>   
> diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
> index 94dece652b6..42bac332664 100644
> --- a/dlls/winex11.drv/mouse.c
> +++ b/dlls/winex11.drv/mouse.c
> @@ -659,7 +659,7 @@ static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPU
>               sync_window_cursor( window );
>               last_cursor_change = input->u.mi.time;
>           }
> -        __wine_send_input( hwnd, input );
> +        __wine_send_input( hwnd, input, NULL );
>           return;
>       }
>   
> @@ -699,7 +699,7 @@ static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPU
>           SERVER_END_REQ;
>       }
>   
> -    __wine_send_input( hwnd, input );
> +    __wine_send_input( hwnd, input, NULL );
>   }
>   
>   #ifdef SONAME_LIBXCURSOR
> @@ -1669,7 +1669,7 @@ void move_resize_window( HWND hwnd, int dir )
>               input.u.mi.dwFlags     = button_up_flags[button - 1] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
>               input.u.mi.time        = GetTickCount();
>               input.u.mi.dwExtraInfo = 0;
> -            __wine_send_input( hwnd, &input );
> +            __wine_send_input( hwnd, &input, NULL );
>           }
>   
>           while (PeekMessageW( &msg, 0, 0, 0, PM_REMOVE ))
> @@ -1900,7 +1900,7 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
>       TRACE( "pos %d,%d (event %f,%f)\n", input.u.mi.dx, input.u.mi.dy, dx, dy );
>   
>       input.type = INPUT_MOUSE;
> -    __wine_send_input( 0, &input );
> +    __wine_send_input( 0, &input, NULL );
>       return TRUE;
>   }
>   
> diff --git a/include/winuser.h b/include/winuser.h
> index 53661f6c788..0b1571c0a95 100644
> --- a/include/winuser.h
> +++ b/include/winuser.h
> @@ -4406,7 +4406,7 @@ static inline BOOL WINAPI SetRectEmpty(LPRECT rect)
>   WORD        WINAPI SYSTEM_KillSystemTimer( WORD );
>   
>   #ifdef __WINESRC__
> -WINUSERAPI BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input );
> +WINUSERAPI BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input, const RAWINPUT *rawinput );
>   #endif
>   
>   #ifdef __cplusplus
> 

Hi,

I'm a bit confused about this, as the first two patches have been 
accepted but not this one.

I think the changes here are pretty straightforward, so does this mean 
that this should be done some other way? Maybe I should start 
implementing the handling of the rawinput data first? I did it by 
sending the data first to avoid adding dead code, but I don't really mind.

The winuser.h changes forces a rebuild of a lot of things, so this patch 
takes a long time on the testbot, as well as any patches sent with it, 
so I would love a few hints before resending it.

Cheers,
-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list