Android joystick backend
This commit is contained in:
parent
df0a0f2a64
commit
4697cda8b0
4 changed files with 167 additions and 13 deletions
BIN
src/in/celest/xash3d/.ShortcutActivity.java.kate-swp
Normal file
BIN
src/in/celest/xash3d/.ShortcutActivity.java.kate-swp
Normal file
Binary file not shown.
|
@ -120,7 +120,7 @@ public class LauncherActivity extends Activity {
|
||||||
pixelSpinner.setAdapter(adapter);
|
pixelSpinner.setAdapter(adapter);
|
||||||
useVolume.setChecked(mPref.getBoolean("usevolume",true));
|
useVolume.setChecked(mPref.getBoolean("usevolume",true));
|
||||||
checkUpdates.setChecked(mPref.getBoolean("check_updates",true));
|
checkUpdates.setChecked(mPref.getBoolean("check_updates",true));
|
||||||
updateToBeta.setChecked(mPref.getBoolean("check_betas", false);
|
updateToBeta.setChecked(mPref.getBoolean("check_betas", false));
|
||||||
updatePath(mPref.getString("basedir", getDefaultPath()));
|
updatePath(mPref.getString("basedir", getDefaultPath()));
|
||||||
cmdArgs.setText(mPref.getString("argv","-dev 3 -log"));
|
cmdArgs.setText(mPref.getString("argv","-dev 3 -log"));
|
||||||
pixelSpinner.setSelection(mPref.getInt("pixelformat", 0));
|
pixelSpinner.setSelection(mPref.getInt("pixelformat", 0));
|
||||||
|
@ -264,6 +264,8 @@ public class LauncherActivity extends Activity {
|
||||||
{
|
{
|
||||||
os.write(buffer, 0, len);
|
os.write(buffer, 0, len);
|
||||||
}
|
}
|
||||||
|
os.flush();
|
||||||
|
|
||||||
return os.toString();
|
return os.toString();
|
||||||
}
|
}
|
||||||
catch(Exception e)
|
catch(Exception e)
|
||||||
|
@ -324,7 +326,7 @@ public class LauncherActivity extends Activity {
|
||||||
// this is an update
|
// this is an update
|
||||||
if( getString(R.string.version_string).compareTo(version) < 0 )
|
if( getString(R.string.version_string).compareTo(version) < 0 )
|
||||||
{
|
{
|
||||||
String dialog_message String.format(getString(R.string.update_message), name);
|
String dialog_message = String.format(getString(R.string.update_message), name);
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext());
|
AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext());
|
||||||
builder.setMessage(dialog_message)
|
builder.setMessage(dialog_message)
|
||||||
.setPositiveButton(R.string.update, new DialogInterface.OnClickListener()
|
.setPositiveButton(R.string.update, new DialogInterface.OnClickListener()
|
||||||
|
|
|
@ -6,7 +6,7 @@ import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import in.celest.xash3d.hl.R;
|
import in.celest.xash3d.hl.*;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
|
@ -150,8 +150,16 @@ public class XashActivity extends Activity {
|
||||||
public static native void nativeString( String text );
|
public static native void nativeString( String text );
|
||||||
public static native void nativeSetPause(int pause);
|
public static native void nativeSetPause(int pause);
|
||||||
|
|
||||||
public static native int setenv(String key, String value, boolean overwrite);
|
public static native void nativeHat(int id, byte hat, byte keycode, byte down);
|
||||||
|
public static native void nativeAxis(int id, byte axis, short value);
|
||||||
|
public static native void nativeJoyButton(int id, byte button, byte down);
|
||||||
|
|
||||||
|
// for future expansion
|
||||||
|
public static native void nativeBall(int id, byte ball, short xrel, short yrel);
|
||||||
|
public static native void nativeJoyAdd( int id );
|
||||||
|
public static native void nativeJoyDel( int id );
|
||||||
|
|
||||||
|
public static native int setenv(String key, String value, boolean overwrite);
|
||||||
|
|
||||||
// Java functions called from C
|
// Java functions called from C
|
||||||
|
|
||||||
|
@ -213,29 +221,162 @@ public class XashActivity extends Activity {
|
||||||
|
|
||||||
public static boolean handleKey( int keyCode, KeyEvent event )
|
public static boolean handleKey( int keyCode, KeyEvent event )
|
||||||
{
|
{
|
||||||
|
|
||||||
if ( mUseVolume && ( keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
|
if ( mUseVolume && ( keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
|
||||||
keyCode == KeyEvent.KEYCODE_VOLUME_UP ) )
|
keyCode == KeyEvent.KEYCODE_VOLUME_UP ) )
|
||||||
return false;
|
return false;
|
||||||
//Log.d( TAG, "Keycode " + keyCode );
|
|
||||||
|
int source = event.getSource();
|
||||||
|
boolean isGamePad = (source & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD;
|
||||||
|
boolean isJoystick = (source & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK;
|
||||||
|
boolean isDPad = (source & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD;
|
||||||
|
|
||||||
|
if( isGamePad || isJoystick )
|
||||||
|
{
|
||||||
|
byte value;
|
||||||
|
|
||||||
|
switch( keyCode )
|
||||||
|
{
|
||||||
|
// main buttons. DONT CHANGE THIS!!!!111oneone
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_A: value = 0; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_B: value = 1; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_X: value = 2; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_Y: value = 3; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_L1: value = 4; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_R1: value = 5; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_SELECT: value = 6; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_MODE: value = 7; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_START: value = 8; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_THUMBL: value = 9; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_THUMBR: value = 10; break;
|
||||||
|
|
||||||
|
// other
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_C: value = 11; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_Z: value = 12; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_L2: value = 13; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_R2: value = 14; break;
|
||||||
|
default:
|
||||||
|
if( keyCode >= KeyEvent.KEYCODE_BUTTON_1 && keyCode <= KeyEvent.KEYCODE_BUTTON_16 )
|
||||||
|
{
|
||||||
|
value = keyCode - KeyEvent.KEYCODE_BUTTON_1 + 15;
|
||||||
|
}
|
||||||
|
else if( KeyEvent.isGamePadButton(keyCode) )
|
||||||
|
{
|
||||||
|
Log.d(TAG, "Unhandled GamePad button: " + KeyEvent.keyCodeToString(keyCode) );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( event.getAction() == KeyEvent.ACTION_DOWN )
|
||||||
|
nativeJoyButton( 0, value, true );
|
||||||
|
else if( event.getAction() == KeyEvent.ACTION_UP )
|
||||||
|
nativeJoyButton( 0, value, false );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( isDPad )
|
||||||
|
{
|
||||||
|
int dpad;
|
||||||
|
|
||||||
|
switch( keyCode )
|
||||||
|
{
|
||||||
|
case KeyEvent.KEYCODE_DPAD_CENTER:
|
||||||
|
dpad = 0; break;
|
||||||
|
case KeyEvent.KEYCODE_DPAD_UP:
|
||||||
|
dpad = 1; break;
|
||||||
|
case KeyEvent.KEYCODE_DPAD_RIGHT:
|
||||||
|
dpad = 2; break;
|
||||||
|
case KeyEvent.KEYCODE_DPAD_LEFT:
|
||||||
|
dpad = 3; break;
|
||||||
|
case KeyEvent.KEYCODE_DPAD_DOWN:
|
||||||
|
dpad = 4; break;
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( event.getAction() == KeyEvent.ACTION_DOWN )
|
||||||
|
nativeJoyButton( 0, 0, dpad, true );
|
||||||
|
else if( event.getAction() == KeyEvent.ACTION_UP )
|
||||||
|
nativeJoyButton( 0, 0, dpad, false );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d( TAG, "Keycode " + KeyEvent.keyCodeToString(keyCode) +
|
||||||
|
". IsGamePadButton(" + KeyEvent.isGamePadButton(keyCode) + ")" );
|
||||||
if (event.getAction() == KeyEvent.ACTION_DOWN)
|
if (event.getAction() == KeyEvent.ACTION_DOWN)
|
||||||
{
|
{
|
||||||
if (event.isPrintingKey() || keyCode == 62)// space is printing too
|
if (event.isPrintingKey() || keyCode == 62)// space is printing too
|
||||||
XashActivity.nativeString(String.valueOf((char) event.getUnicodeChar()));
|
XashActivity.nativeString(String.valueOf((char) event.getUnicodeChar()));
|
||||||
|
|
||||||
XashActivity.nativeKey(1,keyCode);
|
XashActivity.nativeKey(1, keyCode);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (event.getAction() == KeyEvent.ACTION_UP)
|
else if (event.getAction() == KeyEvent.ACTION_UP)
|
||||||
{
|
{
|
||||||
|
|
||||||
XashActivity.nativeKey(0,keyCode);
|
XashActivity.nativeKey(0, keyCode);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static float performEngineAxisEvent( MotionEvent event, int axis, byte engineAxis, float prev )
|
||||||
|
{
|
||||||
|
final float current = event.getAxisValue( axis );
|
||||||
|
if( prev != current && engineAxis != 255 )
|
||||||
|
{
|
||||||
|
if( current < 0 )
|
||||||
|
nativeAxis( 0, engineAxis, (short)(current * -32768) );
|
||||||
|
else nativeAxis(0, engineAxis, (short)(current * 32767) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float prevLeftX, prevLeftY, prevRightX, prevRightY, prevLT, prevRT, prevHX, prevHY;
|
||||||
|
public static boolean handleAxis( MotionEvent event )
|
||||||
|
{
|
||||||
|
|
||||||
|
prevLeftX = performEngineAxisEvent(event, event.AXIS_X, 0, prevLeftX);
|
||||||
|
prevLeftY = performEngineAxisEvent(event, event.AXIS_Y, 1, prevLeftY);
|
||||||
|
prevRightX = performEngineAxisEvent(event, event.AXIS_Z, 2, prevRightX);
|
||||||
|
prevRightY = performEngineAxisEvent(event, event.AXIS_RZ, 3, prevRightY);
|
||||||
|
prevLT = performEngineAxisEvent(event, event.LTRIGGER, 4, prevLT);
|
||||||
|
prevRT = performEngineAxisEvent(event, event.RTRIGGER, 5, prevRT);
|
||||||
|
|
||||||
|
// Because Android may map DPad to AXIS_HAT_X/Y, we need to check these again here
|
||||||
|
float HX = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_X);
|
||||||
|
float HY = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_Y);
|
||||||
|
|
||||||
|
if(prevHX != HX)
|
||||||
|
{
|
||||||
|
if(HX == 1.0f)
|
||||||
|
nativeHat( 0, 0, 2, true );
|
||||||
|
else if(HX == -1.0f)
|
||||||
|
nativeHat( 0, 0, 3, true );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nativeHat( 0, 0, 2, false );
|
||||||
|
nativeHat( 0, 0, 3, false );
|
||||||
|
}
|
||||||
|
prevHX = HX;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( prevHY != HY )
|
||||||
|
{
|
||||||
|
if(HX == 1.0f)
|
||||||
|
nativeHat( 0, 0, 1, true );
|
||||||
|
else if(HX == -1.0f)
|
||||||
|
nativeHat( 0, 0, 4, true );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nativeHat( 0, 0, 1, false );
|
||||||
|
nativeHat( 0, 0, 4, false );
|
||||||
|
}
|
||||||
|
prevHY = HY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static class ShowTextInputTask implements Runnable
|
static class ShowTextInputTask implements Runnable
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -503,10 +644,21 @@ View.OnKeyListener {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
public boolean onKey(View v, int keyCode, KeyEvent event)
|
||||||
|
{
|
||||||
return XashActivity.handleKey( keyCode, event );
|
return XashActivity.handleKey( keyCode, event );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onGenericMotionEvent(MotionEvent event)
|
||||||
|
{
|
||||||
|
if( (event.getSource & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK )
|
||||||
|
return XashActivity.handleAxis( event );
|
||||||
|
// TODO: Add it someday
|
||||||
|
// else if( (event.getSource & InputDevice.SOURCE_CLASS_TRACKBALL) == InputDevice.SOURCE_CLASS_TRACKBALL )
|
||||||
|
// return XashActivity.handleBall( event );
|
||||||
|
return super.onGenericMotionEvent( event );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a fake invisible editor view that receives the input and defines the
|
/* This is a fake invisible editor view that receives the input and defines the
|
||||||
|
|
Loading…
Add table
Reference in a new issue