Alexandre Julliard : wineandroid: Allocate a native window wrapper in the client process for every window.
Alexandre Julliard
julliard at winehq.org
Mon Jun 5 16:56:30 CDT 2017
Module: wine
Branch: master
Commit: fbc482db1d011887468d11ef2fbac99e50af04a8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fbc482db1d011887468d11ef2fbac99e50af04a8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jun 5 12:21:26 2017 +0200
wineandroid: Allocate a native window wrapper in the client process for every window.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wineandroid.drv/android.h | 4 +-
dlls/wineandroid.drv/device.c | 114 ++++++++++++++++++++++++++++++++++++++++-
dlls/wineandroid.drv/window.c | 5 +-
3 files changed, 119 insertions(+), 4 deletions(-)
diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h
index f03671a..3d9ac5a 100644
--- a/dlls/wineandroid.drv/android.h
+++ b/dlls/wineandroid.drv/android.h
@@ -53,7 +53,9 @@ DECL_FUNCPTR( ANativeWindow_release );
extern void start_android_device(void) DECLSPEC_HIDDEN;
extern void register_native_window( HWND hwnd, struct ANativeWindow *win ) DECLSPEC_HIDDEN;
-extern void create_ioctl_window( HWND hwnd ) DECLSPEC_HIDDEN;
+extern struct ANativeWindow *create_ioctl_window( HWND hwnd ) DECLSPEC_HIDDEN;
+extern struct ANativeWindow *grab_ioctl_window( struct ANativeWindow *window ) DECLSPEC_HIDDEN;
+extern void release_ioctl_window( struct ANativeWindow *window ) DECLSPEC_HIDDEN;
extern void destroy_ioctl_window( HWND hwnd ) DECLSPEC_HIDDEN;
extern int ioctl_window_pos_changed( HWND hwnd, const RECT *window_rect, const RECT *client_rect,
const RECT *visible_rect, UINT style, UINT flags,
diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c
index 3dacd48..e6ddc50 100644
--- a/dlls/wineandroid.drv/device.c
+++ b/dlls/wineandroid.drv/device.c
@@ -66,6 +66,14 @@ struct native_win_data
HWND hwnd;
};
+/* wrapper for a native window in the context of the client (non-Java) process */
+struct native_win_wrapper
+{
+ struct ANativeWindow win;
+ HWND hwnd;
+ LONG ref;
+};
+
struct ioctl_header
{
int hwnd;
@@ -452,14 +460,118 @@ static int android_ioctl( enum android_ioctl code, void *in, DWORD in_size, void
return status_to_android_error( status );
}
-void create_ioctl_window( HWND hwnd )
+static void win_incRef( struct android_native_base_t *base )
+{
+ struct native_win_wrapper *win = (struct native_win_wrapper *)base;
+ InterlockedIncrement( &win->ref );
+}
+
+static void win_decRef( struct android_native_base_t *base )
+{
+ struct native_win_wrapper *win = (struct native_win_wrapper *)base;
+ InterlockedDecrement( &win->ref );
+}
+
+static int dequeueBuffer( struct ANativeWindow *window, struct ANativeWindowBuffer **buffer, int *fence )
+{
+ return 0;
+}
+
+static int cancelBuffer( struct ANativeWindow *window, struct ANativeWindowBuffer *buffer, int fence )
+{
+ return 0;
+}
+
+static int queueBuffer( struct ANativeWindow *window, struct ANativeWindowBuffer *buffer, int fence )
+{
+ return 0;
+}
+
+static int dequeueBuffer_DEPRECATED( struct ANativeWindow *window, struct ANativeWindowBuffer **buffer )
+{
+ return 0;
+}
+
+static int cancelBuffer_DEPRECATED( struct ANativeWindow *window, struct ANativeWindowBuffer *buffer )
+{
+ return 0;
+}
+
+static int lockBuffer_DEPRECATED( struct ANativeWindow *window, struct ANativeWindowBuffer *buffer )
+{
+ return 0; /* nothing to do */
+}
+
+static int queueBuffer_DEPRECATED( struct ANativeWindow *window, struct ANativeWindowBuffer *buffer )
+{
+ return 0;
+}
+
+static int setSwapInterval( struct ANativeWindow *window, int interval )
+{
+ return 0;
+}
+
+static int query( const ANativeWindow *window, int what, int *value )
+{
+ return 0;
+}
+
+static int perform( ANativeWindow *window, int operation, ... )
+{
+ return 0;
+}
+
+struct ANativeWindow *create_ioctl_window( HWND hwnd )
{
struct ioctl_android_create_window req;
+ struct native_win_wrapper *win = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*win) );
HWND parent = GetAncestor( hwnd, GA_PARENT );
+ if (!win) return NULL;
+
+ win->win.common.magic = ANDROID_NATIVE_WINDOW_MAGIC;
+ win->win.common.version = sizeof(ANativeWindow);
+ win->win.common.incRef = win_incRef;
+ win->win.common.decRef = win_decRef;
+ win->win.setSwapInterval = setSwapInterval;
+ win->win.dequeueBuffer_DEPRECATED = dequeueBuffer_DEPRECATED;
+ win->win.lockBuffer_DEPRECATED = lockBuffer_DEPRECATED;
+ win->win.queueBuffer_DEPRECATED = queueBuffer_DEPRECATED;
+ win->win.query = query;
+ win->win.perform = perform;
+ win->win.cancelBuffer_DEPRECATED = cancelBuffer_DEPRECATED;
+ win->win.dequeueBuffer = dequeueBuffer;
+ win->win.queueBuffer = queueBuffer;
+ win->win.cancelBuffer = cancelBuffer;
+ win->ref = 1;
+ win->hwnd = hwnd;
+ TRACE( "-> %p %p\n", win, win->hwnd );
+
req.hdr.hwnd = HandleToLong( hwnd );
req.parent = parent == GetDesktopWindow() ? 0 : HandleToLong( parent );
android_ioctl( IOCTL_CREATE_WINDOW, &req, sizeof(req), NULL, NULL );
+
+ return &win->win;
+}
+
+struct ANativeWindow *grab_ioctl_window( struct ANativeWindow *window )
+{
+ struct native_win_wrapper *win = (struct native_win_wrapper *)window;
+ InterlockedIncrement( &win->ref );
+ return window;
+}
+
+void release_ioctl_window( struct ANativeWindow *window )
+{
+ struct native_win_wrapper *win = (struct native_win_wrapper *)window;
+
+ if (InterlockedDecrement( &win->ref ) > 0) return;
+
+ TRACE( "%p %p\n", win, win->hwnd );
+
+ destroy_ioctl_window( win->hwnd );
+ HeapFree( GetProcessHeap(), 0, win );
}
void destroy_ioctl_window( HWND hwnd )
diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c
index 49520eb..65b37d8 100644
--- a/dlls/wineandroid.drv/window.c
+++ b/dlls/wineandroid.drv/window.c
@@ -57,6 +57,7 @@ struct android_win_data
RECT window_rect; /* USER window rectangle relative to parent */
RECT whole_rect; /* X window rectangle for the whole window relative to parent */
RECT client_rect; /* client area relative to parent */
+ ANativeWindow *window; /* native window wrapper that forwards calls to the desktop process */
};
#define SWP_AGG_NOPOSCHANGE (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOZORDER)
@@ -88,7 +89,7 @@ static struct android_win_data *alloc_win_data( HWND hwnd )
if ((data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data))))
{
data->hwnd = hwnd;
- create_ioctl_window( hwnd );
+ data->window = create_ioctl_window( hwnd );
EnterCriticalSection( &win_data_section );
win_data_context[context_idx(hwnd)] = data;
}
@@ -103,7 +104,7 @@ static void free_win_data( struct android_win_data *data )
{
win_data_context[context_idx( data->hwnd )] = NULL;
LeaveCriticalSection( &win_data_section );
- destroy_ioctl_window( data->hwnd );
+ if (data->window) release_ioctl_window( data->window );
HeapFree( GetProcessHeap(), 0, data );
}
More information about the wine-cvs
mailing list