diff --git a/project/java/Settings.java b/project/java/Settings.java index 605e36004..2f043c738 100644 --- a/project/java/Settings.java +++ b/project/java/Settings.java @@ -104,6 +104,10 @@ class Settings out.writeInt(Globals.CommandLine.length()); for( int i = 0; i < Globals.CommandLine.length(); i++ ) out.writeChar(Globals.CommandLine.charAt(i)); + out.writeInt(Globals.ScreenKbControlsLayout.length); + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + for( int ii = 0; ii < 4; ii++ ) + out.writeInt(Globals.ScreenKbControlsLayout[i][ii]); out.close(); settingsLoaded = true; @@ -220,6 +224,12 @@ class Settings for( int i = 0; i < len; i++ ) b.append( settingsFile.readChar() ); Globals.CommandLine = b.toString(); + + if( settingsFile.readInt() != Globals.ScreenKbControlsLayout.length ) + throw new IOException(); + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + for( int ii = 0; ii < 4; ii++ ) + Globals.ScreenKbControlsLayout[i][ii] = settingsFile.readInt(); settingsLoaded = true; @@ -470,6 +480,8 @@ class Settings items.add(p.getResources().getString(R.string.remap_screenkb)); + items.add(p.getResources().getString(R.string.screenkb_custom_layout)); + items.add(p.getResources().getString(R.string.ok)); AlertDialog.Builder builder = new AlertDialog.Builder(p); @@ -497,6 +509,10 @@ class Settings if( item == selected ) showRemapScreenKbConfig(p); selected++; + + if( item == selected ) + showCustomizeScreenKbLayout(p); + selected++; if( item == selected ) showConfigMainMenu(p); @@ -753,6 +769,10 @@ class Settings p.getResources().getString(R.string.controls_screenkb_small), p.getResources().getString(R.string.controls_screenkb_tiny) }; + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + for( int ii = 0; ii < 4; ii++ ) + Globals.ScreenKbControlsLayout[i][ii] = 0; + AlertDialog.Builder builder = new AlertDialog.Builder(p); builder.setTitle(p.getResources().getString(R.string.controls_screenkb_size)); builder.setSingleChoiceItems(items, Globals.TouchscreenKeyboardSize, new DialogInterface.OnClickListener() @@ -1390,7 +1410,7 @@ class Settings p.keyListener = tool; } - public static class ScreenEdgesCalibrationTool implements TouchEventsListener, KeyEventsListener + static class ScreenEdgesCalibrationTool implements TouchEventsListener, KeyEventsListener { MainActivity p; ImageView img; @@ -1449,6 +1469,119 @@ class Settings } } + static void showCustomizeScreenKbLayout(final MainActivity p) + { + p.setText(p.getResources().getString(R.string.screenkb_custom_layout_help)); + CustomizeScreenKbLayoutTool tool = new CustomizeScreenKbLayoutTool(p); + p.touchListener = tool; + p.keyListener = tool; + }; + + static class CustomizeScreenKbLayoutTool implements TouchEventsListener, KeyEventsListener + { + MainActivity p; + FrameLayout layout = null; + ImageView imgs[] = new ImageView[Globals.ScreenKbControlsLayout.length]; + Bitmap bmps[] = new Bitmap[Globals.ScreenKbControlsLayout.length]; + int currentButton = 0; + int buttons[] = { + R.drawable.dpad, + R.drawable.keyboard, + R.drawable.b1, + R.drawable.b2, + R.drawable.b3, + R.drawable.b4, + R.drawable.b5, + R.drawable.b6 + }; + + public CustomizeScreenKbLayoutTool(MainActivity _p) + { + p = _p; + layout = new FrameLayout(p); + p.getVideoLayout().addView(layout); + currentButton = 0; + setupButton(true); + } + + void setupButton(boolean undo) + { + do { + currentButton += undo ? -1 : 1; + if(currentButton >= Globals.ScreenKbControlsLayout.length) + { + p.getVideoLayout().removeView(layout); + layout = null; + p.touchListener = null; + p.keyListener = null; + showScreenKeyboardConfigMainMenu(p); + return; + } + if(currentButton < 0) + { + currentButton = 0; + undo = false; + } + } while( ! Globals.ScreenKbControlsShown[currentButton] ); + + if( imgs[currentButton] == null ) + { + imgs[currentButton] = new ImageView(p); + imgs[currentButton].setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); + imgs[currentButton].setScaleType(ImageView.ScaleType.MATRIX); + bmps[currentButton] = BitmapFactory.decodeResource( p.getResources(), buttons[currentButton] ); + imgs[currentButton].setImageBitmap(bmps[currentButton]); + layout.addView(imgs[currentButton]); + } + Matrix m = new Matrix(); + RectF src = new RectF(0, 0, bmps[currentButton].getWidth(), bmps[currentButton].getHeight()); + RectF dst = new RectF(Globals.ScreenKbControlsLayout[currentButton][0], Globals.ScreenKbControlsLayout[currentButton][1], + Globals.ScreenKbControlsLayout[currentButton][2], Globals.ScreenKbControlsLayout[currentButton][3]); + m.setRectToRect(src, dst, Matrix.ScaleToFit.FILL); + imgs[currentButton].setImageMatrix(m); + } + + public void onTouchEvent(final MotionEvent ev) + { + if( ev.getAction() == MotionEvent.ACTION_DOWN ) + { + Globals.ScreenKbControlsLayout[currentButton][0] = (int)ev.getX(); + Globals.ScreenKbControlsLayout[currentButton][1] = (int)ev.getY(); + Globals.ScreenKbControlsLayout[currentButton][2] = (int)ev.getX(); + Globals.ScreenKbControlsLayout[currentButton][3] = (int)ev.getY(); + } + if( ev.getAction() == MotionEvent.ACTION_MOVE ) + { + if( Globals.ScreenKbControlsLayout[currentButton][0] > (int)ev.getX() ) + Globals.ScreenKbControlsLayout[currentButton][0] = (int)ev.getX(); + if( Globals.ScreenKbControlsLayout[currentButton][1] > (int)ev.getY() ) + Globals.ScreenKbControlsLayout[currentButton][1] = (int)ev.getY(); + if( Globals.ScreenKbControlsLayout[currentButton][2] < (int)ev.getX() ) + Globals.ScreenKbControlsLayout[currentButton][2] = (int)ev.getX(); + if( Globals.ScreenKbControlsLayout[currentButton][3] < (int)ev.getY() ) + Globals.ScreenKbControlsLayout[currentButton][3] = (int)ev.getY(); + } + + Matrix m = new Matrix(); + RectF src = new RectF(0, 0, bmps[currentButton].getWidth(), bmps[currentButton].getHeight()); + RectF dst = new RectF(Globals.ScreenKbControlsLayout[currentButton][0], Globals.ScreenKbControlsLayout[currentButton][1], + Globals.ScreenKbControlsLayout[currentButton][2], Globals.ScreenKbControlsLayout[currentButton][3]); + m.setRectToRect(src, dst, Matrix.ScaleToFit.FILL); + imgs[currentButton].setImageMatrix(m); + + if( ev.getAction() == MotionEvent.ACTION_UP ) + setupButton(false); + } + + public void onKeyEvent(final int keyCode) + { + if( layout != null && imgs[currentButton] != null ) + layout.removeView(imgs[currentButton]); + imgs[currentButton] = null; + setupButton(true); + } + } + // =============================================================================================== static void Apply(Activity p) @@ -1487,11 +1620,16 @@ class Settings nativeSetScreenKbKeyUsed(i, Globals.ScreenKbControlsShown[i] ? 1 : 0); for( int i = 0; i < Globals.RemapScreenKbKeycode.length; i++ ) nativeSetKeymapKeyScreenKb(i, SDL_Keys.values[Globals.RemapScreenKbKeycode[i]]); + for( int i = 0; i < Globals.ScreenKbControlsLayout.length; i++ ) + if( Globals.ScreenKbControlsLayout[i][0] < Globals.ScreenKbControlsLayout[i][2] ) + nativeSetScreenKbKeyLayout( i, Globals.ScreenKbControlsLayout[i][0], Globals.ScreenKbControlsLayout[i][1], + Globals.ScreenKbControlsLayout[i][2], Globals.ScreenKbControlsLayout[i][3]); for( int i = 0; i < Globals.RemapMultitouchGestureKeycode.length; i++ ) nativeSetKeymapKeyMultitouchGesture(i, Globals.MultitouchGesturesUsed[i] ? SDL_Keys.values[Globals.RemapMultitouchGestureKeycode[i]] : 0); nativeSetMultitouchGestureSensitivity(Globals.MultitouchGestureSensitivity); if( Globals.TouchscreenCalibration[2] > Globals.TouchscreenCalibration[0] ) - nativeSetTouchscreenCalibration(Globals.TouchscreenCalibration[0], Globals.TouchscreenCalibration[1], Globals.TouchscreenCalibration[2], Globals.TouchscreenCalibration[3]); + nativeSetTouchscreenCalibration(Globals.TouchscreenCalibration[0], Globals.TouchscreenCalibration[1], + Globals.TouchscreenCalibration[2], Globals.TouchscreenCalibration[3]); String lang = new String(Locale.getDefault().getLanguage()); if( Locale.getDefault().getCountry().length() > 0 ) @@ -1552,6 +1690,7 @@ class Settings private static native int nativeGetKeymapKeyScreenKb(int keynum); private static native void nativeSetKeymapKeyScreenKb(int keynum, int key); private static native void nativeSetScreenKbKeyUsed(int keynum, int used); + private static native void nativeSetScreenKbKeyLayout(int keynum, int x1, int y1, int x2, int y2); private static native int nativeGetKeymapKeyMultitouchGesture(int keynum); private static native void nativeSetKeymapKeyMultitouchGesture(int keynum, int key); private static native void nativeSetMultitouchGestureSensitivity(int sensitivity); diff --git a/project/java/translations/values-de/strings.xml b/project/java/translations/values-de/strings.xml index 60c966f2d..7b4552086 100644 --- a/project/java/translations/values-de/strings.xml +++ b/project/java/translations/values-de/strings.xml @@ -104,5 +104,5 @@ Geben Sie direkt Geben Kommandozeilenparameter Kalibrieren Touchscreen -Touch allen vier Rändern des Bildschirms, wenn Sie fertig sind, drücken Sie Zurück +Touch allen vier Rändern des Bildschirms, drücken Sie Menü, wenn Sie fertig diff --git a/project/java/translations/values-fi/strings.xml b/project/java/translations/values-fi/strings.xml index 5443781e4..941e4656a 100644 --- a/project/java/translations/values-fi/strings.xml +++ b/project/java/translations/values-fi/strings.xml @@ -104,5 +104,5 @@ Määritä hakemisto Määritä komentoriviparametrit Kalibroi kosketusnäyttö -Touch kaikki neljä reunaa näytön, paina Takaisin, kun olet valmis +Touch kaikki neljä reunaa näytön, paina Valikko, kun olet valmis diff --git a/project/java/translations/values-fr/strings.xml b/project/java/translations/values-fr/strings.xml index 9e1930dac..a99a18edd 100644 --- a/project/java/translations/values-fr/strings.xml +++ b/project/java/translations/values-fr/strings.xml @@ -107,5 +107,5 @@ Spécifiez le répertoire Spécifier les paramètres de ligne de commande Calibrer écran tactile -Touchez les quatre bords de l\u0026#39;écran, appuyez sur Retour lorsque vous avez terminé +Touchez les quatre bords de l\u0026#39;écran, appuyez sur MENU lorsque vous avez terminé diff --git a/project/java/translations/values-ru/strings.xml b/project/java/translations/values-ru/strings.xml index d227a93a0..347409752 100644 --- a/project/java/translations/values-ru/strings.xml +++ b/project/java/translations/values-ru/strings.xml @@ -97,5 +97,5 @@ Укажите каталог Укажите параметры командной строки Калибровка сенсорного экрана -Дотроньтесь до всех четырех краев экрана, потом нажмите Назад +Дотроньтесь до всех четырех краев экрана, потом нажмите MENU diff --git a/project/java/translations/values-uk/strings.xml b/project/java/translations/values-uk/strings.xml index ad164d362..2e348ae00 100644 --- a/project/java/translations/values-uk/strings.xml +++ b/project/java/translations/values-uk/strings.xml @@ -97,5 +97,5 @@ Вкажіть каталог Вкажіть параметри командного рядка Калібрування сенсорного екрану -Доторкнiться до всіх чотирьох країв екрану, потiм натисніть Назад +Доторкнiться до всіх чотирьох країв екрану, потiм натисніть MENU diff --git a/project/java/translations/values/strings.xml b/project/java/translations/values/strings.xml index 9961e711f..b562223ec 100644 --- a/project/java/translations/values/strings.xml +++ b/project/java/translations/values/strings.xml @@ -116,7 +116,10 @@ Rotate left two-finger gesture Rotate right two-finger gesture + Customize on-screen keyboard layout + Slide screen to add button, press Menu to undo last button + Calibrate touchscreen - Touch all four edges of the screen, press Back when done + Touch all four edges of the screen, press Menu when done diff --git a/project/jni/application/src b/project/jni/application/src index 4de17cd97..104f796a6 120000 --- a/project/jni/application/src +++ b/project/jni/application/src @@ -1 +1 @@ -alienblaster \ No newline at end of file +ballfield \ No newline at end of file diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c index d046f125c..75439199c 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c @@ -1416,7 +1416,7 @@ void ANDROID_InitOSKeymap() } JNIEXPORT jint JNICALL -JAVA_EXPORT_NAME(Settings_nativeGetKeymapKey) ( JNIEnv* env, jobject thiz, jint code) +JAVA_EXPORT_NAME(Settings_nativeGetKeymapKey) (JNIEnv* env, jobject thiz, jint code) { if( code < 0 || code > KEYCODE_LAST ) return SDL_KEY(UNKNOWN); @@ -1424,7 +1424,7 @@ JAVA_EXPORT_NAME(Settings_nativeGetKeymapKey) ( JNIEnv* env, jobject thiz, jint } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) ( JNIEnv* env, jobject thiz, jint javakey, jint key) +JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) (JNIEnv* env, jobject thiz, jint javakey, jint key) { if( javakey < 0 || javakey > KEYCODE_LAST ) return; @@ -1432,7 +1432,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) ( JNIEnv* env, jobject thiz, jint } JNIEXPORT jint JNICALL -JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyScreenKb) ( JNIEnv* env, jobject thiz, jint keynum) +JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyScreenKb) (JNIEnv* env, jobject thiz, jint keynum) { if( keynum < 0 || keynum > SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 + 4 ) return SDL_KEY(UNKNOWN); @@ -1444,7 +1444,7 @@ JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyScreenKb) ( JNIEnv* env, jobject th } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyScreenKb) ( JNIEnv* env, jobject thiz, jint keynum, jint key) +JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyScreenKb) (JNIEnv* env, jobject thiz, jint keynum, jint key) { if( keynum < 0 || keynum > SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 + 4 ) return; @@ -1454,7 +1454,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyScreenKb) ( JNIEnv* env, jobject th } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) ( JNIEnv* env, jobject thiz, jint keynum, jint used) +JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) (JNIEnv* env, jobject thiz, jint keynum, jint used) { SDL_Rect rect = {0, 0, 0, 0}; int key = -1; @@ -1470,7 +1470,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) ( JNIEnv* env, jobject thiz } JNIEXPORT jint JNICALL -JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyMultitouchGesture) ( JNIEnv* env, jobject thiz, jint keynum) +JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyMultitouchGesture) (JNIEnv* env, jobject thiz, jint keynum) { if( keynum < 0 || keynum >= MAX_MULTITOUCH_GESTURES ) return SDL_KEY(UNKNOWN); @@ -1478,21 +1478,21 @@ JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyMultitouchGesture) ( JNIEnv* env, j } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyMultitouchGesture) ( JNIEnv* env, jobject thiz, jint keynum, jint keycode) +JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyMultitouchGesture) (JNIEnv* env, jobject thiz, jint keynum, jint keycode) { if( keynum < 0 || keynum >= MAX_MULTITOUCH_GESTURES ) - return SDL_KEY(UNKNOWN); + return; multitouchGestureKeycode[keynum] = keycode; } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetMultitouchGestureSensitivity) ( JNIEnv* env, jobject thiz, jint sensitivity) +JAVA_EXPORT_NAME(Settings_nativeSetMultitouchGestureSensitivity) (JNIEnv* env, jobject thiz, jint sensitivity) { multitouchGestureSensitivity = sensitivity; } JNIEXPORT void JNICALL -JAVA_EXPORT_NAME(Settings_nativeSetTouchscreenCalibration) (JNIEnv* env, jobject thiz, jint x1, jint y1, jint x2, jint y2) +JAVA_EXPORT_NAME(Settings_nativeSetTouchscreenCalibration) (JNIEnv* env, jobject thiz, jint x1, jint y1, jint x2, jint y2) { SDL_ANDROID_TouchscreenCalibrationX = x1; SDL_ANDROID_TouchscreenCalibrationY = y1; @@ -1500,6 +1500,25 @@ JAVA_EXPORT_NAME(Settings_nativeSetTouchscreenCalibration) (JNIEnv* env, jobjec SDL_ANDROID_TouchscreenCalibrationHeight = y2 - y1; } + +JNIEXPORT void JNICALL +JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyLayout) (JNIEnv* env, jobject thiz, jint keynum, jint x1, jint y1, jint x2, jint y2) +{ + SDL_Rect rect = {x1, y1, x2-x1, y2-y1}; + int key = -1; + __android_log_print(ANDROID_LOG_INFO, "libSDL", "nativeSetScreenKbKeyLayout: %d %d %d %d", (int)rect.x, (int)rect.y, (int)rect.w, (int)rect.h); + if( keynum == 0 ) + key = SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD; + if( keynum == 1 ) + key = SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT; + if( keynum - 2 >= 0 && keynum - 2 <= SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 ) + key = keynum - 2 + SDL_ANDROID_SCREENKEYBOARD_BUTTON_0; + + if( key >= 0 ) + SDL_ANDROID_SetScreenKeyboardButtonPos(key, &rect); +} + + JNIEXPORT void JNICALL JAVA_EXPORT_NAME(Settings_nativeInitKeymap) ( JNIEnv* env, jobject thiz ) { diff --git a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c index 6079f9405..564930ff1 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c @@ -860,12 +860,19 @@ int SDL_ANDROID_SetScreenKeyboardButtonPos(int buttonId, SDL_Rect * pos) } else { - buttons[buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0] = *pos; + int i = buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0; + buttons[i] = *pos; if(touchscreenKeyboardTheme == 0) { - int i = buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0; prepareFontCharWireframe(FONT_BTN1 + i, MIN(buttons[i].h, buttons[i].w), MIN(buttons[i].h, buttons[i].w)); } + if( i < AutoFireButtonsNum ) + { + buttonsAutoFireRect[i].w = buttons[i].w * 2; + buttonsAutoFireRect[i].h = buttons[i].h * 2; + buttonsAutoFireRect[i].x = buttons[i].x - buttons[i].w / 2; + buttonsAutoFireRect[i].y = buttons[i].y - buttons[i].h / 2; + } } return 1; }; diff --git a/project/res/drawable/b1.png b/project/res/drawable/b1.png new file mode 100644 index 000000000..6a6babc51 Binary files /dev/null and b/project/res/drawable/b1.png differ diff --git a/project/res/drawable/b2.png b/project/res/drawable/b2.png new file mode 100644 index 000000000..cb5f2e6cd Binary files /dev/null and b/project/res/drawable/b2.png differ diff --git a/project/res/drawable/b3.png b/project/res/drawable/b3.png new file mode 100644 index 000000000..cb1cacbdb Binary files /dev/null and b/project/res/drawable/b3.png differ diff --git a/project/res/drawable/b4.png b/project/res/drawable/b4.png new file mode 100644 index 000000000..cc202ae13 Binary files /dev/null and b/project/res/drawable/b4.png differ diff --git a/project/res/drawable/b5.png b/project/res/drawable/b5.png new file mode 100644 index 000000000..1c6802113 Binary files /dev/null and b/project/res/drawable/b5.png differ diff --git a/project/res/drawable/b6.png b/project/res/drawable/b6.png new file mode 100644 index 000000000..83902c210 Binary files /dev/null and b/project/res/drawable/b6.png differ diff --git a/project/res/drawable/dpad.png b/project/res/drawable/dpad.png new file mode 100644 index 000000000..38f369f55 Binary files /dev/null and b/project/res/drawable/dpad.png differ diff --git a/project/res/drawable/keyboard.png b/project/res/drawable/keyboard.png new file mode 100644 index 000000000..62d2358c3 Binary files /dev/null and b/project/res/drawable/keyboard.png differ