From: Torge Matthies tmatthies@codeweavers.com
--- dlls/winemac.drv/dllmain.c | 19 +++++-------------- dlls/winemac.drv/event.c | 12 ++++++------ dlls/winemac.drv/image.c | 3 ++- dlls/winemac.drv/macdrv.h | 9 ++++++--- dlls/winemac.drv/macdrv_main.c | 20 ++++++++++++-------- dlls/winemac.drv/unixlib.h | 22 +++++++++------------- dlls/winemac.drv/window.c | 6 ++++-- 7 files changed, 44 insertions(+), 47 deletions(-)
diff --git a/dlls/winemac.drv/dllmain.c b/dlls/winemac.drv/dllmain.c index bd381bc9fc2..7c582f772cc 100644 --- a/dlls/winemac.drv/dllmain.c +++ b/dlls/winemac.drv/dllmain.c @@ -368,22 +368,10 @@ cleanup: return NtCallbackReturn(entries, count * sizeof(entries[0]), 0); }
-static const KERNEL_CALLBACK_PROC kernel_callbacks[] = -{ - macdrv_app_icon, - macdrv_app_quit_request, - macdrv_dnd_query_drag, - macdrv_dnd_query_drop, - macdrv_dnd_query_exited, -}; - -C_ASSERT(NtUserDriverCallbackFirst + ARRAYSIZE(kernel_callbacks) == client_func_last); -
static BOOL process_attach(void) { struct init_params params; - KERNEL_CALLBACK_PROC *callback_table;
struct localized_string *str; struct localized_string strings[] = { @@ -409,11 +397,14 @@ static BOOL process_attach(void) for (str = strings; str->id; str++) str->len = LoadStringW(macdrv_module, str->id, (WCHAR *)&str->str, 0); params.strings = strings; + params.app_icon_callback = (UINT_PTR)macdrv_app_icon; + params.app_quit_request_callback = (UINT_PTR)macdrv_app_quit_request; + params.dnd_query_drag_callback = (UINT_PTR)macdrv_dnd_query_drag; + params.dnd_query_drop_callback = (UINT_PTR)macdrv_dnd_query_drop; + params.dnd_query_exited_callback = (UINT_PTR)macdrv_dnd_query_exited;
if (MACDRV_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/winemac.drv/event.c b/dlls/winemac.drv/event.c index d551e1b5573..2db0a4fa2bb 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -226,7 +226,7 @@ static BOOL query_drag_drop(macdrv_query *query) { HWND hwnd = macdrv_get_window_hwnd(query->window); struct macdrv_win_data *data = get_win_data(hwnd); - struct dnd_query_drop_params params; + struct dnd_query_drop_params params = {.dispatch = {.callback = dnd_query_drop_callback}}; void *ret_ptr; ULONG ret_len;
@@ -242,7 +242,7 @@ static BOOL query_drag_drop(macdrv_query *query) params.y = query->drag_drop.y + data->rects.visible.top; params.handle = (UINT_PTR)query->drag_drop.pasteboard; release_win_data(data); - if (KeUserModeCallback(client_func_dnd_query_drop, ¶ms, sizeof(params), &ret_ptr, &ret_len)) + if (KeUserDispatchCallback(¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len)) return FALSE; return *(BOOL *)ret_ptr; } @@ -252,12 +252,12 @@ static BOOL query_drag_drop(macdrv_query *query) */ static BOOL query_drag_exited(macdrv_query *query) { - struct dnd_query_exited_params params; + struct dnd_query_exited_params params = {.dispatch = {.callback = dnd_query_exited_callback}}; void *ret_ptr; ULONG ret_len;
params.hwnd = HandleToUlong(macdrv_get_window_hwnd(query->window)); - if (KeUserModeCallback(client_func_dnd_query_exited, ¶ms, sizeof(params), &ret_ptr, &ret_len)) + if (KeUserDispatchCallback(¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len)) return FALSE; return *(BOOL *)ret_ptr; } @@ -268,7 +268,7 @@ static BOOL query_drag_exited(macdrv_query *query) */ static BOOL query_drag_operation(macdrv_query *query) { - struct dnd_query_drag_params params; + struct dnd_query_drag_params params = {.dispatch = {.callback = dnd_query_drag_callback}}; HWND hwnd = macdrv_get_window_hwnd(query->window); struct macdrv_win_data *data = get_win_data(hwnd); void *ret_ptr; @@ -288,7 +288,7 @@ static BOOL query_drag_operation(macdrv_query *query) params.handle = (UINT_PTR)query->drag_operation.pasteboard; release_win_data(data);
- if (KeUserModeCallback(client_func_dnd_query_drag, ¶ms, sizeof(params), &ret_ptr, &ret_len)) + if (KeUserDispatchCallback(¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len)) return FALSE; effect = *(DWORD *)ret_ptr; if (!effect) return FALSE; diff --git a/dlls/winemac.drv/image.c b/dlls/winemac.drv/image.c index 6e2fcf1eaa2..eb5939ce438 100644 --- a/dlls/winemac.drv/image.c +++ b/dlls/winemac.drv/image.c @@ -249,6 +249,7 @@ cleanup: */ CFArrayRef create_app_icon_images(void) { + struct dispatch_callback_params params = {.callback = app_icon_callback}; CFMutableArrayRef images = NULL; struct app_icon_entry *entries; ULONG ret_len; @@ -257,7 +258,7 @@ CFArrayRef create_app_icon_images(void)
TRACE("()\n");
- if (KeUserModeCallback(client_func_app_icon, NULL, 0, (void**)&entries, &ret_len) || + if (KeUserDispatchCallback(¶ms, sizeof(params), (void**)&entries, &ret_len) || (ret_len % sizeof(*entries))) { WARN("incorrect callback result\n"); diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 5394a3f89fe..f9ada39d38a 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -44,6 +44,12 @@ extern BOOL allow_set_gamma; extern BOOL allow_software_rendering;
+extern UINT64 app_icon_callback; +extern UINT64 app_quit_request_callback; +extern UINT64 dnd_query_drag_callback; +extern UINT64 dnd_query_drop_callback; +extern UINT64 dnd_query_exited_callback; + extern const char* debugstr_cf(CFTypeRef t);
static inline CGRect cgrect_from_rect(RECT rect) @@ -265,9 +271,6 @@ extern CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP extern NTSTATUS macdrv_dnd_release(void *arg); extern NTSTATUS macdrv_dnd_retain(void *arg);
-extern NTSTATUS macdrv_client_func(enum macdrv_client_funcs func, const void *params, - ULONG size); - /* user helpers */
static inline LRESULT send_message(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 009d9e694a5..ea556aef68d 100644 --- a/dlls/winemac.drv/macdrv_main.c +++ b/dlls/winemac.drv/macdrv_main.c @@ -60,6 +60,12 @@ int gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE; int retina_enabled = FALSE; int enable_app_nap = FALSE;
+UINT64 app_icon_callback = 0; +UINT64 app_quit_request_callback = 0; +UINT64 dnd_query_drag_callback = 0; +UINT64 dnd_query_drop_callback = 0; +UINT64 dnd_query_exited_callback = 0; + CFDictionaryRef localized_strings;
@@ -430,6 +436,12 @@ static NTSTATUS macdrv_init(void *arg) SessionAttributeBits attributes; OSStatus status;
+ app_icon_callback = params->app_icon_callback; + app_quit_request_callback = params->app_quit_request_callback; + dnd_query_drag_callback = params->dnd_query_drag_callback; + dnd_query_drop_callback = params->dnd_query_drop_callback; + dnd_query_exited_callback = params->dnd_query_exited_callback; + status = SessionGetInfo(callerSecuritySession, NULL, &attributes); if (status != noErr || !(attributes & sessionHasGraphicAccess)) return STATUS_UNSUCCESSFUL; @@ -593,14 +605,6 @@ BOOL macdrv_SystemParametersInfo( UINT action, UINT int_param, void *ptr_param, }
-NTSTATUS macdrv_client_func(enum macdrv_client_funcs id, const void *params, ULONG size) -{ - void *ret_ptr; - ULONG ret_len; - return KeUserModeCallback(id, params, size, &ret_ptr, &ret_len); -} - - static NTSTATUS macdrv_quit_result(void *arg) { struct quit_result_params *params = arg; diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h index e77a31a86c1..4f5616ca388 100644 --- a/dlls/winemac.drv/unixlib.h +++ b/dlls/winemac.drv/unixlib.h @@ -67,6 +67,11 @@ struct init_params { struct localized_string *strings; + UINT64 app_icon_callback; + UINT64 app_quit_request_callback; + UINT64 dnd_query_drag_callback; + UINT64 dnd_query_drop_callback; + UINT64 dnd_query_exited_callback; };
/* macdrv_quit_result params */ @@ -75,17 +80,6 @@ int result; };
-/* driver client callbacks exposed with KernelCallbackTable interface */ -enum macdrv_client_funcs -{ - client_func_app_icon = NtUserDriverCallbackFirst, - client_func_app_quit_request, - client_func_dnd_query_drag, - client_func_dnd_query_drop, - client_func_dnd_query_exited, - client_func_last -}; - /* macdrv_app_icon result */ struct app_icon_entry { @@ -99,12 +93,14 @@ /* macdrv_app_quit_request params */ struct app_quit_request_params { + struct dispatch_callback_params dispatch; UINT flags; };
/* macdrv_dnd_query_drag params */ struct dnd_query_drag_params { + struct dispatch_callback_params dispatch; UINT32 hwnd; UINT32 effect; INT32 x; @@ -115,6 +111,7 @@ /* macdrv_dnd_query_drop params */ struct dnd_query_drop_params { + struct dispatch_callback_params dispatch; UINT32 hwnd; UINT32 effect; INT32 x; @@ -125,6 +122,7 @@ /* macdrv_dnd_query_exited params */ struct dnd_query_exited_params { + struct dispatch_callback_params dispatch; UINT32 hwnd; };
@@ -132,5 +130,3 @@ { return (void *)(UINT_PTR)param; } - -C_ASSERT(client_func_last <= NtUserDriverCallbackLast + 1); diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index deb2a39072f..824475a9b34 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -2318,14 +2318,16 @@ void macdrv_reassert_window_position(HWND hwnd) */ void macdrv_app_quit_requested(const macdrv_event *event) { - struct app_quit_request_params params = { .flags = 0 }; + struct app_quit_request_params params = {.dispatch = {.callback = app_quit_request_callback}}; + void *ret_ptr; + ULONG ret_len;
TRACE("reason %d\n", event->app_quit_requested.reason);
if (event->app_quit_requested.reason == QUIT_REASON_LOGOUT) params.flags = ENDSESSION_LOGOFF;
- macdrv_client_func(client_func_app_quit_request, ¶ms, sizeof(params)); + KeUserDispatchCallback(¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len); }