From: Alexandros Frantzis <alexandros.frantzis(a)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;
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/5561