Alexandre Julliard : wineandroid: Forward native window query() calls to the desktop process.
Alexandre Julliard
julliard at winehq.org
Mon Jun 5 16:56:30 CDT 2017
Module: wine
Branch: master
Commit: f69836eba907653b581a0ea7287ee4a74bef489a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f69836eba907653b581a0ea7287ee4a74bef489a
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jun 5 12:26:27 2017 +0200
wineandroid: Forward native window query() calls to the desktop process.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wineandroid.drv/device.c | 64 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c
index e6ddc50..48b595f 100644
--- a/dlls/wineandroid.drv/device.c
+++ b/dlls/wineandroid.drv/device.c
@@ -56,6 +56,7 @@ enum android_ioctl
IOCTL_CREATE_WINDOW,
IOCTL_DESTROY_WINDOW,
IOCTL_WINDOW_POS_CHANGED,
+ IOCTL_QUERY,
NB_IOCTLS
};
@@ -102,6 +103,13 @@ struct ioctl_android_window_pos_changed
int owner;
};
+struct ioctl_android_query
+{
+ struct ioctl_header hdr;
+ int what;
+ int value;
+};
+
static inline DWORD current_client_id(void)
{
return HandleToUlong( PsGetCurrentProcessId() );
@@ -197,6 +205,29 @@ void register_native_window( HWND hwnd, struct ANativeWindow *win )
NtQueueApcThread( thread, register_native_window_callback, (ULONG_PTR)hwnd, (ULONG_PTR)win, 0 );
}
+static NTSTATUS android_error_to_status( int err )
+{
+ switch (err)
+ {
+ case 0: return STATUS_SUCCESS;
+ case -ENOMEM: return STATUS_NO_MEMORY;
+ case -ENOSYS: return STATUS_NOT_SUPPORTED;
+ case -EINVAL: return STATUS_INVALID_PARAMETER;
+ case -ENOENT: return STATUS_INVALID_HANDLE;
+ case -EPERM: return STATUS_ACCESS_DENIED;
+ case -ENODEV: return STATUS_NO_SUCH_DEVICE;
+ case -EEXIST: return STATUS_DUPLICATE_NAME;
+ case -EPIPE: return STATUS_PIPE_DISCONNECTED;
+ case -ENODATA: return STATUS_NO_MORE_FILES;
+ case -ETIMEDOUT: return STATUS_IO_TIMEOUT;
+ case -EBADMSG: return STATUS_INVALID_DEVICE_REQUEST;
+ case -EWOULDBLOCK: return STATUS_DEVICE_NOT_READY;
+ default:
+ FIXME( "unmapped error %d\n", err );
+ return STATUS_UNSUCCESSFUL;
+ }
+}
+
static int status_to_android_error( NTSTATUS status )
{
switch (status)
@@ -323,12 +354,33 @@ static NTSTATUS windowPosChanged_ioctl( void *data, DWORD in_size, DWORD out_siz
return STATUS_SUCCESS;
}
+static NTSTATUS query_ioctl( void *data, DWORD in_size, DWORD out_size, ULONG_PTR *ret_size )
+{
+ struct ioctl_android_query *res = data;
+ struct ANativeWindow *parent;
+ struct native_win_data *win_data;
+ int ret;
+
+ if (in_size < sizeof(*res)) return STATUS_INVALID_PARAMETER;
+ if (out_size < sizeof(*res)) return STATUS_BUFFER_OVERFLOW;
+
+ if (!(win_data = get_ioctl_native_win_data( &res->hdr ))) return STATUS_INVALID_HANDLE;
+ if (!(parent = win_data->parent)) return STATUS_DEVICE_NOT_READY;
+
+ *ret_size = sizeof( *res );
+ wrap_java_call();
+ ret = parent->query( parent, res->what, &res->value );
+ unwrap_java_call();
+ return android_error_to_status( ret );
+}
+
typedef NTSTATUS (*ioctl_func)( void *in, DWORD in_size, DWORD out_size, ULONG_PTR *ret_size );
static const ioctl_func ioctl_funcs[] =
{
createWindow_ioctl, /* IOCTL_CREATE_WINDOW */
destroyWindow_ioctl, /* IOCTL_DESTROY_WINDOW */
windowPosChanged_ioctl, /* IOCTL_WINDOW_POS_CHANGED */
+ query_ioctl, /* IOCTL_QUERY */
};
static NTSTATUS WINAPI ioctl_callback( DEVICE_OBJECT *device, IRP *irp )
@@ -514,7 +566,17 @@ static int setSwapInterval( struct ANativeWindow *window, int interval )
static int query( const ANativeWindow *window, int what, int *value )
{
- return 0;
+ struct native_win_wrapper *win = (struct native_win_wrapper *)window;
+ struct ioctl_android_query query;
+ DWORD size = sizeof( query );
+ int ret;
+
+ query.hdr.hwnd = HandleToLong( win->hwnd );
+ query.what = what;
+ ret = android_ioctl( IOCTL_QUERY, &query, sizeof(query), &query, &size );
+ TRACE( "hwnd %p what %d got %d -> %p\n", win->hwnd, what, query.value, value );
+ if (!ret) *value = query.value;
+ return ret;
}
static int perform( ANativeWindow *window, int operation, ... )
More information about the wine-cvs
mailing list