From: Alexandros Frantzis alexandros.frantzis@collabora.com
--- dlls/winewayland.drv/wayland_keyboard.c | 35 ++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/dlls/winewayland.drv/wayland_keyboard.c b/dlls/winewayland.drv/wayland_keyboard.c index 8c6ba86d915..1631964ae53 100644 --- a/dlls/winewayland.drv/wayland_keyboard.c +++ b/dlls/winewayland.drv/wayland_keyboard.c @@ -358,7 +358,7 @@ static void add_xkb_layout(const char *xkb_layout, struct xkb_keymap *xkb_keymap
unsigned int mod, keyc, len, names_len, min_keycode, max_keycode; struct xkb_state *xkb_state = xkb_state_new(xkb_keymap); - xkb_mod_mask_t shift_mask, control_mask, altgr_mask, capslock_mask; + xkb_mod_mask_t shift_mask, control_mask, altgr_mask, capslock_mask, numlock_mask; VSC_LPWSTR *names_entry, *names_ext_entry; VSC_VK *vsc2vk_e0_entry, *vsc2vk_e1_entry; VK_TO_WCHARS8 *vk2wchars_entry; @@ -493,6 +493,7 @@ static void add_xkb_layout(const char *xkb_layout, struct xkb_keymap *xkb_keymap control_mask = 1 << xkb_keymap_mod_get_index(xkb_keymap, XKB_MOD_NAME_CTRL); capslock_mask = 1 << xkb_keymap_mod_get_index(xkb_keymap, XKB_MOD_NAME_CAPS); altgr_mask = 1 << xkb_keymap_mod_get_index(xkb_keymap, "Mod5"); + numlock_mask = 1 << xkb_keymap_mod_get_index(xkb_keymap, XKB_MOD_NAME_NUM);
for (keyc = min_keycode; keyc <= max_keycode; keyc++) { @@ -502,6 +503,38 @@ static void add_xkb_layout(const char *xkb_layout, struct xkb_keymap *xkb_keymap uint32_t caps_ret, shift_ret; unsigned int mod;
+ if (vkey & KBDNUMPAD) + { + VK_TO_WCHARS8 num_vkey2wch; + + switch (vkey & 0xff) + { + case VK_INSERT: num_vkey2wch.VirtualKey = VK_NUMPAD0; break; + case VK_END: num_vkey2wch.VirtualKey = VK_NUMPAD1; break; + case VK_DOWN: num_vkey2wch.VirtualKey = VK_NUMPAD2; break; + case VK_NEXT: num_vkey2wch.VirtualKey = VK_NUMPAD3; break; + case VK_LEFT: num_vkey2wch.VirtualKey = VK_NUMPAD4; break; + case VK_CLEAR: num_vkey2wch.VirtualKey = VK_NUMPAD5; break; + case VK_RIGHT: num_vkey2wch.VirtualKey = VK_NUMPAD6; break; + case VK_HOME: num_vkey2wch.VirtualKey = VK_NUMPAD7; break; + case VK_UP: num_vkey2wch.VirtualKey = VK_NUMPAD8; break; + case VK_PRIOR: num_vkey2wch.VirtualKey = VK_NUMPAD9; break; + case VK_DELETE: num_vkey2wch.VirtualKey = VK_DECIMAL; break; + default: num_vkey2wch.VirtualKey = 0; break; + } + + if (num_vkey2wch.VirtualKey) + { + xkb_state_update_mask(xkb_state, 0, 0, numlock_mask, 0, 0, xkb_group); + if (!(num_vkey2wch.wch[0] = xkb_state_key_get_utf32(xkb_state, keyc))) + num_vkey2wch.wch[0] = WCH_NONE; + for (mod = 1; mod < 8; ++mod) num_vkey2wch.wch[mod] = WCH_NONE; + num_vkey2wch.Attributes = 0; + TRACE("vkey %#06x -> %s\n", num_vkey2wch.VirtualKey, debugstr_wn(num_vkey2wch.wch, 8)); + *vk2wchars_entry++ = num_vkey2wch; + } + } + for (mod = 0; mod < 8; ++mod) { xkb_mod_mask_t mod_mask = 0;