Fix fr+oss layout issues with KP period

Co-authored-by: Riteo Siuga <riteo@posteo.net>
This commit is contained in:
Adam Scott
2025-02-08 16:22:46 -05:00
parent 36d90c73a8
commit 1376828ef6
4 changed files with 14 additions and 9 deletions

View File

@ -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:

View File

@ -195,24 +195,27 @@ Vector<uint8_t> WaylandThread::_wp_primary_selection_offer_read(struct wl_displa
bool WaylandThread::_seat_state_configure_key_event(SeatState &p_ss, Ref<InputEventKey> 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) {

View File

@ -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);
}

View File

@ -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: