Xpra-org / xpra

Persistent remote applications for X11; screen sharing for X11, MacOS and MSWindows.
https://xpra.org/
GNU General Public License v2.0
1.95k stars 169 forks source link

AltGr is creating Ghost keystrokes #3675

Open mschnelte opened 1 year ago

mschnelte commented 1 year ago

Describe the bug Pressing AltGr on my german keyboard is producing Alt_L keypress + release events once the key is released.

To Reproduce Steps to reproduce the behavior:

  1. on server side xpra is started with /usr/bin/xpra --no-daemon start :100
  2. On client side I connect via ssh.
  3. Keyboard layout selected on client is "Auto"
  4. run xev
  5. press altGr
  6. release altGr

Expected result: KeyEvents for AltGr Actual result: After releasing the AltGr Button, KeyPress and KeyRelease events for ALT_L are coming in.

This is a very annoying behavior as it triggers activation of the menu bar in some programs and typing is disrupted. It seems this has been found already in issue: #2560 but not followed up?

I noticed on windows side if I run GTK_keyboard_test.exe i get down Control_L, down alt_R when pressing altGr. This seems to be standard behavior on windows. Not sure if this has anything to do with this bug.

Client output on start on windows with -d keyboard

2022-10-29 15:05:45,295 win32.Keyboard.get_layout_spec()=('de', ['de', 'us'], None, ['nodeadkeys', 'sundeadkeys', 'mac'], '')
2022-10-29 15:05:45,296 get_layout_spec()=('de', ['de', 'us'], None, ['nodeadkeys', 'sundeadkeys', 'mac'], None)
2022-10-29 15:05:46,279 Connected (version 2.0, client OpenSSH_8.9p1)
2022-10-29 15:05:46,341 loaded RSA private key from 'C:\\Users\\DEU213434/.ssh\\id_rsa'
2022-10-29 15:05:46,361 Authentication (publickey) successful!
2022-10-29 15:05:46,793 ssh server OS is 'linux-gnu'
2022-10-29 15:05:46,909 mask_to_names(<flags 0 of type Gdk.ModifierType>)=[]
2022-10-29 15:05:46,909  keyboard settings: layout=de
2022-10-29 15:05:46,909  desktop size is 4096x1440:
2022-10-29 15:05:46,909   Default (1083x381 mm - DPI: 96x96) workarea: 4096x1400
2022-10-29 15:05:46,909     VA2719-2K        2560x1440 at    0x0    (597x336 mm - DPI: 109x109) workarea: 2560x1400
2022-10-29 15:05:46,909     Lenovo Wide viewing angle & High density FlexView Display 1920x1080 1536x864  at 2560x370  (344x193 mm - DPI: 113x114) workarea: 1536x864  at 2560x370
2022-10-29 15:05:48,078 enabled remote logging
2022-10-29 15:05:48,078 Xpra X11 seamless server version 4.4
2022-10-29 15:05:48,084  running on unknown
2022-10-29 15:05:48,088 set_modifier_mappings({mappings})
2022-10-29 15:05:48,089 modifier_keys={'Shift_L': 'shift', 'Shift_R': 'shift', 'Caps_Lock': 'lock', 'Control_L': 'control', 'Control_R': 'control', 'Meta_L': 'mod1', 'Alt_L': 'mod1', 'Meta_R': 'mod1', 'Num_Lock': 'mod2', 'Super_L': 'mod3', 'Super_R': 'mod3', 'Hyper_L': 'mod4', 'Hyper_R': 'mod4', 'ISO_Level3_Shift': 'mod5'}
2022-10-29 15:05:48,089 modifier_names={'shift': 'Shift_R', 'lock': 'Caps_Lock', 'control': 'Control_R', 'mod1': 'Meta_R', 'mod2': 'Num_Lock', 'mod3': 'Super_L', 'mod4': 'Hyper_R', 'mod5': 'ISO_Level3_Shift'}
2022-10-29 15:05:48,090 modifier_keycodes={'Shift_L': [160], 'Control_L': [162]}
2022-10-29 15:05:48,091 set_modifier_mappings found 'Num_Lock' with modifier value: mod2
2022-10-29 15:05:48,092 set_modifier_mappings found 'AltGr'='ISO_Level3_Shift' with modifier value: mod5

