diff --git a/java/res/values/strings-uix.xml b/java/res/values/strings-uix.xml
index aa146b7b89..4f42809c8d 100644
--- a/java/res/values/strings-uix.xml
+++ b/java/res/values/strings-uix.xml
@@ -440,6 +440,11 @@
Hold
Move cursor
Switch language
+ Language swipe distance
+ Shorter distance makes the language swipe more sensitive
+
+
+ %sdp
Numbers
diff --git a/java/src/org/futo/inputmethod/keyboard/PointerTracker.java b/java/src/org/futo/inputmethod/keyboard/PointerTracker.java
index 3f4cb6e3ec..6947256841 100644
--- a/java/src/org/futo/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/org/futo/inputmethod/keyboard/PointerTracker.java
@@ -19,6 +19,7 @@
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.SystemClock;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
@@ -97,10 +98,6 @@ public static void setStateHint(StateHint stateHint) {
private static PointerTrackerParams sParams;
private static final int sPointerStep = (int)(16.0 * Resources.getSystem().getDisplayMetrics().density);
private static final int sPointerBigStep = (int)(32.0 * Resources.getSystem().getDisplayMetrics().density);
- private static final int sPointerHugeStep = Integer.min(
- (int)(128.0 * Resources.getSystem().getDisplayMetrics().density),
- Resources.getSystem().getDisplayMetrics().widthPixels * 3 / 2
- );
private static GestureStrokeRecognitionParams sGestureStrokeRecognitionParams;
private static GestureStrokeDrawingParams sGestureStrokeDrawingParams;
@@ -157,6 +154,9 @@ public static void setStateHint(StateHint stateHint) {
private boolean mStartedOnFastLongPress;
private boolean mCursorMoved = false;
private boolean mSpacebarLongPressed = false;
+ // A spacebar language swipe may only switch the language once per gesture, regardless of how
+ // far the finger travels. Changing two languages requires lifting and swiping again.
+ private boolean mLanguageSwiped = false;
// true if keyboard layout has been changed.
private boolean mKeyboardLayoutHasBeenChanged;
@@ -760,6 +760,7 @@ private void onDownEventInternal(final int x, final int y, final long eventTime)
mStartTime = System.currentTimeMillis();
mStartedOnFastLongPress = key.isFastLongPress();
mSpacebarLongPressed = false;
+ mLanguageSwiped = false;
mIsSlidingCursor = key.getCode() == Constants.CODE_DELETE || key.getCode() == Constants.CODE_SPACE;
mIsFlickingKey = !mIsSlidingCursor && key.getHasFlick();
@@ -976,7 +977,14 @@ private void onMoveEventInternal(final int x, final int y, final long eventTime)
if(allowedBySettings) {
int pointerStep = sPointerStep;
if (settingsValues.mSpacebarSwipeMode == Settings.SPACEBAR_MODE_LANGUAGE && !mSpacebarLongPressed) {
- pointerStep = sPointerHugeStep;
+ // The language-switch step distance is user-configurable in dp. The
+ // widthPixels*3/2 clamp is a safety bound for narrow screens.
+ final DisplayMetrics displayMetrics =
+ Resources.getSystem().getDisplayMetrics();
+ pointerStep = Integer.min(
+ (int)(settingsValues.mSpacebarLanguageSwipeStepDp * displayMetrics.density),
+ displayMetrics.widthPixels * 3 / 2
+ );
}
int steps = (x - mStartX) / pointerStep;
@@ -986,7 +994,12 @@ private void onMoveEventInternal(final int x, final int y, final long eventTime)
mStartX += steps * pointerStep;
if (settingsValues.mSpacebarSwipeMode == Settings.SPACEBAR_MODE_LANGUAGE && !mSpacebarLongPressed) {
- sListener.onSwipeLanguage(steps);
+ // Cap the switch at one language per gesture, in the swipe's direction,
+ // independent of swipe distance/sensitivity.
+ if (!mLanguageSwiped) {
+ mLanguageSwiped = true;
+ sListener.onSwipeLanguage(Integer.signum(steps));
+ }
} else {
sListener.onMovePointer(steps);
}
diff --git a/java/src/org/futo/inputmethod/latin/settings/Settings.java b/java/src/org/futo/inputmethod/latin/settings/Settings.java
index 055c166a6c..fa7620793c 100644
--- a/java/src/org/futo/inputmethod/latin/settings/Settings.java
+++ b/java/src/org/futo/inputmethod/latin/settings/Settings.java
@@ -137,6 +137,12 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
public static final int SPACEBAR_MODE_CURSOR = 1;
public static final int SPACEBAR_MODE_LANGUAGE = 2;
+ // Per-step horizontal swipe distance (in dp) required to advance one language when the
+ // spacebar swipe mode is LANGUAGE. Default keeps the original hardcoded 128dp behaviour.
+ public static final String PREF_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY =
+ "pref_spacebar_language_swipe_sensitivity";
+ public static final int DEFAULT_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY = 128;
+
public static final String PREF_BACKSPACE_MODE_HOLD = "pref_backspace_mode_hold";
public static final String PREF_BACKSPACE_MODE = "pref_backspace_mode";
public static final int BACKSPACE_MODE_CHARACTERS = 0; // Long-press backspace and swipe backspace removes just characters
diff --git a/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java b/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java
index 30803dc90a..0c26bf2fb6 100644
--- a/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java
+++ b/java/src/org/futo/inputmethod/latin/settings/SettingsValues.java
@@ -108,6 +108,7 @@ public class SettingsValues {
public final boolean mBackspaceUndoesAutocorrect;
public final int mSpacebarSwipeMode;
public final int mSpacebarHoldMode;
+ public final int mSpacebarLanguageSwipeStepDp;
public final int mBackspaceMode;
public final int mBackspaceModeHold;
public final int mNumberRowMode;
@@ -209,6 +210,8 @@ public SettingsValues(final Context context, final SharedPreferences prefs, fina
legacySpacebarMode == Settings.SPACEBAR_MODE_SWIPE_LANGUAGE_LEGACY ? Settings.SPACEBAR_MODE_LANGUAGE : Settings.SPACEBAR_MODE_CURSOR);
mSpacebarHoldMode = prefs.getInt(Settings.PREF_SPACEBAR_HOLD_MODE,
legacySpacebarMode == Settings.SPACEBAR_MODE_SWIPE_CURSOR_LEGACY ? Settings.SPACEBAR_MODE_LANGUAGE : Settings.SPACEBAR_MODE_CURSOR);
+ mSpacebarLanguageSwipeStepDp = prefs.getInt(Settings.PREF_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY,
+ Settings.DEFAULT_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY);
mBackspaceMode = prefs.getInt(Settings.PREF_BACKSPACE_MODE, Settings.BACKSPACE_MODE_CHARACTERS);
mBackspaceModeHold = prefs.getInt(Settings.PREF_BACKSPACE_MODE_HOLD, mBackspaceMode);
@@ -580,6 +583,8 @@ public String dump() {
sb.append("" + mBackspaceUndoesAutocorrect);
sb.append("\n mBackspaceMode = ");
sb.append("" + mBackspaceMode);
+ sb.append("\n mSpacebarLanguageSwipeStepDp = ");
+ sb.append("" + mSpacebarLanguageSwipeStepDp);
sb.append("\n mNumberRowMode = ");
sb.append("" + mNumberRowMode);
sb.append("\n mAltSpacesMode = ");
diff --git a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt
index 0218653c24..518e59be4a 100644
--- a/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt
+++ b/java/src/org/futo/inputmethod/latin/uix/settings/pages/Typing.kt
@@ -636,6 +636,24 @@ val LongPressMenu = UserSettingsMenu(
)
},
+ UserSetting(
+ name = R.string.morekey_settings_spacebar_language_swipe_distance,
+ subtitle = R.string.morekey_settings_spacebar_language_swipe_distance_subtitle,
+ ) {
+ val resources = LocalResources.current
+ SettingSliderSharedPrefsInt(
+ title = stringResource(R.string.morekey_settings_spacebar_language_swipe_distance),
+ subtitle = stringResource(R.string.morekey_settings_spacebar_language_swipe_distance_subtitle),
+ key = Settings.PREF_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY,
+ default = Settings.DEFAULT_SPACEBAR_LANGUAGE_SWIPE_SENSITIVITY,
+ range = 24.0f..160.0f,
+ hardRange = 24.0f..160.0f,
+ transform = { it.roundToInt() },
+ indicator = { resources.getString(R.string.abbreviation_unit_dp, "$it") },
+ steps = 16
+ )
+ },
+
// TODO: Might not work well for showing up in search
UserSetting(name = R.string.morekey_settings_layout) {
val context = LocalContext.current