xrdp icon indicating copy to clipboard operation
xrdp copied to clipboard

[client bug?] mstsc desn't send eisu key release

Open metalefty opened this issue 2 years ago • 0 comments

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.

IMG_5398

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.

metalefty avatar Feb 26 '22 10:02 metalefty