Genymobile / scrcpy

Display and control your Android device
Apache License 2.0
109.2k stars 10.5k forks source link

[Alt Gr] doesn't work with -K parameter #4948

Open Manu99it opened 3 months ago

Manu99it commented 3 months ago

Environment

Describe the bug I installed this app https://github.com/calin-darie/extra-keyboard-layouts to have the UK extended layout I use. On Windows if you hold [Alt Gr] and type a letter you can use the acute accent: é, á, í, ó, ú, ý. It doesn't behave like a dead key because you need to hold it. However on android [Alt Gr] + [vowel] does nothing. It's an Android limitation? Or app limitation? I am posting the issue here because I use the keyboard through scrcpy, and I can't test it directly on android because it has a proprietary connector (surface keyboard). If by scrcpy all is done correctly I'll post an issue on the app git. When using UK extended with italian it's needed for example, especially the 'é'. Also [Alt Gr] + backtick (grave accent) on windows produces ¦ and similarly [Alt Gr] + 4 produces the eur symbol €. On Android nothing happens, at least through scrcpy

rom1v commented 3 months ago

On Windows if you hold [Alt Gr] and type a letter you can use the acute accent: é, á, í, ó, ú, ý

It is probably a Windows-specific behavior. Not all OS behave the same way (it is not a "limitation", it's just different dehaviors).

and similarly [Alt Gr] + 4 produces the eur symbol €

AltGr+e produces € (at least with a French layout).

Manu99it commented 3 months ago

@rom1v so I managed to try with a true physical keyboard and AltGr does in fact works correctly and behaves the same as Windows with the UK extended layout or any other layout. I think that when there is uhid setting enabled, scrcpy doesn't pass the AltGr key. Alt is the key you use for shortcuts, maybe it goes in conflict

rom1v commented 3 months ago

What keyboard layout do you use on Android for UHID?

(press MOD+k while mirroring with UHID is enabled: https://github.com/Genymobile/scrcpy/blob/master/doc/keyboard.md#physical-keyboard-simulation)

Manu99it commented 3 months ago

What keyboard layout do you use on Android for UHID?

(press MOD+k while mirroring with UHID is enabled: https://github.com/Genymobile/scrcpy/blob/master/doc/keyboard.md#physical-keyboard-simulation)

As I said, I installed the app I mentioned that adds UK extended layout. But AltGr for me didn't work with ANY layout, even the default ones (I tried Italian (my language), France, etc. AltGr doesn't work)

rom1v commented 3 months ago

Indeed, if you press a modifier key, it only set the modifier in the HID protocol (so it is taken into account for all my key combinations), but the scancode of the modifier key itself is never sent. Run with scrcpy -K -Vverbose --no-audio:

VERBOSE: hid keyboard: key down scancode=e6 (230) mod=40
VERBOSE: input: UHID input [1] 40 00 00 00 00 00 00 00 
VERBOSE: hid keyboard: key up   scancode=e6 (230) mod=00
VERBOSE: input: UHID input [1] 00 00 00 00 00 00 00 00 

That may be important for your use case.

Please test with this quick&dirty workaround:

diff --git a/app/src/hid/hid_keyboard.h b/app/src/hid/hid_keyboard.h
index ddd2cc91c..b5ffff04d 100644
--- a/app/src/hid/hid_keyboard.h
+++ b/app/src/hid/hid_keyboard.h
@@ -12,7 +12,7 @@
 // Maybe SDL_Keycode is used by most people, but SDL_Scancode is taken from USB
 // HID protocol.
 // 0x65 is Application, typically AT-101 Keyboard ends here.
-#define SC_HID_KEYBOARD_KEYS 0x66
+#define SC_HID_KEYBOARD_KEYS 0xFF

 extern const uint8_t SC_HID_KEYBOARD_REPORT_DESC[];
 extern const size_t SC_HID_KEYBOARD_REPORT_DESC_LEN;

With it, the scancode is sent:

VERBOSE: hid keyboard: key down scancode=e6 (230) mod=40
VERBOSE: input: UHID input [1] 40 00 E6 00 00 00 00 00 
VERBOSE: keys[e6] = false
VERBOSE: hid keyboard: key up   scancode=e6 (230) mod=00
VERBOSE: input: UHID input [1] 00 00 00 00 00 00 00 00 
VERBOSE: keys[e2] = false
Manu99it commented 3 months ago

Thank you for the prebuilt binary, I was going to rebuild everything 😅. However, nothing changed: old image

New: Screenshot 2024-05-27 175146

Manu99it commented 3 months ago

Now that I see it in the debugger, even with the old server scrcpy IS passing the AltGr key, right? Maybe it passes Alt_R instead of AltGr though

rom1v commented 3 months ago

Sorry, I posted a server binary whereas the change was in the client 🤦 (doing several things at once…)

Now I'm on the phone so I will post a binary later.

rom1v commented 3 months ago

Here is a binary:

Manu99it commented 3 months ago

This is the output. The AltGr key still seems to be not functioning image

rom1v commented 3 months ago

OK, so this scancode is not the source of the difference with the behavior you get with a keyboard.

Could you test with AOA instead of UHID? https://github.com/Genymobile/scrcpy/blob/master/doc/keyboard.md#aoa

Manu99it commented 3 months ago

It doesn't work either. Here is the console debug image

Manu99it commented 3 months ago

I found a solution: holding AltGr, then pressing and releasing LCtrl does input the acute accent! I noted that scrcpy sends 2 keyboard events instead of one when pressing altgr, pressing LCtrl "deletes" that one and then AltGr works correctly

Manu99it commented 3 months ago

@rom1v I've scrolled back a few issues and noted #4725 so probably my issue is a duplicate of that one. And in AOA mode the behaviour is the same. If the sdl library won't patch this you could add a workaround for windows or hint windows users to pressing and releasing LCtrl while holding altgr for the correct behaviour on android

rom1v commented 3 months ago

Oh yes, I should have thought of this AltGr problem with SDL on Windows (refs https://github.com/libsdl-org/SDL/issues/9201).

If the sdl library won't patch this

IIUC, it is intended to be fixed in SDL 3: https://github.com/libsdl-org/SDL/issues/5685

neclepsio commented 3 months ago

I found a solution: holding AltGr, then pressing and releasing LCtrl does input the acute accent! I noted that scrcpy sends 2 keyboard events instead of one when pressing altgr, pressing LCtrl "deletes" that one and then AltGr works correctly

Thank you! Maybe this workaround should be documented until SDL update?