From b73975328bcd4165ccbc335f6c71c21cac783196 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 7 Jan 2025 16:04:07 +0100 Subject: [PATCH] fix: normalized vaxis windows console input --- src/keybind/keybind.zig | 12 +++--------- src/renderer/vaxis/renderer.zig | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/keybind/keybind.zig b/src/keybind/keybind.zig index aa6b65f..b820d66 100644 --- a/src/keybind/keybind.zig +++ b/src/keybind/keybind.zig @@ -584,12 +584,6 @@ const BindingSet = struct { }; const text = key_event.text; - //normalize to lowercase if modifier is set - const key = if (mods > 0 and key_event.key >= 'A' and key_event.key <= 'Z') - key_event.key - 'A' + 'a' - else - key_event.key; - if (event == input.event.release) return self.process_key_release_event(key_event); @@ -600,14 +594,14 @@ const BindingSet = struct { } globals.last_key_event_timestamp_ms = timestamp; - if (globals.current_sequence.items.len > 0 and input.is_modifier(key)) + if (globals.current_sequence.items.len > 0 and input.is_modifier(key_event.key)) return null; try globals.current_sequence.append(globals_allocator, key_event); - if ((mods & ~(input.mod.shift | input.mod.caps_lock) == 0) and !input.is_non_input_key(key)) { + if ((mods & ~(input.mod.shift | input.mod.caps_lock) == 0) and !input.is_non_input_key(key_event.key)) { var buf: [6]u8 = undefined; const bytes = if (text.len > 0) text else text: { - const bytes = try input.ucs32_to_utf8(&[_]u32{key}, &buf); + const bytes = try input.ucs32_to_utf8(&[_]u32{key_event.key}, &buf); break :text buf[0..bytes]; }; try globals.current_sequence_egc.appendSlice(globals_allocator, bytes); diff --git a/src/renderer/vaxis/renderer.zig b/src/renderer/vaxis/renderer.zig index 7af7735..7221c96 100644 --- a/src/renderer/vaxis/renderer.zig +++ b/src/renderer/vaxis/renderer.zig @@ -151,12 +151,12 @@ pub fn process_renderer_event(self: *Self, msg: []const u8) !void { const event = std.mem.bytesAsValue(vaxis.Event, input_); switch (event.*) { .key_press => |key__| { - const key_ = filter_mods(key__); + const key_ = filter_mods(normalize_shifted_alphas(key__)); try self.sync_mod_state(key_.codepoint, key_.mods); const cbor_msg = try self.fmtmsg(.{ "I", input.event.press, - key_.codepoint, + key_.base_layout_codepoint orelse key_.codepoint, key_.shifted_codepoint orelse key_.codepoint, text orelse "", @as(u8, @bitCast(key_.mods)), @@ -166,11 +166,11 @@ pub fn process_renderer_event(self: *Self, msg: []const u8) !void { } else if (self.dispatch_input) |f| f(self.handler_ctx, cbor_msg); }, .key_release => |key__| { - const key_ = filter_mods(key__); + const key_ = filter_mods(normalize_shifted_alphas(key__)); const cbor_msg = try self.fmtmsg(.{ "I", input.event.release, - key_.codepoint, + key_.base_layout_codepoint orelse key_.codepoint, key_.shifted_codepoint orelse key_.codepoint, text orelse "", @as(u8, @bitCast(key_.mods)), @@ -460,6 +460,16 @@ fn filter_mods(key_: vaxis.Key) vaxis.Key { return key__; } +fn normalize_shifted_alphas(key_: vaxis.Key) vaxis.Key { + if (!key_.mods.shift) return key_; + var key = key_; + const shifted_codepoint = key.shifted_codepoint orelse key.codepoint; + const base_layout_codepoint = key.base_layout_codepoint orelse key.codepoint; + if (shifted_codepoint == base_layout_codepoint and 'a' <= shifted_codepoint and shifted_codepoint <= 'z') + key.shifted_codepoint = shifted_codepoint - 0x20; + return key; +} + const Loop = struct { tty: *vaxis.Tty, vaxis: *vaxis.Vaxis,