diff --git a/platform/linuxbsd/wayland/key_mapping_xkb.cpp b/platform/linuxbsd/wayland/key_mapping_xkb.cpp index 04d8496c083..99a98321adf 100644 --- a/platform/linuxbsd/wayland/key_mapping_xkb.cpp +++ b/platform/linuxbsd/wayland/key_mapping_xkb.cpp @@ -378,6 +378,7 @@ bool KeyMappingXKB::is_sym_numpad(xkb_keysym_t p_keysym) { case XKB_KEY_KP_Divide: case XKB_KEY_KP_Separator: case XKB_KEY_KP_Decimal: + case XKB_KEY_KP_Delete: case XKB_KEY_KP_0: case XKB_KEY_KP_1: case XKB_KEY_KP_2: diff --git a/platform/linuxbsd/wayland/wayland_thread.cpp b/platform/linuxbsd/wayland/wayland_thread.cpp index 6155d9e3675..d2a9fde3ee6 100644 --- a/platform/linuxbsd/wayland/wayland_thread.cpp +++ b/platform/linuxbsd/wayland/wayland_thread.cpp @@ -195,24 +195,27 @@ Vector WaylandThread::_wp_primary_selection_offer_read(struct wl_displa bool WaylandThread::_seat_state_configure_key_event(SeatState &p_ss, Ref p_event, xkb_keycode_t p_keycode, bool p_pressed) { xkb_keysym_t shifted_sym = xkb_state_key_get_one_sym(p_ss.xkb_state, p_keycode); + xkb_keysym_t plain_sym = XKB_KEY_NoSymbol; + // NOTE: xkbcommon's API really encourages to apply the modifier state but we + // only want a "plain" symbol so that we can convert it into a godot keycode. + const xkb_keysym_t *syms = nullptr; + int num_sys = xkb_keymap_key_get_syms_by_level(p_ss.xkb_keymap, p_keycode, p_ss.current_layout_index, 0, &syms); + if (num_sys > 0 && syms) { + plain_sym = syms[0]; + } + Key physical_keycode = KeyMappingXKB::get_scancode(p_keycode); KeyLocation key_location = KeyMappingXKB::get_location(p_keycode); uint32_t unicode = xkb_state_key_get_utf32(p_ss.xkb_state, p_keycode); Key keycode = Key::NONE; - if (KeyMappingXKB::is_sym_numpad(shifted_sym)) { + if (KeyMappingXKB::is_sym_numpad(shifted_sym) || KeyMappingXKB::is_sym_numpad(plain_sym)) { keycode = KeyMappingXKB::get_keycode(shifted_sym); } if (keycode == Key::NONE) { - // NOTE: xkbcommon's API really encourages to apply the modifier state but we - // only want a "plain" symbol so that we can convert it into a godot keycode. - const xkb_keysym_t *syms = nullptr; - int num_sys = xkb_keymap_key_get_syms_by_level(p_ss.xkb_keymap, p_keycode, p_ss.current_layout_index, 0, &syms); - if (num_sys > 0 && syms) { - keycode = KeyMappingXKB::get_keycode(syms[0]); - } + keycode = KeyMappingXKB::get_keycode(plain_sym); } if (keycode == Key::NONE) { diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index cbf963c59a0..e35b6e84e2e 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -3765,7 +3765,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, // keysym, so it works in all platforms the same. Key keycode = Key::NONE; - if (KeyMappingX11::is_sym_numpad(keysym_unicode)) { + if (KeyMappingX11::is_sym_numpad(keysym_unicode) || KeyMappingX11::is_sym_numpad(keysym_keycode)) { // Special case for numpad keys. keycode = KeyMappingX11::get_keycode(keysym_unicode); } diff --git a/platform/linuxbsd/x11/key_mapping_x11.cpp b/platform/linuxbsd/x11/key_mapping_x11.cpp index 8a138f4bb47..b9c50825886 100644 --- a/platform/linuxbsd/x11/key_mapping_x11.cpp +++ b/platform/linuxbsd/x11/key_mapping_x11.cpp @@ -1138,6 +1138,7 @@ bool KeyMappingX11::is_sym_numpad(KeySym p_keysym) { case XK_KP_Divide: case XK_KP_Separator: case XK_KP_Decimal: + case XK_KP_Delete: case XK_KP_0: case XK_KP_1: case XK_KP_2: