xrdp
xrdp copied to clipboard
[client bug?] mstsc desn't send eisu key release
Just for the record at the moment,
Windows' mstsc client doesn't send "英数" eisu key release. The key is named Eisu_toggle
in Xorg.
"英数" key is a key on the left of A
key in Japanese keyboards. If it is pressed alone, it behaves as eisu key. If it is pressed with Shift key, it behaves as CapsLock key.
Modified xrdp code like this:
diff --git a/libxrdp/xrdp_fastpath.c b/libxrdp/xrdp_fastpath.c
index 682c6015..db3a350e 100644
--- a/libxrdp/xrdp_fastpath.c
+++ b/libxrdp/xrdp_fastpath.c
@@ -174,7 +174,7 @@ xrdp_fastpath_process_EVENT_SCANCODE(struct xrdp_fastpath *self,
return 1;
}
in_uint8(s, code); /* keyCode (1 byte) */
- LOG_DEVEL(LOG_LEVEL_TRACE, "Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT "
+ LOG(LOG_LEVEL_DEBUG, "Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT "
"eventHeader.eventFlags 0x%2.2x, eventHeader.eventCode (ignored), "
"keyCode %d", eventFlags, code);
When I hit the Eisu key tree times, I got the following log.
[20220226-18:52:18] [DEBUG] Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT eventHeader.eventFlags 0x00, eventHeader.eventCode (ignored), keyCode 58
[20220226-18:52:18] [DEBUG] Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT eventHeader.eventFlags 0x00, eventHeader.eventCode (ignored), keyCode 58
[20220226-18:52:18] [DEBUG] Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT eventHeader.eventFlags 0x00, eventHeader.eventCode (ignored), keyCode 58
Shift+Eisu(CapsLock) on the client, xrdp receives:
[20220226-19:09:38] [DEBUG] Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT eventHeader.eventFlags 0x00, eventHeader.eventCode (ignored), keyCode 42
[20220226-19:09:38] [DEBUG] Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT eventHeader.eventFlags 0x00, eventHeader.eventCode (ignored), keyCode 58
[20220226-19:09:38] [DEBUG] Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT eventHeader.eventFlags 0x01, eventHeader.eventCode (ignored), keyCode 58
[20220226-19:09:38] [DEBUG] Received [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT eventHeader.eventFlags 0x01, eventHeader.eventCode (ignored), keyCode 42
This event is transferred to xorgxrdp as-is. This causes the Eisu_toggle
key pressed forever.
On the Xorg side, keys cannot be pressed more than once. xev
shows only one KeyPress event of Eisu_toggle
.
KeyPress event, serial 37, synthetic NO, window 0x3200001,
root 0x510, subw 0x0, time 528523070, (389,-345), root:(1100,9),
state 0x0, keycode 66 (keysym 0xff30, Eisu_toggle), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
Unfortunately, Eisu key and CapsLock key have the same RDP keycode so they're indistinguishable by keycode. However, the client send only Press event only if it is pressed alone.