From 91a310c9330b67afbddcaac11beab619de288678 Mon Sep 17 00:00:00 2001 From: kuro337 <65412787+kuro337@users.noreply.github.com> Date: Thu, 16 Jan 2025 21:57:06 -0500 Subject: [PATCH] input: distinguish ctrl+j from enter (#149) `\x0A` was being parsed as an enter keypress. Distinguish this explicitly as a ctrl+j press. --- examples/cli.zig | 2 +- examples/table.zig | 4 ++-- examples/text_input.zig | 2 +- src/Parser.zig | 5 ++--- src/vxfw/Button.zig | 2 +- src/vxfw/TextField.zig | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/examples/cli.zig b/examples/cli.zig index 0ec8547..b789a04 100644 --- a/examples/cli.zig +++ b/examples/cli.zig @@ -62,7 +62,7 @@ pub fn main() !void { } else { selected_option.? = selected_option.? -| 1; } - } else if (key.matches(vaxis.Key.enter, .{})) { + } else if (key.matches(vaxis.Key.enter, .{}) or key.matches('j', .{ .ctrl = true })) { if (selected_option) |i| { log.err("enter", .{}); try text_input.insertSliceAtCursor(options[i]); diff --git a/examples/table.zig b/examples/table.zig index 7d4e281..b79d1ed 100644 --- a/examples/table.zig +++ b/examples/table.zig @@ -167,12 +167,12 @@ pub fn main() !void { demo_tbl.sel_rows = try rows_list.toOwnedSlice(); } // See Row Content - if (key.matches(vaxis.Key.enter, .{})) see_content = !see_content; + if (key.matches(vaxis.Key.enter, .{}) or key.matches('j', .{ .ctrl = true })) see_content = !see_content; }, .btm => { if (key.matchesAny(&.{ vaxis.Key.up, 'k' }, .{}) and moving) active = .mid // Run Command and Clear Command Bar - else if (key.matchExact(vaxis.Key.enter, .{})) { + else if (key.matchExact(vaxis.Key.enter, .{}) or key.matchExact('j', .{ .ctrl = true })) { const cmd = try cmd_input.toOwnedSlice(); defer alloc.free(cmd); if (mem.eql(u8, ":q", cmd) or diff --git a/examples/text_input.zig b/examples/text_input.zig index 45baa70..30572d8 100644 --- a/examples/text_input.zig +++ b/examples/text_input.zig @@ -99,7 +99,7 @@ pub fn main() !void { try loop.start(); try vx.enterAltScreen(tty.anyWriter()); vx.queueRefresh(); - } else if (key.matches(vaxis.Key.enter, .{})) { + } else if (key.matches(vaxis.Key.enter, .{}) or key.matches('j', .{ .ctrl = true })) { text_input.clearAndFree(); } else { try text_input.update(.{ .key_press = key }); diff --git a/src/Parser.zig b/src/Parser.zig index 6a481fb..8455de0 100644 --- a/src/Parser.zig +++ b/src/Parser.zig @@ -94,9 +94,8 @@ inline fn parseGround(input: []const u8, data: *const grapheme.GraphemeData) !Re 0x00 => .{ .codepoint = '@', .mods = .{ .ctrl = true } }, 0x08 => .{ .codepoint = Key.backspace }, 0x09 => .{ .codepoint = Key.tab }, - 0x0A, - 0x0D, - => .{ .codepoint = Key.enter }, + 0x0A => .{ .codepoint = 'j', .mods = .{ .ctrl = true } }, + 0x0D => .{ .codepoint = Key.enter }, 0x01...0x07, 0x0B...0x0C, 0x0E...0x1A, diff --git a/src/vxfw/Button.zig b/src/vxfw/Button.zig index 978acce..3a533b8 100644 --- a/src/vxfw/Button.zig +++ b/src/vxfw/Button.zig @@ -44,7 +44,7 @@ fn typeErasedEventHandler(ptr: *anyopaque, ctx: *vxfw.EventContext, event: vxfw. pub fn handleEvent(self: *Button, ctx: *vxfw.EventContext, event: vxfw.Event) anyerror!void { switch (event) { .key_press => |key| { - if (key.matches(vaxis.Key.enter, .{})) { + if (key.matches(vaxis.Key.enter, .{}) or key.matches('j', .{ .ctrl = true })) { return self.doClick(ctx); } }, diff --git a/src/vxfw/TextField.zig b/src/vxfw/TextField.zig index 5db4811..61a1e94 100644 --- a/src/vxfw/TextField.zig +++ b/src/vxfw/TextField.zig @@ -102,7 +102,7 @@ pub fn handleEvent(self: *TextField, ctx: *vxfw.EventContext, event: vxfw.Event) } else if (key.matches('d', .{ .alt = true })) { self.deleteWordAfter(); return self.checkChanged(ctx); - } else if (key.matches(vaxis.Key.enter, .{})) { + } else if (key.matches(vaxis.Key.enter, .{}) or key.matches('j', .{ .ctrl = true })) { if (self.onSubmit) |onSubmit| { try onSubmit(self.userdata, ctx, self.previous_val); return ctx.consumeAndRedraw();