From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/winemac.drv/dllmain.c | 14 +++----------- dlls/winemac.drv/event.c | 10 +++++----- dlls/winemac.drv/image.c | 2 +- dlls/winemac.drv/macdrv.h | 4 ++-- dlls/winemac.drv/macdrv_main.c | 9 +++++++-- dlls/winemac.drv/unixlib.h | 28 +++++++++++++--------------- dlls/winemac.drv/window.c | 2 +- 7 files changed, 32 insertions(+), 37 deletions(-)
diff --git a/dlls/winemac.drv/dllmain.c b/dlls/winemac.drv/dllmain.c index 083c539dd26..cea432b3a71 100644 --- a/dlls/winemac.drv/dllmain.c +++ b/dlls/winemac.drv/dllmain.c @@ -367,8 +367,7 @@ cleanup: return 0; }
-typedef NTSTATUS (WINAPI *kernel_callback)(void *params, ULONG size); -static const kernel_callback kernel_callbacks[] = +static const struct macdrv_client_funcs client_funcs = { macdrv_app_icon, macdrv_app_quit_request, @@ -379,13 +378,10 @@ static const kernel_callback kernel_callbacks[] = macdrv_ime_set_text, };
-C_ASSERT(NtUserDriverCallbackFirst + ARRAYSIZE(kernel_callbacks) == client_func_last); -
static BOOL process_attach(void) { struct init_params params; - void **callback_table;
struct localized_string *str; struct localized_string strings[] = { @@ -413,12 +409,8 @@ 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; - - if (MACDRV_CALL(init, ¶ms)) return FALSE; - - callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - memcpy( callback_table + NtUserDriverCallbackFirst, kernel_callbacks, sizeof(kernel_callbacks) ); - return TRUE; + params.client_funcs = &client_funcs; + return !MACDRV_CALL(init, ¶ms); }
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved) diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c index 6ca46f55dff..dfd8279fc06 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -170,7 +170,7 @@ static void macdrv_im_set_text(const macdrv_event *event) if (length) CFStringGetCharacters(event->im_set_text.text, CFRangeMake(0, length), params->text);
- macdrv_client_func(client_func_ime_set_text, params, size); + macdrv_client_func(client_funcs.ime_set_text, params, size); }
/*********************************************************************** @@ -235,7 +235,7 @@ static BOOL query_drag_drop(macdrv_query *query) params.y = query->drag_drop.y + data->whole_rect.top; params.handle = (UINT_PTR)query->drag_drop.pasteboard; release_win_data(data); - return macdrv_client_func(client_func_dnd_query_drop, ¶ms, sizeof(params)); + return macdrv_client_func(client_funcs.dnd_query_drop, ¶ms, sizeof(params)); }
/************************************************************************** @@ -245,7 +245,7 @@ static BOOL query_drag_exited(macdrv_query *query) { struct dnd_query_exited_params params; params.hwnd = HandleToUlong(macdrv_get_window_hwnd(query->window)); - return macdrv_client_func(client_func_dnd_query_exited, ¶ms, sizeof(params)); + return macdrv_client_func(client_funcs.dnd_query_exited, ¶ms, sizeof(params)); }
@@ -272,7 +272,7 @@ static BOOL query_drag_operation(macdrv_query *query) params.handle = (UINT_PTR)query->drag_operation.pasteboard; release_win_data(data);
- effect = macdrv_client_func(client_func_dnd_query_drag, ¶ms, sizeof(params)); + effect = macdrv_client_func(client_funcs.dnd_query_drag, ¶ms, sizeof(params)); if (!effect) return FALSE;
query->drag_operation.accepted_op = dropeffect_to_drag_operation(effect, @@ -302,7 +302,7 @@ BOOL query_ime_char_rect(macdrv_query* query) params.result = (UINT_PTR)&result; params.location = range->location; params.length = range->length; - ret = macdrv_client_func(client_func_ime_query_char_rect, ¶ms, sizeof(params)); + ret = macdrv_client_func(client_funcs.ime_query_char_rect, ¶ms, sizeof(params)); *range = CFRangeMake(result.location, result.length); *rect = cgrect_from_rect(result.rect);
diff --git a/dlls/winemac.drv/image.c b/dlls/winemac.drv/image.c index 857684db9c2..bfea9b8ac6d 100644 --- a/dlls/winemac.drv/image.c +++ b/dlls/winemac.drv/image.c @@ -256,7 +256,7 @@ CFArrayRef create_app_icon_images(void)
TRACE("()\n");
- macdrv_client_func(client_func_app_icon, ¶ms, sizeof(params)); + macdrv_client_func(client_funcs.app_icon, ¶ms, sizeof(params));
if (!icons.count) return NULL;
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index ea51cf0f702..8e262a23f68 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -35,6 +35,7 @@ #include "wine/gdi_driver.h" #include "unixlib.h"
+extern struct macdrv_client_funcs client_funcs;
extern BOOL skip_single_buffer_flushes DECLSPEC_HIDDEN; extern BOOL allow_vsync DECLSPEC_HIDDEN; @@ -280,8 +281,7 @@ extern NTSTATUS macdrv_dnd_retain(void *arg) DECLSPEC_HIDDEN; extern NTSTATUS macdrv_ime_process_text_input(void *arg) DECLSPEC_HIDDEN; extern NTSTATUS macdrv_notify_icon(void *arg) DECLSPEC_HIDDEN;
-extern NTSTATUS macdrv_client_func(enum macdrv_client_funcs func, const void *params, - ULONG size) DECLSPEC_HIDDEN; +extern NTSTATUS macdrv_client_func(user32_callback_func func, const void *params, ULONG size) DECLSPEC_HIDDEN;
/* user helpers */
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 2350ec61b21..38d34f3a303 100644 --- a/dlls/winemac.drv/macdrv_main.c +++ b/dlls/winemac.drv/macdrv_main.c @@ -49,6 +49,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(macdrv);
C_ASSERT(NUM_EVENT_TYPES <= sizeof(macdrv_event_mask) * 8);
+struct macdrv_client_funcs client_funcs; + int topmost_float_inactive = TOPMOST_FLOAT_INACTIVE_NONFULLSCREEN; int capture_displays_for_fullscreen = 0; BOOL skip_single_buffer_flushes = FALSE; @@ -444,6 +446,8 @@ static NTSTATUS macdrv_init(void *arg) if (status != noErr || !(attributes & sessionHasGraphicAccess)) return STATUS_UNSUCCESSFUL;
+ client_funcs = *params->client_funcs; + init_win_context(); setup_options(); load_strings(params->strings); @@ -610,11 +614,12 @@ 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) +NTSTATUS macdrv_client_func(user32_callback_func func, const void *params, ULONG size) { void *ret_ptr; ULONG ret_len; - return KeUserModeCallback(id, params, size, &ret_ptr, &ret_len); + struct user32_callback_params cbparams = { func, params, size }; + return KeUserModeCallback(NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len); }
diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h index 5fe19a94fee..a4fb610353a 100644 --- a/dlls/winemac.drv/unixlib.h +++ b/dlls/winemac.drv/unixlib.h @@ -80,9 +80,22 @@ struct localized_string UINT64 str; };
+/* driver client callbacks called through NtUserDispatchCallback interface */ +struct macdrv_client_funcs +{ + user32_callback_func app_icon; + user32_callback_func app_quit_request; + user32_callback_func dnd_query_drag; + user32_callback_func dnd_query_drop; + user32_callback_func dnd_query_exited; + user32_callback_func ime_query_char_rect; + user32_callback_func ime_set_text; +}; + struct init_params { struct localized_string *strings; + const struct macdrv_client_funcs *client_funcs; };
/* macdrv_notify_icon params */ @@ -98,19 +111,6 @@ struct quit_result_params 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_ime_query_char_rect, - client_func_ime_set_text, - client_func_last -}; - /* macdrv_app_icon result */ struct app_icon_entry { @@ -197,5 +197,3 @@ static inline void *param_ptr(UINT64 param) { 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 37696f02d25..37b73276284 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -2670,7 +2670,7 @@ void macdrv_app_quit_requested(const macdrv_event *event) if (event->app_quit_requested.reason == QUIT_REASON_LOGOUT) params.flags = ENDSESSION_LOGOFF;
- macdrv_client_func(client_func_app_quit_request, ¶ms, sizeof(params)); + macdrv_client_func(client_funcs.app_quit_request, ¶ms, sizeof(params)); }