Module: wine Branch: master Commit: 5cd386143864431611560247aa691592518b5bed URL: https://gitlab.winehq.org/wine/wine/-/commit/5cd386143864431611560247aa69159...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Jan 19 13:46:34 2024 +0100
winex11.drv: Return result through NtCallbackReturn for the drag and drop callbacks.
---
dlls/winex11.drv/dllmain.c | 18 ++---------------- dlls/winex11.drv/event.c | 19 +++++++++++++++---- dlls/winex11.drv/unixlib.h | 20 +++----------------- dlls/winex11.drv/x11drv.h | 1 - dlls/winex11.drv/x11drv_dll.h | 5 ++--- dlls/winex11.drv/x11drv_main.c | 7 ------- dlls/winex11.drv/xdnd.c | 21 +++++++++++++-------- 7 files changed, 35 insertions(+), 56 deletions(-)
diff --git a/dlls/winex11.drv/dllmain.c b/dlls/winex11.drv/dllmain.c index b0a579e4ee2..dbda015fd50 100644 --- a/dlls/winex11.drv/dllmain.c +++ b/dlls/winex11.drv/dllmain.c @@ -25,28 +25,14 @@ HMODULE x11drv_module = 0;
-typedef NTSTATUS (*callback_func)( UINT arg ); -static const callback_func callback_funcs[] = -{ - x11drv_dnd_drop_event, - x11drv_dnd_leave_event, -}; - -C_ASSERT( ARRAYSIZE(callback_funcs) == client_funcs_count ); - -static NTSTATUS WINAPI x11drv_callback( void *arg, ULONG size ) -{ - struct client_callback_params *params = arg; - return callback_funcs[params->id]( params->arg ); -} - typedef NTSTATUS (WINAPI *kernel_callback)( void *params, ULONG size ); static const kernel_callback kernel_callbacks[] = { - x11drv_callback, x11drv_dnd_enter_event, x11drv_dnd_position_event, x11drv_dnd_post_drop, + x11drv_dnd_drop_event, + x11drv_dnd_leave_event, };
C_ASSERT( NtUserDriverCallbackFirst + ARRAYSIZE(kernel_callbacks) == client_func_last ); diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 97ebf4ae0d6..aafb89a4fed 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -1754,13 +1754,18 @@ static void handle_xdnd_position_event( HWND hwnd, XClientMessageEvent *event ) { struct dnd_position_event_params params; XClientMessageEvent e; + void *ret_ptr; + ULONG ret_len; UINT effect;
params.hwnd = HandleToUlong( hwnd ); params.point = root_to_virtual_screen( event->data.l[2] >> 16, event->data.l[2] & 0xFFFF ); params.effect = effect = xdnd_action_to_drop_effect( event->data.l[4] );
- effect = x11drv_client_func( client_func_dnd_position_event, ¶ms, sizeof(params) ); + if (KeUserModeCallback( client_func_dnd_position_event, ¶ms, sizeof(params), + &ret_ptr, &ret_len ) || ret_len != sizeof(effect)) + return; + effect = *(UINT *)ret_ptr;
TRACE( "actionRequested(%ld) chosen(0x%x) at x(%d),y(%d)\n", event->data.l[4], effect, (int)params.point.x, (int)params.point.y ); @@ -1786,9 +1791,15 @@ static void handle_xdnd_position_event( HWND hwnd, XClientMessageEvent *event ) static void handle_xdnd_drop_event( HWND hwnd, XClientMessageEvent *event ) { XClientMessageEvent e; - DWORD effect; + void *ret_ptr; + ULONG ret_len; + ULONG arg = HandleToUlong( hwnd ); + UINT effect;
- effect = x11drv_client_call( client_dnd_drop_event, HandleToUlong( hwnd )); + if (KeUserModeCallback( client_func_dnd_drop_event, &arg, sizeof(arg), + &ret_ptr, &ret_len ) || ret_len != sizeof(effect)) + return; + effect = *(UINT *)ret_ptr;
/* Tell the target we are finished. */ memset( &e, 0, sizeof(e) ); @@ -1806,7 +1817,7 @@ static void handle_xdnd_drop_event( HWND hwnd, XClientMessageEvent *event )
static void handle_xdnd_leave_event( HWND hwnd, XClientMessageEvent *event ) { - x11drv_client_call( client_dnd_leave_event, 0 ); + x11drv_client_func( client_func_dnd_leave_event, NULL, 0 ); }
diff --git a/dlls/winex11.drv/unixlib.h b/dlls/winex11.drv/unixlib.h index 9f3f7ec2926..0be0d5dae86 100644 --- a/dlls/winex11.drv/unixlib.h +++ b/dlls/winex11.drv/unixlib.h @@ -55,30 +55,16 @@ struct xim_preedit_state_params /* driver client callbacks exposed with KernelCallbackTable interface */ enum x11drv_client_funcs { - client_func_callback = NtUserDriverCallbackFirst, - client_func_dnd_enter_event, + client_func_dnd_enter_event = NtUserDriverCallbackFirst, client_func_dnd_position_event, client_func_dnd_post_drop, + client_func_dnd_drop_event, + client_func_dnd_leave_event, client_func_last };
C_ASSERT( client_func_last <= NtUserDriverCallbackLast + 1 );
-/* simplified interface for client callbacks requiring only a single UINT parameter */ -enum client_callback -{ - client_dnd_drop_event, - client_dnd_leave_event, - client_funcs_count -}; - -/* x11drv_callback params */ -struct client_callback_params -{ - UINT id; - UINT arg; -}; - /* x11drv_dnd_enter_event and x11drv_dnd_post_drop params */ struct format_entry { diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 6bd671db3ff..d5edb9ba377 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -844,7 +844,6 @@ extern NTSTATUS x11drv_tablet_info( void *arg );
extern NTSTATUS x11drv_client_func( enum x11drv_client_funcs func, const void *params, ULONG size ); -extern NTSTATUS x11drv_client_call( enum client_callback func, UINT arg );
/* GDI helpers */
diff --git a/dlls/winex11.drv/x11drv_dll.h b/dlls/winex11.drv/x11drv_dll.h index 89b8d50057e..bc68c3996c3 100644 --- a/dlls/winex11.drv/x11drv_dll.h +++ b/dlls/winex11.drv/x11drv_dll.h @@ -30,9 +30,8 @@ extern NTSTATUS WINAPI x11drv_dnd_enter_event( void *params, ULONG size ); extern NTSTATUS WINAPI x11drv_dnd_position_event( void *params, ULONG size ); extern NTSTATUS WINAPI x11drv_dnd_post_drop( void *data, ULONG size ); - -extern NTSTATUS x11drv_dnd_drop_event( UINT arg ); -extern NTSTATUS x11drv_dnd_leave_event( UINT arg ); +extern NTSTATUS WINAPI x11drv_dnd_drop_event( void *params, ULONG size ); +extern NTSTATUS WINAPI x11drv_dnd_leave_event( void *params, ULONG size );
extern LRESULT WINAPI foreign_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ); diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index d1f31081b09..1b9555bcfbf 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -1305,13 +1305,6 @@ NTSTATUS x11drv_client_func( enum x11drv_client_funcs id, const void *params, UL }
-NTSTATUS x11drv_client_call( enum client_callback func, UINT arg ) -{ - struct client_callback_params params = { .id = func, .arg = arg }; - return x11drv_client_func( client_func_callback, ¶ms, sizeof(params) ); -} - - const unixlib_entry_t __wine_unix_call_funcs[] = { x11drv_init, diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index 0e1a747b604..1d3171538cb 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -20,6 +20,8 @@ */
#define COBJMACROS +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "x11drv_dll.h" #include "shellapi.h" #include "shlobj.h" @@ -246,11 +248,13 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) } }
- return accept ? effect : DROPEFFECT_NONE; + if (!accept) effect = DROPEFFECT_NONE; + return NtCallbackReturn( &effect, sizeof(effect), STATUS_SUCCESS ); }
-NTSTATUS x11drv_dnd_drop_event( UINT arg ) +NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) { + HWND hwnd = UlongToHandle( *(ULONG *)args ); IDropTarget *dropTarget; DWORD effect = XDNDDropEffect; int accept = 0; /* Assume we're not accepting */ @@ -303,7 +307,7 @@ NTSTATUS x11drv_dnd_drop_event( UINT arg ) /* Only send WM_DROPFILES if Drop didn't succeed or DROPEFFECT_NONE was set. * Doing both causes winamp to duplicate the dropped files (#29081) */
- HWND hwnd_drop = window_accepting_files(window_from_point_dnd( UlongToHandle(arg), XDNDxy )); + HWND hwnd_drop = window_accepting_files(window_from_point_dnd( hwnd, XDNDxy ));
if (hwnd_drop && X11DRV_XDND_HasHDROP()) { @@ -319,7 +323,8 @@ NTSTATUS x11drv_dnd_drop_event( UINT arg ) TRACE("effectRequested(0x%lx) accept(%d) performed(0x%lx) at x(%ld),y(%ld)\n", XDNDDropEffect, accept, effect, XDNDxy.x, XDNDxy.y);
- return accept ? effect : DROPEFFECT_NONE; + if (!accept) effect = DROPEFFECT_NONE; + return NtCallbackReturn( &effect, sizeof(effect), STATUS_SUCCESS ); }
/************************************************************************** @@ -327,7 +332,7 @@ NTSTATUS x11drv_dnd_drop_event( UINT arg ) * * Handle an XdndLeave event. */ -NTSTATUS x11drv_dnd_leave_event( UINT arg ) +NTSTATUS WINAPI x11drv_dnd_leave_event( void *params, ULONG size ) { IDropTarget *dropTarget;
@@ -347,7 +352,7 @@ NTSTATUS x11drv_dnd_leave_event( UINT arg ) }
X11DRV_XDND_FreeDragDropOp(); - return 0; + return STATUS_SUCCESS; }
@@ -365,7 +370,7 @@ NTSTATUS WINAPI x11drv_dnd_enter_event( void *params, ULONG size ) memcpy( xdnd_formats, formats, size ); xdnd_formats_end = (struct format_entry *)((char *)xdnd_formats + size); } - return 0; + return STATUS_SUCCESS; }
@@ -731,5 +736,5 @@ NTSTATUS WINAPI x11drv_dnd_post_drop( void *data, ULONG size ) PostMessageW( hwnd, WM_DROPFILES, (WPARAM)handle, 0 ); }
- return 0; + return STATUS_SUCCESS; }