Fix crash if MotionEvent.getDevice() will return NULL in joystick backend. Add a checks to InitGL, just in case
This commit is contained in:
parent
de21d49463
commit
dd1607f261
1 changed files with 59 additions and 17 deletions
|
@ -625,7 +625,8 @@ View.OnKeyListener {
|
||||||
public void onDraw(Canvas canvas) {}
|
public void onDraw(Canvas canvas) {}
|
||||||
|
|
||||||
// first, initialize native backend
|
// first, initialize native backend
|
||||||
public Surface getNativeSurface() {
|
public Surface getNativeSurface()
|
||||||
|
{
|
||||||
return getHolder().getSurface();
|
return getHolder().getSurface();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -634,13 +635,30 @@ View.OnKeyListener {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
EGL10 egl = (EGL10)EGLContext.getEGL();
|
EGL10 egl = (EGL10)EGLContext.getEGL();
|
||||||
|
|
||||||
|
if( egl == null )
|
||||||
|
{
|
||||||
|
Log.e( TAG, "Cannot get EGL from context" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
|
EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
|
||||||
|
|
||||||
|
if( dpy == null )
|
||||||
|
{
|
||||||
|
Log.e( TAG, "Cannot get display" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int[] version = new int[2];
|
int[] version = new int[2];
|
||||||
egl.eglInitialize(dpy, version);
|
if( !egl.eglInitialize(dpy, version) )
|
||||||
|
{
|
||||||
int[][] configSpec = {{
|
Log.e(TAG, "No EGL config available");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int[][] configSpec =
|
||||||
|
{{
|
||||||
EGL10.EGL_DEPTH_SIZE, 8,
|
EGL10.EGL_DEPTH_SIZE, 8,
|
||||||
EGL10.EGL_RED_SIZE, 8,
|
EGL10.EGL_RED_SIZE, 8,
|
||||||
EGL10.EGL_GREEN_SIZE, 8,
|
EGL10.EGL_GREEN_SIZE, 8,
|
||||||
|
@ -695,7 +713,7 @@ View.OnKeyListener {
|
||||||
}
|
}
|
||||||
EGLConfig config = configs[0];
|
EGLConfig config = configs[0];
|
||||||
|
|
||||||
int EGL_CONTEXT_CLIENT_VERSION=0x3098;
|
int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
|
||||||
int contextAttrs[] = new int[]
|
int contextAttrs[] = new int[]
|
||||||
{
|
{
|
||||||
EGL_CONTEXT_CLIENT_VERSION, 1,
|
EGL_CONTEXT_CLIENT_VERSION, 1,
|
||||||
|
@ -724,9 +742,12 @@ View.OnKeyListener {
|
||||||
mEGL = egl;
|
mEGL = egl;
|
||||||
mEGLConfig = config;
|
mEGLConfig = config;
|
||||||
|
|
||||||
} catch(Exception e) {
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
Log.v(TAG, e + "");
|
Log.v(TAG, e + "");
|
||||||
for (StackTraceElement s : e.getStackTrace()) {
|
for (StackTraceElement s : e.getStackTrace())
|
||||||
|
{
|
||||||
Log.v(TAG, s.toString());
|
Log.v(TAG, s.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1034,9 +1055,14 @@ class JoystickHandler_v12 extends JoystickHandler
|
||||||
return event.getSource();
|
return event.getSource();
|
||||||
}
|
}
|
||||||
public boolean handleAxis( MotionEvent event )
|
public boolean handleAxis( MotionEvent event )
|
||||||
{
|
{
|
||||||
|
// how event can be from null device, Android?
|
||||||
|
final InputDevice device = event.getDevice();
|
||||||
|
if( device == null )
|
||||||
|
return;
|
||||||
|
|
||||||
// maybe I need to cache this...
|
// maybe I need to cache this...
|
||||||
for( InputDevice.MotionRange range: event.getDevice().getMotionRanges() )
|
for( InputDevice.MotionRange range: device.getMotionRanges() )
|
||||||
{
|
{
|
||||||
// normalize in -1.0..1.0 (copied from SDL2)
|
// normalize in -1.0..1.0 (copied from SDL2)
|
||||||
final float cur = ( event.getAxisValue( range.getAxis(), event.getActionIndex() ) - range.getMin() ) / range.getRange() * 2.0f - 1.0f;
|
final float cur = ( event.getAxisValue( range.getAxis(), event.getActionIndex() ) - range.getMin() ) / range.getRange() * 2.0f - 1.0f;
|
||||||
|
@ -1045,20 +1071,36 @@ class JoystickHandler_v12 extends JoystickHandler
|
||||||
{
|
{
|
||||||
// typical axes
|
// typical axes
|
||||||
// move
|
// move
|
||||||
case MotionEvent.AXIS_X: prevSide = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_SIDE, prevSide, dead); break;
|
case MotionEvent.AXIS_X:
|
||||||
case MotionEvent.AXIS_Y: prevFwd = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_FWD, prevFwd, dead); break;
|
prevSide = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_SIDE, prevSide, dead);
|
||||||
|
break;
|
||||||
|
case MotionEvent.AXIS_Y:
|
||||||
|
prevFwd = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_FWD, prevFwd, dead);
|
||||||
|
break;
|
||||||
|
|
||||||
// rotate. Invert, so by default this works as it's should
|
// rotate. Invert, so by default this works as it's should
|
||||||
case MotionEvent.AXIS_Z: prevPtch = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_PITCH, prevPtch, dead); break;
|
case MotionEvent.AXIS_Z:
|
||||||
case MotionEvent.AXIS_RZ: prevYaw = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_YAW, prevYaw, dead); break;
|
prevPtch = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_PITCH, prevPtch, dead);
|
||||||
|
break;
|
||||||
|
case MotionEvent.AXIS_RZ:
|
||||||
|
prevYaw = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_YAW, prevYaw, dead);
|
||||||
|
break;
|
||||||
|
|
||||||
// trigger
|
// trigger
|
||||||
case MotionEvent.AXIS_RTRIGGER: prevLT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_RT, prevLT, dead); break;
|
case MotionEvent.AXIS_RTRIGGER:
|
||||||
case MotionEvent.AXIS_LTRIGGER: prevRT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_LT, prevRT, dead); break;
|
prevLT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_RT, prevLT, dead);
|
||||||
|
break;
|
||||||
|
case MotionEvent.AXIS_LTRIGGER:
|
||||||
|
prevRT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_LT, prevRT, dead);
|
||||||
|
break;
|
||||||
|
|
||||||
// hats
|
// hats
|
||||||
case MotionEvent.AXIS_HAT_X: prevHX = XashActivity.performEngineHatEvent(cur, true, prevHX); break;
|
case MotionEvent.AXIS_HAT_X:
|
||||||
case MotionEvent.AXIS_HAT_Y: prevHY = XashActivity.performEngineHatEvent(cur, false, prevHY); break;
|
prevHX = XashActivity.performEngineHatEvent(cur, true, prevHX);
|
||||||
|
break;
|
||||||
|
case MotionEvent.AXIS_HAT_Y:
|
||||||
|
prevHY = XashActivity.performEngineHatEvent(cur, false, prevHY);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue