termux / termux-x11

Termux X11 add-on application.
https://termux.dev
GNU General Public License v3.0
1.96k stars 301 forks source link

Keyboard mapping issues #335

Closed zanfix closed 1 year ago

zanfix commented 1 year ago

Hi,

I am having some issues with keyboard mapping (Swiss German keyboard layout, qwertz)

With termux-x11 option "prefer scancodes" turned off:

EDIT: - CTRL + z outputs CTRL + y, and CTRL + y outputs CTRL + z

With termux-x11 option "prefer scancodes" turned on:

For the AltGr + < one, here is the xev output:

KeyPress event, serial 28, synthetic NO, window 0x5000001,
    root 0x38b, subw 0x0, time 8456773, (-602,-77), root:(269,403),
    state 0x10, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
    XKeysymToKeycode returns keycode: 92
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 28, synthetic NO, window 0x5000001,
    root 0x38b, subw 0x0, time 8456911, (-602,-77), root:(269,403),
    state 0x90, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 28, synthetic NO, window 0x5000001,
    root 0x38b, subw 0x0, time 8456912, (-602,-77), root:(269,403),
    state 0x91, keycode 21 (keysym 0xfe5c, dead_ogonek), same_screen YES,
    XLookupString gives 2 bytes: (cb 9b) "˛"
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: True

KeyRelease event, serial 28, synthetic NO, window 0x5000001,
    root 0x38b, subw 0x0, time 8457047, (-602,-77), root:(269,403),
    state 0x91, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x5000001,
    root 0x38b, subw 0x0, time 8457051, (-602,-77), root:(269,403),
    state 0x90, keycode 21 (keysym 0xfe53, dead_tilde), same_screen YES,
    XLookupString gives 1 bytes: (7e) "~"
    XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x5000001,
    root 0x38b, subw 0x0, time 8457244, (-602,-77), root:(269,403),
    state 0x90, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
    XKeysymToKeycode returns keycode: 92
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Crash dump for ^ key:

05-30 20:53:09.657 26827 26827 E InputEventSender: Exception dispatching finished signal.
05-30 20:53:09.657 26827 26827 E MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI: java.lang.IllegalArgumentException
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at java.lang.Character.toChars(Character.java:5179)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at java.lang.StringFactory.newStringFromCodePoints(StringFactory.java:288)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at com.termux.x11.input.InputEventSender.sendKeyEvent(InputEventSender.java:183)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at com.termux.x11.input.TouchInputHandler.sendKeyEvent(TouchInputHandler.java:508)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at com.termux.x11.MainActivity.lambda$onCreate$2$com-termux-x11-MainActivity(MainActivity.java:144)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at com.termux.x11.MainActivity$$ExternalSyntheticLambda7.onKey(Unknown Source:4)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.View.dispatchKeyEvent(View.java:14204)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:758)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1942)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.app.Activity.dispatchKeyEvent(Activity.java:3998)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:126)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:144)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3413)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:624)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6492)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6356)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5796)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5849)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5815)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5971)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5823)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6028)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5796)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5849)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5815)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5823)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5796)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5849)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5815)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6004)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:6173)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3826)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:3308)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:3299)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3803)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:143)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.os.MessageQueue.nativePollOnce(Native Method)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.os.MessageQueue.next(MessageQueue.java:336)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.os.Looper.loop(Looper.java:197)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at android.app.ActivityThread.main(ActivityThread.java:8167)
05-30 20:53:09.658 26827 26827 E MessageQueue-JNI:  at java.lang.reflect
05-30 20:53:09.658 26827 26827 D AndroidRuntime: Shutting down VM
--------- beginning of crash
05-30 20:53:09.659 26827 26827 E AndroidRuntime: FATAL EXCEPTION: main
05-30 20:53:09.659 26827 26827 E AndroidRuntime: Process: com.termux.x11, PID: 26827
05-30 20:53:09.659 26827 26827 E AndroidRuntime: java.lang.IllegalArgumentException
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at java.lang.Character.toChars(Character.java:5179)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at java.lang.StringFactory.newStringFromCodePoints(StringFactory.java:288)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.termux.x11.input.InputEventSender.sendKeyEvent(InputEventSender.java:183)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.termux.x11.input.TouchInputHandler.sendKeyEvent(TouchInputHandler.java:508)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.termux.x11.MainActivity.lambda$onCreate$2$com-termux-x11-MainActivity(MainActivity.java:144)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.termux.x11.MainActivity$$ExternalSyntheticLambda7.onKey(Unknown Source:4)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.View.dispatchKeyEvent(View.java:14204)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1949)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:758)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1942)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.app.Activity.dispatchKeyEvent(Activity.java:3998)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:126)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:144)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3413)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:624)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6492)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6356)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5796)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5849)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5815)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5971)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5823)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6028)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5796)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5849)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5815)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5823)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5796)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5849)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5815)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6004)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:6173)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3826)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:3308)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:3299)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3803)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:143)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.os.MessageQueue.nativePollOnce(Native Method)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.os.MessageQueue.next(MessageQueue.java:336)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:197)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:8167)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
05-30 20:53:09.659 26827 26827 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
05-30 20:53:09.674 26827 26827 I Process : Sending signal. PID: 26827 SIG: 9
twaik commented 1 year ago

@zanfix can you please check if it works?

zanfix commented 1 year ago

I tried build 384 but nothing changed!

zanfix commented 1 year ago

I had a look at logcat and:

With termux-x11 option "prefer scancodes" turned off:

With termux-x11 option "prefer scancodes" turned on:

also TERMUX_X11_DEBUG=1 will segfault the loader immediately

EDIT: i also noticed that del key does not work, The following message is printed on logcat: "The input has been finished in ImeInputStage" when pressed. Does not happen with build 371

twaik commented 1 year ago

Unfortunately Android does not let applications detect AltGr. Maybe I can make an option to generate TextEvents with right Alt key, but in this case key combinations with right Alt will stop working.

zanfix commented 1 year ago

On my keyboard all other combinations with AltGr already work fine. it's only the key I mentioned that do not work:

AltGr + < outputs ˛ instead of backslash < key is between Shift_L and Y

twaik commented 1 year ago

I am not sure I can fix this. With my keyboard AltGr + < produces × sign with both setxkbmap de and setxkbmap ch -variant de.

twaik commented 1 year ago

It looks like KeyEvents sent by Android are IME-dependent or device-dependent. For some reason Android sends combined KeyEvents even in the case if it is not needed (at least for de_CH layout). There is no workaround for this.