decbkm: address review comments

* Don't alter Kitty keyboard protocol responses. Kitty does not support
  DECBKM so KKP doesn't take DECBKM into consideration.
* Make better use of the function key lookup to control what sequence is
  returned when backspace is pressed using the legacy encoding.
pull/12226/head
Jeffrey C. Ollie 2026-04-11 21:27:18 -05:00
parent aea70a5f7c
commit 203895e3f7
No known key found for this signature in database
GPG Key ID: 1BB9EB7EA602265B
2 changed files with 55 additions and 8 deletions

View File

@ -43,6 +43,9 @@ pub const Entry = struct {
/// The sequence to send to the pty if this entry matches.
sequence: []const u8,
/// Sequence to send to the PTY if DECBKM is set.
sequence_decbkm: ?[]const u8 = null,
};
/// The list of modifier combinations for modify other key sequences.
@ -161,8 +164,8 @@ pub const keys = keys: {
.{ .mods = .{ .alt = true, .super = true, .ctrl = true }, .modify_other_keys = .set_other, .sequence = "\x1b[27;15;127~" },
.{ .mods = .{ .alt = true, .super = true, .ctrl = true, .shift = true }, .modify_other_keys = .set_other, .sequence = "\x1b[27;16;127~" },
.{ .mods = .{ .ctrl = true }, .sequence = "\x08" },
.{ .sequence = "\x7f" },
.{ .mods = .{ .ctrl = true }, .sequence = "\x08", .sequence_decbkm = "\x7f" },
.{ .sequence = "\x7f", .sequence_decbkm = "\x08" },
});
result.set(.tab, &.{

View File

@ -189,9 +189,7 @@ fn kitty(
switch (event.key) {
.enter => return try writer.writeByte('\r'),
.tab => return try writer.writeByte('\t'),
.backspace => return try writer.writeByte(
if (opts.backarrow_key_mode) 0x08 else 0x7F,
),
.backspace => return try writer.writeByte(0x7F),
else => {},
}
}
@ -664,7 +662,10 @@ fn pcStyleFunctionKey(
continue;
}
if (keyval == .backspace and backarrow_key_mode) return "\x08";
decbkm: {
if (!backarrow_key_mode) break :decbkm;
return entry.sequence_decbkm orelse break :decbkm;
}
return entry.sequence;
}
@ -1267,13 +1268,13 @@ test "kitty: enter, backspace, tab" {
try testing.expectEqualStrings("\x7f", writer.buffered());
}
{
// DECBKM set
// DECBKM set (Kitty does not support DECBKM so there should be no change)
var writer: std.Io.Writer = .fixed(&buf);
try kitty(&writer, .{ .key = .backspace, .mods = .{}, .utf8 = "" }, .{
.kitty_flags = .{ .disambiguate = true },
.backarrow_key_mode = true,
});
try testing.expectEqualStrings("\x08", writer.buffered());
try testing.expectEqualStrings("\x7f", writer.buffered());
}
{
var writer: std.Io.Writer = .fixed(&buf);
@ -1912,7 +1913,26 @@ test "legacy: backspace with utf8 (dead key state)" {
try testing.expectEqualStrings("", writer.buffered());
}
test "kitty: backspace (DECBKM reset) (report_all: true)" {
var buf: [128]u8 = undefined;
var writer: std.Io.Writer = .fixed(&buf);
try kitty(&writer, .{
.key = .backspace,
}, .{
.kitty_flags = .{
.disambiguate = true,
.report_events = true,
.report_alternates = true,
.report_all = true,
.report_associated = true,
},
.backarrow_key_mode = false,
});
try testing.expectEqualStrings("\x1b[127u", writer.buffered());
}
test "kitty: backspace (DECBKM set) (report_all: true)" {
// Kitty does not support DECBKM so there should be no difference.
var buf: [128]u8 = undefined;
var writer: std.Io.Writer = .fixed(&buf);
try kitty(&writer, .{
@ -2091,6 +2111,18 @@ test "legacy: backspace (DECBKM reset)" {
try testing.expectEqualStrings("\x7f", writer.buffered());
}
test "legacy: backspace (DECBKM reset, with ctrl)" {
var buf: [128]u8 = undefined;
var writer: std.Io.Writer = .fixed(&buf);
try legacy(&writer, .{
.key = .backspace,
.mods = .{
.ctrl = true,
},
}, .{ .backarrow_key_mode = false });
try testing.expectEqualStrings("\x08", writer.buffered());
}
test "legacy: backspace (DECBKM set)" {
var buf: [128]u8 = undefined;
var writer: std.Io.Writer = .fixed(&buf);
@ -2101,6 +2133,18 @@ test "legacy: backspace (DECBKM set)" {
try testing.expectEqualStrings("\x08", writer.buffered());
}
test "legacy: backspace (DECBKM set, with ctrl)" {
var buf: [128]u8 = undefined;
var writer: std.Io.Writer = .fixed(&buf);
try legacy(&writer, .{
.key = .backspace,
.mods = .{
.ctrl = true,
},
}, .{ .backarrow_key_mode = true });
try testing.expectEqualStrings("\x7f", writer.buffered());
}
test "legacy: ctrl+shift+char with modify other state 2" {
var buf: [128]u8 = undefined;
var writer: std.Io.Writer = .fixed(&buf);