summaryrefslogtreecommitdiff
path: root/src/tty
diff options
context:
space:
mode:
Diffstat (limited to 'src/tty')
-rw-r--r--src/tty/tty.zig66
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));