From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/dllmain.c | 20 +++++--------------- dlls/winex11.drv/event.c | 24 ++++++++++++++++-------- dlls/winex11.drv/unixlib.h | 25 ++++++++++--------------- dlls/winex11.drv/x11drv.h | 8 +++++--- dlls/winex11.drv/x11drv_main.c | 18 ++++++++++-------- 5 files changed, 46 insertions(+), 49 deletions(-)
diff --git a/dlls/winex11.drv/dllmain.c b/dlls/winex11.drv/dllmain.c index ecf93b2d94a..14336adf583 100644 --- a/dlls/winex11.drv/dllmain.c +++ b/dlls/winex11.drv/dllmain.c @@ -25,23 +25,15 @@ HMODULE x11drv_module = 0;
-static const KERNEL_CALLBACK_PROC kernel_callbacks[] = -{ - 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 ); - - BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, void *reserved ) { - KERNEL_CALLBACK_PROC *callback_table; struct init_params params = { + .dnd_enter_event_callback = (UINT_PTR)x11drv_dnd_enter_event, + .dnd_position_event_callback = (UINT_PTR)x11drv_dnd_position_event, + .dnd_post_drop_callback = (UINT_PTR)x11drv_dnd_post_drop, + .dnd_drop_event_callback = (UINT_PTR)x11drv_dnd_drop_event, + .dnd_leave_event_callback = (UINT_PTR)x11drv_dnd_leave_event, .foreign_window_proc = (UINT_PTR)foreign_window_proc, };
@@ -52,8 +44,6 @@ BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, void *reserved ) if (__wine_init_unix_call()) return FALSE; if (X11DRV_CALL( init, ¶ms )) return FALSE;
- callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - memcpy( callback_table + NtUserDriverCallbackFirst, kernel_callbacks, sizeof(kernel_callbacks) ); return TRUE; }
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 3797e638c75..b8f10a73b6f 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -1428,10 +1428,13 @@ static HWND find_drop_window( HWND hQueryWnd, LPPOINT lpPt ) static void post_drop( HWND hwnd, DROPFILES *drop, ULONG size ) { struct dnd_post_drop_params *params; + void *ret_ptr; + ULONG ret_len; if (!(params = malloc( sizeof(*params) + size - sizeof(*drop) ))) return; memcpy( ¶ms->drop, drop, size ); params->drop.fWide = HandleToUlong( hwnd ); /* abuse fWide to pass window handle */ - x11drv_client_func( client_func_dnd_post_drop, params, size ); + params->dispatch.callback = dnd_post_drop_callback; + KeUserDispatchCallback( ¶ms->dispatch, size, &ret_ptr, &ret_len ); free( params ); }
@@ -1698,8 +1701,11 @@ static void handle_xdnd_enter_event( HWND hWnd, XClientMessageEvent *event ) xdndtypes, count, &size ); if (data && (params = malloc( sizeof(*params) + size ))) { + void *ret_ptr; + ULONG ret_len; memcpy( params->entries, data, size ); - x11drv_client_func( client_func_dnd_enter_event, params, sizeof(*params) + size ); + params->dispatch.callback = dnd_enter_event_callback; + KeUserDispatchCallback( ¶ms->dispatch, sizeof(*params) + size, &ret_ptr, &ret_len ); free( params ); } free( data ); @@ -1753,12 +1759,12 @@ static void handle_xdnd_position_event( HWND hwnd, XClientMessageEvent *event ) ULONG ret_len; UINT effect;
+ params.dispatch.callback = dnd_position_event_callback; 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] );
- if (KeUserModeCallback( client_func_dnd_position_event, ¶ms, sizeof(params), - &ret_ptr, &ret_len ) || ret_len != sizeof(effect)) + if (KeUserDispatchCallback( ¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len ) || ret_len != sizeof(effect)) return; effect = *(UINT *)ret_ptr;
@@ -1785,14 +1791,13 @@ static void handle_xdnd_position_event( HWND hwnd, XClientMessageEvent *event )
static void handle_xdnd_drop_event( HWND hwnd, XClientMessageEvent *event ) { - struct dnd_drop_event_params params = {.hwnd = HandleToULong(hwnd)}; + struct dnd_drop_event_params params = {.dispatch.callback = dnd_leave_event_callback, .hwnd = HandleToULong(hwnd)}; XClientMessageEvent e; void *ret_ptr; ULONG ret_len; UINT effect;
- if (KeUserModeCallback( client_func_dnd_drop_event, ¶ms, sizeof(params), - &ret_ptr, &ret_len ) || ret_len != sizeof(effect)) + if (KeUserDispatchCallback( ¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len ) || ret_len != sizeof(effect)) return; effect = *(UINT *)ret_ptr;
@@ -1812,7 +1817,10 @@ static void handle_xdnd_drop_event( HWND hwnd, XClientMessageEvent *event )
static void handle_xdnd_leave_event( HWND hwnd, XClientMessageEvent *event ) { - x11drv_client_func( client_func_dnd_leave_event, NULL, 0 ); + struct dispatch_callback_params params = {.callback = dnd_leave_event_callback}; + void *ret_ptr; + ULONG ret_len; + KeUserDispatchCallback( ¶ms, sizeof(params), &ret_ptr, &ret_len ); }
diff --git a/dlls/winex11.drv/unixlib.h b/dlls/winex11.drv/unixlib.h index 3fce13ec6df..522411f8e55 100644 --- a/dlls/winex11.drv/unixlib.h +++ b/dlls/winex11.drv/unixlib.h @@ -35,6 +35,11 @@ enum x11drv_funcs /* x11drv_init params */ struct init_params { + UINT64 dnd_enter_event_callback; + UINT64 dnd_position_event_callback; + UINT64 dnd_post_drop_callback; + UINT64 dnd_drop_event_callback; + UINT64 dnd_leave_event_callback; UINT64 foreign_window_proc; };
@@ -53,20 +58,6 @@ struct xim_preedit_state_params BOOL open; };
-/* driver client callbacks exposed with KernelCallbackTable interface */ -enum x11drv_client_funcs -{ - 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 ); - -/* x11drv_dnd_enter_event params */ struct format_entry { UINT format; @@ -77,7 +68,7 @@ struct format_entry /* x11drv_dnd_enter_event params */ struct dnd_enter_event_params { - int placeholder; + struct dispatch_callback_params dispatch; struct format_entry entries[]; };
@@ -86,6 +77,7 @@ C_ASSERT(sizeof(struct dnd_enter_event_params) == offsetof(struct dnd_enter_even /* x11drv_dnd_position_event params */ struct dnd_position_event_params { + struct dispatch_callback_params dispatch; ULONG hwnd; POINT point; DWORD effect; @@ -94,12 +86,15 @@ struct dnd_position_event_params /* x11drv_dnd_drop_event params */ struct dnd_drop_event_params { + struct dispatch_callback_params dispatch; ULONG hwnd; };
/* x11drv_dnd_post_drop params */ struct dnd_post_drop_params { + struct dispatch_callback_params dispatch; + UINT32 __pad; DROPFILES drop; char data[]; }; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 8d770e69f2c..e904087f262 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -439,6 +439,11 @@ extern int xrender_error_base; extern char *process_name; extern Display *clipboard_display; extern UINT64 client_foreign_window_proc; +extern UINT64 dnd_enter_event_callback; +extern UINT64 dnd_position_event_callback; +extern UINT64 dnd_post_drop_callback; +extern UINT64 dnd_drop_event_callback; +extern UINT64 dnd_leave_event_callback;
/* atoms */
@@ -838,9 +843,6 @@ extern NTSTATUS x11drv_tablet_get_packet( void *arg ); extern NTSTATUS x11drv_tablet_load_info( void *arg ); extern NTSTATUS x11drv_tablet_info( void *arg );
-extern NTSTATUS x11drv_client_func( enum x11drv_client_funcs func, const void *params, - ULONG size ); - /* GDI helpers */
static inline BOOL lp_to_dp( HDC hdc, POINT *points, INT count ) diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 1ba6a06b8db..3f8e48a7a8d 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -86,6 +86,11 @@ int alloc_system_colors = 256; int xrender_error_base = 0; char *process_name = NULL; UINT64 client_foreign_window_proc = 0; +UINT64 dnd_enter_event_callback = 0; +UINT64 dnd_position_event_callback = 0; +UINT64 dnd_post_drop_callback = 0; +UINT64 dnd_drop_event_callback = 0; +UINT64 dnd_leave_event_callback = 0;
static x11drv_error_callback err_callback; /* current callback for error */ static Display *err_callback_display; /* display callback is set for */ @@ -643,6 +648,11 @@ static NTSTATUS x11drv_init( void *arg ) if (!XInitThreads()) ERR( "XInitThreads failed, trouble ahead\n" ); if (!(display = XOpenDisplay( NULL ))) return STATUS_UNSUCCESSFUL;
+ dnd_enter_event_callback = params->dnd_enter_event_callback; + dnd_position_event_callback = params->dnd_position_event_callback; + dnd_post_drop_callback = params->dnd_post_drop_callback; + dnd_drop_event_callback = params->dnd_drop_event_callback; + dnd_leave_event_callback = params->dnd_leave_event_callback; client_foreign_window_proc = params->foreign_window_proc;
fcntl( ConnectionNumber(display), F_SETFD, 1 ); /* set close on exec flag */ @@ -801,14 +811,6 @@ BOOL X11DRV_SystemParametersInfo( UINT action, UINT int_param, void *ptr_param, return FALSE; /* let user32 handle it */ }
-NTSTATUS x11drv_client_func( enum x11drv_client_funcs id, const void *params, ULONG size ) -{ - void *ret_ptr; - ULONG ret_len; - return KeUserModeCallback( id, params, size, &ret_ptr, &ret_len ); -} - - const unixlib_entry_t __wine_unix_call_funcs[] = { x11drv_init,