only use alt-code-while-typing when not clearly inside key

and add alt code to emoji and clipboard keys
fixes #630
This commit is contained in:
Helium314 2024-06-14 17:08:49 +02:00
parent 181ea3b586
commit 61cff40d3c
2 changed files with 15 additions and 2 deletions

View file

@ -524,6 +524,13 @@ public class Key implements Comparable<Key> {
return (mActionFlags & ACTION_FLAGS_NO_KEY_PREVIEW) != 0; return (mActionFlags & ACTION_FLAGS_NO_KEY_PREVIEW) != 0;
} }
/**
* altCodeWhileTyping is a weird thing.
* When user pressed a typing key less than ignoreAltCodeKeyTimeout (config_ignore_alt_code_key_timeout / 350 ms) ago,
* this code will be used instead. There is no documentation, but it appears the purpose is to avoid unintentional layout switches.
* Assuming this is true, the key still is used now if pressed near the center, where we assume it's less likely to be accidental.
* See PointerTracker.isClearlyInsideKey
*/
public final boolean altCodeWhileTyping() { public final boolean altCodeWhileTyping() {
return (mActionFlags & ACTION_FLAGS_ALT_CODE_WHILE_TYPING) != 0; return (mActionFlags & ACTION_FLAGS_ALT_CODE_WHILE_TYPING) != 0;
} }
@ -1165,7 +1172,7 @@ public class Key implements Comparable<Key> {
mActionFlags = actionFlags; mActionFlags = actionFlags;
final int altCodeInAttr; // settings and language switch keys have alt code space, all others nothing final int altCodeInAttr; // settings and language switch keys have alt code space, all others nothing
if (mCode == KeyCode.SETTINGS || mCode == KeyCode.LANGUAGE_SWITCH) if (mCode == KeyCode.SETTINGS || mCode == KeyCode.LANGUAGE_SWITCH || mCode == KeyCode.EMOJI || mCode == KeyCode.CLIPBOARD)
altCodeInAttr = Constants.CODE_SPACE; altCodeInAttr = Constants.CODE_SPACE;
else else
altCodeInAttr = KeyCode.NOT_SPECIFIED; altCodeInAttr = KeyCode.NOT_SPECIFIED;

View file

@ -270,7 +270,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
private void callListenerOnCodeInput(final Key key, final int primaryCode, final int x, private void callListenerOnCodeInput(final Key key, final int primaryCode, final int x,
final int y, final long eventTime, final boolean isKeyRepeat) { final int y, final long eventTime, final boolean isKeyRepeat) {
final boolean ignoreModifierKey = mIsInDraggingFinger && key.isModifier(); final boolean ignoreModifierKey = mIsInDraggingFinger && key.isModifier();
final boolean altersCode = key.altCodeWhileTyping() && sTimerProxy.isTypingState(); final boolean altersCode = key.altCodeWhileTyping() && sTimerProxy.isTypingState() && !isClearlyInsideKey(key, x, y);
final int code = altersCode ? key.getAltCode() : primaryCode; final int code = altersCode ? key.getAltCode() : primaryCode;
if (DEBUG_LISTENER) { if (DEBUG_LISTENER) {
final String output = code == KeyCode.MULTIPLE_CODE_POINTS final String output = code == KeyCode.MULTIPLE_CODE_POINTS
@ -1186,6 +1186,12 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
return longpressTimeout; return longpressTimeout;
} }
private boolean isClearlyInsideKey(final Key key, final int x, final int y) {
// less than 15% of width from edge
return x > key.getX() + key.getWidth() * 0.15 && x < key.getX() + key.getWidth() * 0.85
&& y > key.getY() + key.getHeight() * 0.15 && y < key.getY() + key.getHeight() * 0.85;
}
private void detectAndSendKey(final Key key, final int x, final int y, final long eventTime) { private void detectAndSendKey(final Key key, final int x, final int y, final long eventTime) {
if (key == null) { if (key == null) {
callListenerOnCancelInput(); callListenerOnCancelInput();