diff --git a/build.zig.zon b/build.zig.zon index 6f22225f..e4ed7e5e 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -30,8 +30,8 @@ .hash = "fuzzig-0.1.1-Ji0xivxIAQBD0g8O_NV_0foqoPf3elsg9Sc3pNfdVH4D", }, .vaxis = .{ - .url = "git+https://github.com/neurocyte/libvaxis?ref=main#4c4b9a78693767b945016a2dd28d86cf2a8eb8c4", - .hash = "vaxis-0.5.1-BWNV_I9KCQDMo0g6nTnS_TS8OJEpdbBfXTXESSVjCMcT", + .url = "git+https://github.com/neurocyte/libvaxis?ref=main#1f6c7222f59607bff0ee8d7c6a0637a05bceffcd", + .hash = "vaxis-0.5.1-BWNV_CNLCQDmr-D_UzqGRAngktQt7hiGTRf1gyozwxcG", }, .zeit = .{ .url = "git+https://github.com/rockorager/zeit?ref=zig-0.15#ed2ca60db118414bda2b12df2039e33bad3b0b88", diff --git a/src/win32/gui.zig b/src/win32/gui.zig index 6e2f148a..e770d7f4 100644 --- a/src/win32/gui.zig +++ b/src/win32/gui.zig @@ -748,7 +748,54 @@ fn sendKey( win32.GetLastError(), ); - const mods: vaxis.Key.Modifiers = .{ + const win_key_flags: WinKeyFlags = @bitCast(@as(u32, @intCast(0xffffffff & lparam))); + const winkey: WinKey = .{ + .vk = @intCast(0xffff & wparam), + .extended = win_key_flags.extended, + }; + + const is_altgr: bool = blk: { + if (winkey.vk == @intFromEnum(win32.VK_CONTROL)) { + var next: win32.MSG = undefined; + if (win32.PeekMessageW(&next, null, win32.WM_KEYFIRST, win32.WM_KEYLAST, win32.PM_NOREMOVE) != 0) { + const next_win_key_flags: WinKeyFlags = @bitCast(@as(u32, @intCast(0xffffffff & next.lParam))); + const next_winkey: WinKey = .{ + .vk = @intCast(0xffff & next.wParam), + .extended = next_win_key_flags.extended, + }; + if (next_winkey.vk == @intFromEnum(win32.VK_MENU) and next_win_key_flags.extended) { + _ = win32.PeekMessageW(&next, null, win32.WM_KEYFIRST, win32.WM_KEYLAST, win32.PM_REMOVE); + break :blk true; + } + } + } + const right_alt = keyboard_state[@intFromEnum(win32.VK_RMENU)] & 0x80 != 0; + const left_ctrl = keyboard_state[@intFromEnum(win32.VK_LCONTROL)] & 0x80 != 0; + const right_ctrl = keyboard_state[@intFromEnum(win32.VK_RCONTROL)] & 0x80 != 0; + break :blk right_alt and left_ctrl and !right_ctrl; + }; + + if (is_altgr) { + if (winkey.vk == @intFromEnum(win32.VK_CONTROL) or + winkey.vk == @intFromEnum(win32.VK_LCONTROL) or + winkey.vk == @intFromEnum(win32.VK_MENU) or + winkey.vk == @intFromEnum(win32.VK_RMENU)) + { + std.log.debug("dropped AltGr key event: {!t} {t}", .{ std.meta.intToEnum(win32.VIRTUAL_KEY, winkey.vk), kind }); + return; + } + } + + const mods: vaxis.Key.Modifiers = if (is_altgr) .{ + .shift = (0 != (keyboard_state[@intFromEnum(win32.VK_SHIFT)] & 0x80)), + .alt = (0 != (keyboard_state[@intFromEnum(win32.VK_LMENU)] & 0x80)), + .ctrl = (0 != (keyboard_state[@intFromEnum(win32.VK_RCONTROL)] & 0x80)), + .super = false, + .hyper = false, + .meta = false, + .caps_lock = (0 != (keyboard_state[@intFromEnum(win32.VK_CAPITAL)] & 1)), + .num_lock = false, + } else .{ .shift = (0 != (keyboard_state[@intFromEnum(win32.VK_SHIFT)] & 0x80)), .alt = (0 != (keyboard_state[@intFromEnum(win32.VK_MENU)] & 0x80)), .ctrl = (0 != (keyboard_state[@intFromEnum(win32.VK_CONTROL)] & 0x80)), @@ -769,11 +816,6 @@ fn sendKey( .release => input.event.release, }; - const win_key_flags: WinKeyFlags = @bitCast(@as(u32, @intCast(0xffffffff & lparam))); - const winkey: WinKey = .{ - .vk = @intCast(0xffff & wparam), - .extended = win_key_flags.extended, - }; if (winkey.skipToUnicode()) |codepoint| { state.pid.send(.{ "RDR", @@ -790,8 +832,6 @@ fn sendKey( const max_char_count = 20; var char_buf: [max_char_count + 1]u16 = undefined; - // release control key when getting the unicode character of this key - keyboard_state[@intFromEnum(win32.VK_CONTROL)] = 0; const unicode_result = win32.ToUnicode( winkey.vk, win_key_flags.scan_code, @@ -814,7 +854,7 @@ fn sendKey( } if (unicode_result == 0) { - std.log.warn("unknown virtual key {f} (0x{x})", .{ winkey, winkey.vk }); + std.log.debug("unknown virtual key {f} (0x{x})", .{ winkey, winkey.vk }); return; } for (char_buf[0..@intCast(unicode_result)]) |codepoint| {