Client output when pressing AltGr:

2022-10-29 15:15:00,295 AltGr_modifiers(['control'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:00,295 mask_to_names(<flags GDK_CONTROL_MASK of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod5', 'mod2']
2022-10-29 15:15:00,296 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1440 (void at 0x000001baea2ad370)>, True)=KeyEvent(modifiers=['mod5', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=True)
2022-10-29 15:15:00,297 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod5', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=True)) wid=2
2022-10-29 15:15:00,298 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Control_L', ['mod5', 'mod2'], True) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:00,298 process_key_event: Control_L pressed=True, with GetKeyState(VK_RMENU)=-127
2022-10-29 15:15:00,299 AltGr_modifiers(['control', 'mod2'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:00,300 mask_to_names(<flags GDK_CONTROL_MASK | GDK_MOD2_MASK of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod5', 'mod2']
2022-10-29 15:15:00,300 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1440 (void at 0x000001baea2ad160)>, True)=KeyEvent(modifiers=['mod5', 'mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=True)
2022-10-29 15:15:00,301 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod5', 'mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=True)) wid=2
2022-10-29 15:15:00,302 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Alt_R', ['mod5', 'mod2'], True) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:00,302 process_key_event: Alt_R pressed=True, with GetKeyState(VK_RMENU)=-127
2022-10-29 15:15:00,303 AltGr_modifiers(['mod5', 'mod2'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:00,303 send_delayed_key() delayed_event=None
2022-10-29 15:15:00,304 send_key_action(2, KeyEvent(modifiers=['mod5'], keyname=, keyval=-1, keycode=-1, group=-1, string=, pressed=True))

Client output on releasing altgr:

2022-10-29 15:15:07,732 mask_to_names(<flags GDK_MOD1_MASK of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod1', 'mod2']
2022-10-29 15:15:07,732 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1df0 (void at 0x000001baea2ad160)>, False)=KeyEvent(modifiers=['mod1', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=False)
2022-10-29 15:15:07,732 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod1', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=False)) wid=2
2022-10-29 15:15:07,745 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Control_L', ['mod1', 'mod2'], False) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:07,746 process_key_event: Control_L pressed=False, with GetKeyState(VK_RMENU)=1
2022-10-29 15:15:07,746 send_delayed_key() delayed_event=None
2022-10-29 15:15:07,747 send_key_action(2, KeyEvent(modifiers=['mod1', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=False))
2022-10-29 15:15:07,748 mask_to_names(<flags 0 of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod2']
2022-10-29 15:15:07,748 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1df0 (void at 0x000001baea2ad840)>, False)=KeyEvent(modifiers=['mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=False)
2022-10-29 15:15:07,749 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=False)) wid=2
2022-10-29 15:15:07,750 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Alt_R', ['mod2'], False) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:07,751 process_key_event: Alt_R pressed=False, with GetKeyState(VK_RMENU)=1
2022-10-29 15:15:07,751 AltGr_modifiers(['mod2'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:07,752 send_delayed_key() delayed_event=None
2022-10-29 15:15:07,752 send_key_action(2, KeyEvent(modifiers=['mod5'], keyname=, keyval=-1, keycode=-1, group=-1, string=, pressed=False))

Server output on AltGr press:

2022-10-29 15:15:00,292 client   1 @18.282 AltGr_modifiers(['control'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:00,292 client   1 @18.282 mask_to_names(<flags GDK_CONTROL_MASK of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod5', 'mod2']
2022-10-29 15:15:00,293 client   1 @18.282 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1440 (void at 0x000001baea2ad370)>, True)=KeyEvent(modifiers=['mod5', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=True)
2022-10-29 15:15:00,293 client   1 @18.282 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod5', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=True)) wid=2
2022-10-29 15:15:00,293 client   1 @18.282 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Control_L', ['mod5', 'mod2'], True) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:00,294 client   1 @18.282 process_key_event: Control_L pressed=True, with GetKeyState(VK_RMENU)=-127
2022-10-29 15:15:00,295 client   1 @18.282 AltGr_modifiers(['control', 'mod2'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:00,296 client   1 @18.282 mask_to_names(<flags GDK_CONTROL_MASK | GDK_MOD2_MASK of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod5', 'mod2']
2022-10-29 15:15:00,297 client   1 @18.282 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1440 (void at 0x000001baea2ad160)>, True)=KeyEvent(modifiers=['mod5', 'mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=True)
2022-10-29 15:15:00,297 client   1 @18.282 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod5', 'mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=True)) wid=2
2022-10-29 15:15:00,298 client   1 @18.282 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Alt_R', ['mod5', 'mod2'], True) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:00,298 client   1 @18.282 process_key_event: Alt_R pressed=True, with GetKeyState(VK_RMENU)=-127
2022-10-29 15:15:00,299 client   1 @18.282 AltGr_modifiers(['mod5', 'mod2'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:00,299 client   1 @18.282 send_delayed_key() delayed_event=None
2022-10-29 15:15:00,300 client   1 @18.282 send_key_action(2, KeyEvent(modifiers=['mod5'], keyname=, keyval=-1, keycode=-1, group=-1, string=, pressed=True))
2022-10-29 15:15:00,300 process_key_action(['key-action', 2, '', True, ('mod5',), -1, '', -1, -1]) server keycode=-1, group=-1
2022-10-29 15:15:00,301 filtered_modifiers_set(['mod2'])={'mod2'}
2022-10-29 15:15:00,301 filtered_modifiers_set(['mod5'])={'mod5'}
2022-10-29 15:15:00,301 make_keymask_match(['mod5']) current mask: {'mod2'}, wanted: {'mod5'}, ignoring=-1/[''], keys_pressed={64: 'Alt_L'}
2022-10-29 15:15:00,301 keynames(mod2)=['Num_Lock'], keycodes=[77], nuisance=True, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:00,301 change_mask(remove) ['mod5'] modifier 'mod2' using keycode 77
2022-10-29 15:15:00,302 change_mask({'mod2'}, False, remove) failed=[]
2022-10-29 15:15:00,302 keynames(mod5)=['ISO_Level3_Shift', 'Mode_switch'], keycodes=[92, 108, 203], nuisance=False, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:00,302 change_mask(add) ['mod5'] modifier 'mod5' using keycode 92
2022-10-29 15:15:00,302 change_mask({'mod5'}, True, add) failed=[]

Server output on releasing AltGr:

2022-10-29 15:15:07,739 client   1 @25.719 mask_to_names(<flags GDK_MOD1_MASK of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod1', 'mod2']
2022-10-29 15:15:07,740 client   1 @25.719 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1df0 (void at 0x000001baea2ad160)>, False)=KeyEvent(modifiers=['mod1', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=False)
2022-10-29 15:15:07,740 client   1 @25.719 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod1', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=False)) wid=2
2022-10-29 15:15:07,741 client   1 @25.734 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Control_L', ['mod1', 'mod2'], False) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:07,742 client   1 @25.734 process_key_event: Control_L pressed=False, with GetKeyState(VK_RMENU)=1
2022-10-29 15:15:07,742 client   1 @25.734 send_delayed_key() delayed_event=None
2022-10-29 15:15:07,743 client   1 @25.734 send_key_action(2, KeyEvent(modifiers=['mod1', 'mod2'], keyname=Control_L, keyval=65507, keycode=17, group=0, string=, pressed=False))
2022-10-29 15:15:07,744 client   1 @25.734 mask_to_names(<flags 0 of type Gdk.ModifierType>) GetKeyState(VK_NUMLOCK)=1, names=['mod2']
2022-10-29 15:15:07,744 client   1 @25.734 parse_key_event(<Gdk.EventKey object at 0x000001bb1ada1df0 (void at 0x000001baea2ad840)>, False)=KeyEvent(modifiers=['mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=False)
2022-10-29 15:15:07,745 client   1 @25.734 handle_key_action(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), KeyEvent(modifiers=['mod2'], keyname=Alt_R, keyval=65514, keycode=165, group=0, string=, pressed=False)) wid=2
2022-10-29 15:15:07,746 client   1 @25.734 key_handled_as_shortcut(GLClientWindow(2 : GLDrawingArea(2, (912, 500), GBRP)), 'Alt_R', ['mod2'], False) shortcuts_enabled=True, shortcuts=None
2022-10-29 15:15:07,747 client   1 @25.734 process_key_event: Alt_R pressed=False, with GetKeyState(VK_RMENU)=1
2022-10-29 15:15:07,747 client   1 @25.734 AltGr_modifiers(['mod2'], True) AltGr=mod5, add=['mod5'], clear=['mod1', 'mod2', 'control']
2022-10-29 15:15:07,748 client   1 @25.734 send_delayed_key() delayed_event=None
2022-10-29 15:15:07,748 client   1 @25.734 send_key_action(2, KeyEvent(modifiers=['mod5'], keyname=, keyval=-1, keycode=-1, group=-1, string=, pressed=False))
2022-10-29 15:15:07,749 will try levels: [0, 4, 1, 5, 2, 6, 3, 7]
2022-10-29 15:15:07,749 do_get_keycode(17, 'Control_L', False, ['mod1', 'mod2'], 65507, '', 0)=37 (level=0, shift=False, mode=0, keysyms=['Control_L'])
2022-10-29 15:15:07,749 not toggling any modifiers state for keysyms=['Control_L']
2022-10-29 15:15:07,749 process_key_action(['key-action', 2, 'Control_L', False, ('mod1', 'mod2'), 65507, '', 17, 0]) server keycode=37, group=0
2022-10-29 15:15:07,749 set_keyboard_layout_group(0) ignored, value unchanged
2022-10-29 15:15:07,750 filtered_modifiers_set(['mod5'])={'mod5'}
2022-10-29 15:15:07,750 filtered_modifiers_set(['mod1', 'mod2'])={'mod1', 'mod2'}
2022-10-29 15:15:07,750 make_keymask_match(['mod1', 'mod2']) current mask: {'mod5'}, wanted: {'mod1', 'mod2'}, ignoring=37/['Control_L'], keys_pressed={64: 'Alt_L'}
2022-10-29 15:15:07,750 keynames(mod5)=['ISO_Level3_Shift', 'Mode_switch'], keycodes=[92, 108, 203], nuisance=False, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:07,751 change_mask(remove) ['mod1', 'mod2'] modifier 'mod5' using keycode 92
2022-10-29 15:15:07,751 change_mask({'mod5'}, False, remove) failed=[]
2022-10-29 15:15:07,751 found the key pressed for mod1: Alt_L
2022-10-29 15:15:07,751 keynames(mod1)=['Alt_L', 'Alt_R', 'Meta_L', 'Meta_R'], keycodes=[64, 204, 248, 205], nuisance=False, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:07,751 change_mask(add) ['mod1', 'mod2'] modifier 'mod1' using keycode 64
2022-10-29 15:15:07,752 keynames(mod2)=['Num_Lock'], keycodes=[77], nuisance=True, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:07,752 change_mask(add) ['mod1', 'mod2'] modifier 'mod2' using keycode 77
2022-10-29 15:15:07,752 change_mask({'mod1', 'mod2'}, True, add) failed=[]
2022-10-29 15:15:07,752 handle_key((2, False, 'Control_L', 65507, 37, ['mod1', 'mod2'], True, True))
2022-10-29 15:15:07,752 handle keycode 37: key Control_L was already unpressed, ignoring
2022-10-29 15:15:07,753 process_key_action(['key-action', 2, '', False, ('mod5',), -1, '', -1, -1]) server keycode=-1, group=-1
2022-10-29 15:15:07,753 filtered_modifiers_set(['mod1', 'mod2'])={'mod1', 'mod2'}
2022-10-29 15:15:07,754 filtered_modifiers_set(['mod5'])={'mod5'}
2022-10-29 15:15:07,754 make_keymask_match(['mod5']) current mask: {'mod1', 'mod2'}, wanted: {'mod5'}, ignoring=-1/[''], keys_pressed={64: 'Alt_L'}
2022-10-29 15:15:07,754 found the key pressed for mod1: Alt_L
2022-10-29 15:15:07,754 keynames(mod1)=['Alt_L', 'Alt_R', 'Meta_L', 'Meta_R'], keycodes=[64, 204, 248, 205], nuisance=False, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:07,755 change_mask(remove) ['mod5'] modifier 'mod1' using keycode 64
2022-10-29 15:15:07,755 keynames(mod2)=['Num_Lock'], keycodes=[77], nuisance=True, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:07,755 change_mask(remove) ['mod5'] modifier 'mod2' using keycode 77
2022-10-29 15:15:07,756 change_mask({'mod1', 'mod2'}, False, remove) failed=[]
2022-10-29 15:15:07,756 keynames(mod5)=['ISO_Level3_Shift', 'Mode_switch'], keycodes=[92, 108, 203], nuisance=False, nuisance keys={'lock', 'mod2'}
2022-10-29 15:15:07,756 change_mask(add) ['mod5'] modifier 'mod5' using keycode 92
2022-10-29 15:15:07,756 change_mask({'mod5'}, True, add) failed=[]
totaam commented 1 year ago

That's a "feature" of key events on MS Windows, which you can see by running the "keyboard" tool from Xpra_cmd.exe toolbox.
It sends spurious Control_L events. I'm not sure what we can do better here.

mschnelte commented 1 year ago

Yes, I have seen that behavior on Control_L+Alt_R. But why does it translate to ALT_L? There are two things that I find curious here:

  1. It works with xserver connections. If i run cvxsrv on my windows machine and start a x11 app on linux the altgr key simply works. Having started xev in a x11 sessssion i only get ISO3_Level_Shift keypresses and releases. None of the ghost keys i see in xpra session.
  2. I browesed through related https://github.com/Xpra-org/xpra/issues/2946#issuecomment-765552558 and the referenced commit there https://github.com/Xpra-org/xpra/commit/a4c1ef5f14835a6e9924a7fdb99fab0cf1e8f34a . The comment says that control_l are filtered out. The thing is that if you look at the logs above, you see that the key press events are in fact filtered out. The alt_L key is send only on releasing altGr.
totaam commented 1 year ago

The alt_L key is send only on releasing altGr.

Then perhaps we need to filter them out also when releasing AltGr.

totaam commented 1 year ago

Can you please try 5.0-r32215 or later from https://xpra.org/beta/windows It includes the commit above, which should do what you want. I am seeing spurious Num_Lock events, those should be suppressed.

mschnelte commented 1 year ago

Tnx for the quick update! It does actually solve the problem that it does trigger alt keystrokes and therefore triggering unwanted menu focuses in for example vscode. However it seems to be too drastic when filtering:

Steps:

  1. Press AltGr
  2. Release AltGr

Expected Result: KeyPress ISO3_Level_Shift followed by KeyRelease ISO3_Level_Shift Actual result: Only the keyPress event

  1. Press AltGr
  2. Release AltGr
  3. Press AltGr

Expected Result: KeyPress ISO3_Level_Shift, KeyRelease ISO3_Level_Shift, KeyPress Event ISO3... Actual result: Only the first keyPress event, no release events, no subsequent keypress events

  1. Press AltGr
  2. Press 0 (should result in } on a german keyboard)
  3. Release 0
  4. release AltGr

xev Output:

KeyPress event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90145339, (121,146), root:(194,248),
    state 0x10, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90145339, (121,146), root:(194,248),
    state 0x10, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90145340, (121,146), root:(194,248),
    state 0x0, keycode 92 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90147751, (121,146), root:(194,248),
    state 0x80, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90147752, (121,146), root:(194,248),
    state 0x90, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90147754, (121,146), root:(194,248),
    state 0x90, keycode 19 (keysym 0x7d, braceright), same_screen YES,
    XLookupString gives 1 bytes: (7d) "}"
    XmbLookupString gives 1 bytes: (7d) "}"
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90147873, (121,146), root:(194,248),
    state 0x90, keycode 19 (keysym 0x7d, braceright), same_screen YES,
    XLookupString gives 1 bytes: (7d) "}"
    XFilterEvent returns: False

KeyPress event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90152717, (121,146), root:(194,248),
    state 0x90, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90152718, (121,146), root:(194,248),
    state 0x90, keycode 77 (keysym 0xff7f, Num_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1600001,
    root 0x50d, subw 0x0, time 90157607, (121,146), root:(194,248),
    state 0x80, keycode 92 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False
totaam commented 8 months ago

See also https://github.com/Xpra-org/xpra/issues/4066#issuecomment-1901059501 and #4024