diff --git a/src/in/celest/xash3d/.ShortcutActivity.java.kate-swp b/src/in/celest/xash3d/.ShortcutActivity.java.kate-swp new file mode 100644 index 00000000..175bf014 Binary files /dev/null and b/src/in/celest/xash3d/.ShortcutActivity.java.kate-swp differ diff --git a/src/in/celest/xash3d/LauncherActivity.java b/src/in/celest/xash3d/LauncherActivity.java index f55ad489..57f41b1c 100644 --- a/src/in/celest/xash3d/LauncherActivity.java +++ b/src/in/celest/xash3d/LauncherActivity.java @@ -120,7 +120,7 @@ public class LauncherActivity extends Activity { pixelSpinner.setAdapter(adapter); useVolume.setChecked(mPref.getBoolean("usevolume",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())); cmdArgs.setText(mPref.getString("argv","-dev 3 -log")); pixelSpinner.setSelection(mPref.getInt("pixelformat", 0)); @@ -264,6 +264,8 @@ public class LauncherActivity extends Activity { { os.write(buffer, 0, len); } + os.flush(); + return os.toString(); } catch(Exception e) @@ -324,7 +326,7 @@ public class LauncherActivity extends Activity { // this is an update 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()); builder.setMessage(dialog_message) .setPositiveButton(R.string.update, new DialogInterface.OnClickListener() diff --git a/src/in/celest/xash3d/ShortcutActivity.java b/src/in/celest/xash3d/ShortcutActivity.java index 900fb518..23a8616b 100644 --- a/src/in/celest/xash3d/ShortcutActivity.java +++ b/src/in/celest/xash3d/ShortcutActivity.java @@ -6,7 +6,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.widget.Toast; -import in.celest.xash3d.hl.R; +import in.celest.xash3d.hl.*; import android.widget.EditText; import android.widget.Button; import java.io.File; diff --git a/src/in/celest/xash3d/XashActivity.java b/src/in/celest/xash3d/XashActivity.java index 8e90e176..4741adab 100644 --- a/src/in/celest/xash3d/XashActivity.java +++ b/src/in/celest/xash3d/XashActivity.java @@ -38,7 +38,7 @@ public class XashActivity extends Activity { public static int mPixelFormat; protected static ViewGroup mLayout; - // Preferences + // Preferences public static SharedPreferences mPref = null; private static boolean mUseVolume; @@ -150,9 +150,17 @@ public class XashActivity extends Activity { public static native void nativeString( String text ); public static native void nativeSetPause(int pause); + 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 public static boolean createGLContext() { @@ -213,28 +221,161 @@ public class XashActivity extends Activity { 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 ) ) - return false; - //Log.d( TAG, "Keycode " + keyCode ); + return false; + + 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.isPrintingKey() || keyCode == 62)// space is printing too XashActivity.nativeString(String.valueOf((char) event.getUnicodeChar())); - XashActivity.nativeKey(1,keyCode); + XashActivity.nativeKey(1, keyCode); return true; } else if (event.getAction() == KeyEvent.ACTION_UP) { - XashActivity.nativeKey(0,keyCode); + XashActivity.nativeKey(0, keyCode); return true; } 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 { @@ -503,10 +644,21 @@ View.OnKeyListener { @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - + public boolean onKey(View v, int keyCode, KeyEvent 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