diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index e8036b6ce776..f8ac78336589 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -559,6 +559,8 @@ boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app) rdpWindow* window; rdpRail* rail = ((rdpContext*) xfi->context)->rail; + xf_kbd_release_all_keypress(xfi); + if (app != true) return true; diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index a1c6151569cc..e6fca7a0741b 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -50,6 +50,22 @@ void xf_kbd_unset_keypress(xfInfo* xfi, uint8 keycode) return; } +void xf_kbd_release_all_keypress(xfInfo* xfi) +{ + int keycode; + RDP_SCANCODE rdp_scancode; + + for (keycode = 0; keycode < sizeof(xfi->pressed_keys) / sizeof(xfi->pressed_keys[0]); keycode++) + { + if (xfi->pressed_keys[keycode] != NoSymbol) + { + rdp_scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(keycode); + freerdp_input_send_keyboard_event_2(xfi->instance->input, false, rdp_scancode); + xfi->pressed_keys[keycode] = NoSymbol; + } + } +} + boolean xf_kbd_key_pressed(xfInfo* xfi, KeySym keysym) { KeyCode keycode = XKeysymToKeycode(xfi->display, keysym); diff --git a/client/X11/xf_keyboard.h b/client/X11/xf_keyboard.h index e61ff842a1b5..116d931bfce4 100644 --- a/client/X11/xf_keyboard.h +++ b/client/X11/xf_keyboard.h @@ -27,6 +27,7 @@ void xf_kbd_init(xfInfo* xfi); void xf_kbd_set_keypress(xfInfo* xfi, uint8 keycode, KeySym keysym); void xf_kbd_unset_keypress(xfInfo* xfi, uint8 keycode); +void xf_kbd_release_all_keypress(xfInfo* xfi); boolean xf_kbd_key_pressed(xfInfo* xfi, KeySym keysym); void xf_kbd_send_key(xfInfo* xfi, boolean down, uint8 keycode); int xf_kbd_read_keyboard_state(xfInfo* xfi);