wineandroid: Add infrastructure to support a separate TextureView for the window client area.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2017-06-22 19:36:54 +02:00
parent 95c4516b65
commit f77bbd45d6
4 changed files with 45 additions and 25 deletions

View File

@ -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];

View File

@ -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;

View File

@ -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 },
};

View File

@ -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: