[PATCH 09/11] wineandroid: Use unixlib interface for register_window_callback.

Jacek Caban wine at gitlab.winehq.org
Mon Jun 6 19:33:08 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/wineandroid.drv/android.h |  2 ++
 dlls/wineandroid.drv/device.c  | 16 +++++++++-------
 dlls/wineandroid.drv/dllmain.c | 12 +++++++++++-
 dlls/wineandroid.drv/init.c    |  6 ++++++
 dlls/wineandroid.drv/unixlib.h | 17 +++++++++++++++++
 5 files changed, 45 insertions(+), 8 deletions(-)

diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h
index c73ab6bc765..22652f11d27 100644
--- a/dlls/wineandroid.drv/android.h
+++ b/dlls/wineandroid.drv/android.h
@@ -118,6 +118,8 @@ extern NTSTATUS android_create_desktop( void *arg ) DECLSPEC_HIDDEN;
 extern NTSTATUS android_dispatch_ioctl( void *arg ) DECLSPEC_HIDDEN;
 extern NTSTATUS android_java_init( void *arg ) DECLSPEC_HIDDEN;
 extern NTSTATUS android_java_uninit( void *arg ) DECLSPEC_HIDDEN;
+extern NTSTATUS android_register_window( void *arg ) DECLSPEC_HIDDEN;
+extern PNTAPCFUNC register_window_callback;
 
 extern unsigned int screen_width DECLSPEC_HIDDEN;
 extern unsigned int screen_height DECLSPEC_HIDDEN;
diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c
index b49b691b27a..fa11e0d071e 100644
--- a/dlls/wineandroid.drv/device.c
+++ b/dlls/wineandroid.drv/device.c
@@ -516,21 +516,22 @@ static struct native_win_data *create_native_win_data( HWND hwnd, BOOL opengl )
     return data;
 }
 
-static void CALLBACK register_native_window_callback( ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3 )
+NTSTATUS android_register_window( void *arg )
 {
-    HWND hwnd = (HWND)arg1;
-    struct ANativeWindow *win = (struct ANativeWindow *)arg2;
-    BOOL opengl = arg3;
+    struct register_window_params *params = arg;
+    HWND hwnd = (HWND)params->arg1;
+    struct ANativeWindow *win = (struct ANativeWindow *)params->arg2;
+    BOOL opengl = params->arg3;
     struct native_win_data *data = get_native_win_data( hwnd, opengl );
 
-    if (!win) return;  /* do nothing and hold on to the window until we get a new surface */
+    if (!win) return 0;  /* do nothing and hold on to the window until we get a new surface */
 
     if (!data || data->parent == win)
     {
         pANativeWindow_release( win );
         if (data) NtUserPostMessage( hwnd, WM_ANDROID_REFRESH, opengl, 0 );
         TRACE( "%p -> %p win %p (unchanged)\n", hwnd, data, win );
-        return;
+        return 0;
     }
 
     release_native_window( data );
@@ -543,12 +544,13 @@ static void CALLBACK register_native_window_callback( ULONG_PTR arg1, ULONG_PTR
     unwrap_java_call();
     NtUserPostMessage( hwnd, WM_ANDROID_REFRESH, opengl, 0 );
     TRACE( "%p -> %p win %p\n", hwnd, data, win );
+    return 0;
 }
 
 /* register a native window received from the Java side for use in ioctls */
 void register_native_window( HWND hwnd, struct ANativeWindow *win, BOOL opengl )
 {
-    NtQueueApcThread( thread, register_native_window_callback, (ULONG_PTR)hwnd, (ULONG_PTR)win, opengl );
+    NtQueueApcThread( thread, register_window_callback, (ULONG_PTR)hwnd, (ULONG_PTR)win, opengl );
 }
 
 void init_gralloc( const struct hw_module_t *module )
diff --git a/dlls/wineandroid.drv/dllmain.c b/dlls/wineandroid.drv/dllmain.c
index 37539fa5756..79b3c2c62a4 100644
--- a/dlls/wineandroid.drv/dllmain.c
+++ b/dlls/wineandroid.drv/dllmain.c
@@ -104,17 +104,27 @@ static NTSTATUS WINAPI android_start_device(void *param, ULONG size)
 }
 
 
+static void CALLBACK register_window_callback( ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3 )
+{
+    struct register_window_params params = { .arg1 = arg1, .arg2 = arg2, .arg3 = arg3 };
+    ANDROID_CALL( register_window, &params );
+}
+
+
 /***********************************************************************
  *       dll initialisation routine
  */
 BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
 {
+    struct init_params params;
     void **callback_table;
 
     if (reason == DLL_PROCESS_ATTACH) return TRUE;
 
     DisableThreadLibraryCalls( inst );
-    if (ANDROID_CALL( init, NULL )) return FALSE;
+
+    params.register_window_callback = register_window_callback;
+    if (ANDROID_CALL( init, &params )) return FALSE;
 
     callback_table = NtCurrentTeb()->Peb->KernelCallbackTable;
     callback_table[client_start_device] = android_start_device;
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c
index b5f0b69fcec..527eda7a241 100644
--- a/dlls/wineandroid.drv/init.c
+++ b/dlls/wineandroid.drv/init.c
@@ -48,6 +48,8 @@ static RECT monitor_rc_work;
 static int device_init_done;
 static BOOL force_display_devices_refresh;
 
+PNTAPCFUNC register_window_callback;
+
 typedef struct
 {
     struct gdi_physdev dev;
@@ -558,6 +560,7 @@ unsigned short *p_java_gdt_sel = NULL;
 
 static HRESULT android_init( void *arg )
 {
+    struct init_params *params = arg;
     pthread_mutexattr_t attr;
     jclass class;
     jobject object;
@@ -581,6 +584,8 @@ static HRESULT android_init( void *arg )
     pthread_mutex_init( &win_data_mutex, &attr );
     pthread_mutexattr_destroy( &attr );
 
+    register_window_callback = params->register_window_callback;
+
     if ((java_vm = *p_java_vm))  /* running under Java */
     {
 #ifdef __i386__
@@ -608,6 +613,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
     android_init,
     android_java_init,
     android_java_uninit,
+    android_register_window,
 };
 
 
diff --git a/dlls/wineandroid.drv/unixlib.h b/dlls/wineandroid.drv/unixlib.h
index 2838047f4fe..8a94bb1253a 100644
--- a/dlls/wineandroid.drv/unixlib.h
+++ b/dlls/wineandroid.drv/unixlib.h
@@ -26,6 +26,7 @@ enum android_funcs
     unix_init,
     unix_java_init,
     unix_java_uninit,
+    unix_register_window,
     unix_funcs_count
 };
 
@@ -33,6 +34,13 @@ enum android_funcs
 extern NTSTATUS unix_call( enum android_funcs func, void *arg ) DECLSPEC_HIDDEN;
 #define ANDROID_CALL(func, params) unix_call( unix_ ## func, params )
 
+/* android_init params */
+struct init_params
+{
+    PNTAPCFUNC register_window_callback;
+};
+
+
 /* android_ioctl params */
 struct ioctl_params
 {
@@ -41,6 +49,15 @@ struct ioctl_params
 };
 
 
+/* android_register_window params */
+struct register_window_params
+{
+    UINT_PTR arg1;
+    UINT_PTR arg2;
+    UINT_PTR arg3;
+};
+
+
 enum
 {
     client_start_device = NtUserDriverCallbackFirst,
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/193



More information about the wine-devel mailing list