diff options
Diffstat (limited to 'src/tty/tty.zig')
| -rw-r--r-- | src/tty/tty.zig | 66 |
1 files changed, 6 insertions, 60 deletions
diff --git a/src/tty/tty.zig b/src/tty/tty.zig index 3902271c..3441bc29 100644 --- a/src/tty/tty.zig +++ b/src/tty/tty.zig @@ -5,6 +5,7 @@ const posix = std.posix; const libc = std.c; const vaxis = @import("vaxis"); const pardes = @import("../pardes.zig"); +const vaxis_input = @import("../vaxis_input.zig"); const dump = @import("../dump.zig"); const tracy = @import("../tracy.zig"); const look = @import("../look.zig"); @@ -1510,7 +1511,7 @@ const Shell = struct { const bytes = pasteBytes(key); const room = max_paste_bytes -| s.paste_buf.written().len; s.paste_buf.writer.writeAll(bytes[0..@min(bytes.len, room)]) catch {}; - } else core.update(keyEvent(key)), + } else core.update(vaxis_input.keyEvent(key)), .mouse => |m| { const pdf_before = nativePdfWheelTarget(core, m); if (mouseEvent(m)) |ev| core.update(ev); @@ -2153,72 +2154,17 @@ fn readPty(io: std.Io, gpa: std.mem.Allocator, pty: std.Io.File, id: usize, gen: _ = loop.tryPostEvent(.{ .pty_eof = .{ .id = id, .gen = gen } }) catch {}; } -fn effCp(key: vaxis.Key) u21 { - if (key.text) |t| { - const view = std.unicode.Utf8View.init(t) catch return key.codepoint; - var it = view.iterator(); - if (it.nextCodepoint()) |c| { - if (it.nextCodepoint() == null) return c; - } - } - return key.shifted_codepoint orelse key.codepoint; -} - -fn mapKey(cp: u21) u21 { - return switch (cp) { - vaxis.Key.kp_enter => pardes.Key.enter, - vaxis.Key.up => pardes.Key.up, - vaxis.Key.down => pardes.Key.down, - vaxis.Key.left => pardes.Key.left, - vaxis.Key.right => pardes.Key.right, - vaxis.Key.home => pardes.Key.home, - vaxis.Key.end => pardes.Key.end, - vaxis.Key.page_up => pardes.Key.page_up, - vaxis.Key.page_down => pardes.Key.page_down, - vaxis.Key.delete => pardes.Key.delete, - vaxis.Key.insert => pardes.Key.insert, - vaxis.Key.print_screen => pardes.Key.print_screen, - vaxis.Key.scroll_lock => pardes.Key.scroll_lock, - vaxis.Key.pause => pardes.Key.pause, - vaxis.Key.menu => pardes.Key.menu, - vaxis.Key.f1...vaxis.Key.f25 => pardes.Key.f1 + (cp - vaxis.Key.f1), - // The keypad's own keys, which the kitty keyboard protocol tells - // apart, do what the keys they are named for do. - vaxis.Key.kp_left => pardes.Key.left, - vaxis.Key.kp_right => pardes.Key.right, - vaxis.Key.kp_up => pardes.Key.up, - vaxis.Key.kp_down => pardes.Key.down, - vaxis.Key.kp_page_up => pardes.Key.page_up, - vaxis.Key.kp_page_down => pardes.Key.page_down, - vaxis.Key.kp_home => pardes.Key.home, - vaxis.Key.kp_end => pardes.Key.end, - vaxis.Key.kp_insert => pardes.Key.insert, - vaxis.Key.kp_delete => pardes.Key.delete, - else => cp, - }; -} - const max_paste_bytes: usize = 4 << 20; fn pasteBytes(key: vaxis.Key) []const u8 { const text = key.text orelse ""; if (text.len > 0) return text; - const cp = mapKey(effCp(key)); + const cp = vaxis_input.mapKey(vaxis_input.effCp(key)); if (cp == pardes.Key.tab) return "\t"; if (cp == pardes.Key.enter or (key.mods.ctrl and cp == 'j')) return "\n"; return ""; } -fn keyEvent(key: vaxis.Key) pardes.Event { - return .{ .key = .{ - .cp = mapKey(effCp(key)), - .text = key.text orelse "", - .ctrl = key.mods.ctrl, - .alt = key.mods.alt, - .shift = key.mods.shift, - } }; -} - test "a terminal pane gets function keys as their sequences and lone modifiers not at all" { if (comptime builtin.os.tag == .windows) return error.SkipZigTest; const gpa = std.testing.allocator; @@ -2271,7 +2217,7 @@ test "a terminal pane gets function keys as their sequences and lone modifiers n core.panes[0].?.body.mode = .tty; while (core.nextEffect()) |_| {} while (try loop.tryEvent()) |event| switch (event) { - .key_press => |key| core.update(keyEvent(key)), + .key_press => |key| core.update(vaxis_input.keyEvent(key)), else => {}, }; var written: std.Io.Writer.Allocating = .init(gpa); @@ -2285,7 +2231,7 @@ test "a terminal pane gets function keys as their sequences and lone modifiers n test "keypad Enter matches Return for editor input terminal writes and paste" { for ([_]u21{ vaxis.Key.enter, vaxis.Key.kp_enter }) |codepoint| { const key: vaxis.Key = .{ .codepoint = codepoint }; - const event = keyEvent(key); + const event = vaxis_input.keyEvent(key); try std.testing.expectEqual(pardes.Key.enter, event.key.cp); try std.testing.expectEqualStrings("\n", pasteBytes(key)); { @@ -2757,7 +2703,7 @@ const Attach = struct { const bytes = pasteBytes(key); const room = max_paste_bytes -| a.paste_buf.written().len; a.paste_buf.writer.writeAll(bytes[0..@min(bytes.len, room)]) catch {}; - } else return a.send(keyEvent(key)), + } else return a.send(vaxis_input.keyEvent(key)), .mouse => |m| if (mouseEvent(m)) |ev| return a.send(ev), .paste => |bytes| { defer a.gpa.free(@constCast(bytes)); |
