From f77bbd45d6b475dbed23a66ba4f5495f8ea12932 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 22 Jun 2017 19:36:54 +0200 Subject: [PATCH] wineandroid: Add infrastructure to support a separate TextureView for the window client area. Signed-off-by: Alexandre Julliard --- dlls/wineandroid.drv/WineActivity.java | 50 +++++++++++++++++--------- dlls/wineandroid.drv/android.h | 4 ++- dlls/wineandroid.drv/init.c | 2 +- dlls/wineandroid.drv/window.c | 14 ++++---- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/dlls/wineandroid.drv/WineActivity.java b/dlls/wineandroid.drv/WineActivity.java index f9f0a9c0199..a341746570e 100644 --- a/dlls/wineandroid.drv/WineActivity.java +++ b/dlls/wineandroid.drv/WineActivity.java @@ -54,7 +54,7 @@ public class WineActivity extends Activity private native String wine_init( String[] cmdline, String[] env ); public native void wine_desktop_changed( int width, int height ); public native void wine_config_changed( int dpi ); - public native void wine_surface_changed( int hwnd, Surface surface ); + public native void wine_surface_changed( int hwnd, Surface surface, boolean opengl ); public native boolean wine_motion_event( int hwnd, int action, int x, int y, int state, int vscroll ); public native boolean wine_keyboard_event( int hwnd, int action, int keycode, int state ); @@ -299,6 +299,7 @@ protected class WineWindow extends Object protected WineWindow parent; protected WineView window_view; protected Surface window_surface; + protected Surface client_surface; public WineWindow( int w, WineWindow parent ) { @@ -312,7 +313,7 @@ public WineWindow( int w, WineWindow parent ) win_map.put( w, this ); if (parent == null) { - window_view = new WineView( WineActivity.this, this ); + window_view = new WineView( WineActivity.this, this, false ); window_view.layout( 0, 0, 1, 1 ); // make sure the surface gets created } } @@ -353,7 +354,7 @@ public void set_parent( WineWindow new_parent ) parent = new_parent; if (new_parent == null) { - window_view = new WineView( WineActivity.this, this ); + window_view = new WineView( WineActivity.this, this, false ); window_view.layout( 0, 0, 1, 1 ); // make sure the surface gets created } else window_view = null; @@ -364,12 +365,22 @@ public int get_hwnd() return hwnd; } - public void set_surface( SurfaceTexture surftex ) + public void set_surface( SurfaceTexture surftex, boolean is_client ) { - if (surftex == null) window_surface = null; - else if (window_surface == null) window_surface = new Surface( surftex ); - Log.i( LOGTAG, String.format( "set window surface hwnd %08x %s", hwnd, window_surface )); - wine_surface_changed( hwnd, window_surface ); + if (is_client) + { + if (surftex == null) client_surface = null; + else if (client_surface == null) client_surface = new Surface( surftex ); + Log.i( LOGTAG, String.format( "set client surface hwnd %08x %s", hwnd, client_surface )); + wine_surface_changed( hwnd, client_surface, true ); + } + else + { + if (surftex == null) window_surface = null; + else if (window_surface == null) window_surface = new Surface( surftex ); + Log.i( LOGTAG, String.format( "set window surface hwnd %08x %s", hwnd, window_surface )); + wine_surface_changed( hwnd, window_surface, false ); + } } public void get_event_pos( MotionEvent event, int[] pos ) @@ -384,11 +395,13 @@ public void get_event_pos( MotionEvent event, int[] pos ) protected class WineView extends TextureView implements TextureView.SurfaceTextureListener { private WineWindow window; + private boolean is_client; - public WineView( Context c, WineWindow win ) + public WineView( Context c, WineWindow win, boolean client ) { super( c ); window = win; + is_client = client; setSurfaceTextureListener( this ); setVisibility( VISIBLE ); setOpaque( false ); @@ -403,22 +416,23 @@ public WineWindow get_window() public void onSurfaceTextureAvailable( SurfaceTexture surftex, int width, int height ) { - Log.i( LOGTAG, String.format( "onSurfaceTextureAvailable win %08x %dx%d", - window.hwnd, width, height )); - window.set_surface( surftex ); + Log.i( LOGTAG, String.format( "onSurfaceTextureAvailable win %08x %dx%d %s", + window.hwnd, width, height, is_client ? "client" : "whole" )); + window.set_surface( surftex, is_client ); } public void onSurfaceTextureSizeChanged( SurfaceTexture surftex, int width, int height ) { - Log.i( LOGTAG, String.format( "onSurfaceTextureSizeChanged win %08x %dx%d", - window.hwnd, width, height )); - window.set_surface( surftex ); + Log.i( LOGTAG, String.format( "onSurfaceTextureSizeChanged win %08x %dx%d %s", + window.hwnd, width, height, is_client ? "client" : "whole" )); + window.set_surface( surftex, is_client); } public boolean onSurfaceTextureDestroyed( SurfaceTexture surftex ) { - Log.i( LOGTAG, String.format( "onSurfaceTextureDestroyed win %08x", window.hwnd )); - window.set_surface( null ); + Log.i( LOGTAG, String.format( "onSurfaceTextureDestroyed win %08x %s", + window.hwnd, is_client ? "client" : "whole" )); + window.set_surface( null, is_client ); return true; } @@ -428,6 +442,7 @@ public void onSurfaceTextureUpdated(SurfaceTexture surftex) public boolean onGenericMotionEvent( MotionEvent event ) { + if (is_client) return false; // let the whole window handle it if (window.parent != null) return false; // let the parent handle it if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) @@ -445,6 +460,7 @@ public boolean onGenericMotionEvent( MotionEvent event ) public boolean onTouchEvent( MotionEvent event ) { + if (is_client) return false; // let the whole window handle it if (window.parent != null) return false; // let the parent handle it int[] pos = new int[2]; diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index a8c59de5e1b..a1084d079c6 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -87,7 +87,8 @@ extern void update_keyboard_lock_state( WORD vkey, UINT state ) DECLSPEC_HIDDEN; /* JNI entry points */ extern void desktop_changed( JNIEnv *env, jobject obj, jint width, jint height ) DECLSPEC_HIDDEN; extern void config_changed( JNIEnv *env, jobject obj, jint dpi ) DECLSPEC_HIDDEN; -extern void surface_changed( JNIEnv *env, jobject obj, jint win, jobject surface ) DECLSPEC_HIDDEN; +extern void surface_changed( JNIEnv *env, jobject obj, jint win, jobject surface, + jboolean client ) DECLSPEC_HIDDEN; extern jboolean motion_event( JNIEnv *env, jobject obj, jint win, jint action, jint x, jint y, jint state, jint vscroll ) DECLSPEC_HIDDEN; extern jboolean keyboard_event( JNIEnv *env, jobject obj, jint win, jint action, @@ -121,6 +122,7 @@ union event_data enum event_type type; HWND hwnd; ANativeWindow *window; + BOOL client; unsigned int width; unsigned int height; } surface; diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 54be12ad1e3..9d6d9ef7213 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -458,7 +458,7 @@ static const JNINativeMethod methods[] = { { "wine_desktop_changed", "(II)V", desktop_changed }, { "wine_config_changed", "(I)V", config_changed }, - { "wine_surface_changed", "(ILandroid/view/Surface;)V", surface_changed }, + { "wine_surface_changed", "(ILandroid/view/Surface;Z)V", surface_changed }, { "wine_motion_event", "(IIIIII)Z", motion_event }, { "wine_keyboard_event", "(IIII)Z", keyboard_event }, }; diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index b3b6d0069e5..3bfd0a8b748 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -245,12 +245,13 @@ void config_changed( JNIEnv *env, jobject obj, jint dpi ) * * JNI callback, runs in the context of the Java thread. */ -void surface_changed( JNIEnv *env, jobject obj, jint win, jobject surface ) +void surface_changed( JNIEnv *env, jobject obj, jint win, jobject surface, jboolean client ) { union event_data data; memset( &data, 0, sizeof(data) ); data.surface.hwnd = LongToHandle( win ); + data.surface.client = client; if (surface) { int width, height; @@ -261,8 +262,8 @@ void surface_changed( JNIEnv *env, jobject obj, jint win, jobject surface ) data.surface.window = win; data.surface.width = width; data.surface.height = height; - p__android_log_print( ANDROID_LOG_INFO, "wine", "surface_changed: %p %ux%u", - data.surface.hwnd, width, height ); + p__android_log_print( ANDROID_LOG_INFO, "wine", "surface_changed: %p %s %ux%u", + data.surface.hwnd, client ? "client" : "whole", width, height ); } data.type = SURFACE_CHANGED; send_event( &data ); @@ -451,10 +452,11 @@ static int process_events( DWORD mask ) break; case SURFACE_CHANGED: - TRACE("SURFACE_CHANGED %p %p size %ux%u\n", event->data.surface.hwnd, - event->data.surface.window, event->data.surface.width, event->data.surface.height ); + TRACE("SURFACE_CHANGED %p %p %s size %ux%u\n", event->data.surface.hwnd, + event->data.surface.window, event->data.surface.client ? "client" : "whole", + event->data.surface.width, event->data.surface.height ); - register_native_window( event->data.surface.hwnd, event->data.surface.window, FALSE ); + register_native_window( event->data.surface.hwnd, event->data.surface.window, event->data.surface.client ); break; case MOTION_EVENT: