input: modify other keys 2 should use all mods, ignore consumed mods (#9289)
Fixes #8900 Our xterm modify other keys state 2 encoding was stripped consumed mods from the keyboard event. This doesn't match xterm or other popular terminal emulators (but most importantly: xterm). Use the full set of mods and add a test to verify this. Reproduction: ``` printf '\033[>4;2m' cat ``` Then press `ctrl+shift+h` and compare across terminals.1.2.x
parent
d2a459b7c2
commit
36f647e875
|
|
@ -346,6 +346,10 @@ fn legacy(
|
||||||
// ever be a multi-codepoint sequence that triggers this.
|
// ever be a multi-codepoint sequence that triggers this.
|
||||||
if (it.nextCodepoint() != null) break :modify_other;
|
if (it.nextCodepoint() != null) break :modify_other;
|
||||||
|
|
||||||
|
// The mods we encode for this are just the binding mods (shift, ctrl,
|
||||||
|
// super, alt).
|
||||||
|
const mods = self.event.mods.binding();
|
||||||
|
|
||||||
// This copies xterm's `ModifyOtherKeys` function that returns
|
// This copies xterm's `ModifyOtherKeys` function that returns
|
||||||
// whether modify other keys should be encoded for the given
|
// whether modify other keys should be encoded for the given
|
||||||
// input.
|
// input.
|
||||||
|
|
@ -355,7 +359,7 @@ fn legacy(
|
||||||
break :should_modify true;
|
break :should_modify true;
|
||||||
|
|
||||||
// If we have anything other than shift pressed, encode.
|
// If we have anything other than shift pressed, encode.
|
||||||
var mods_no_shift = binding_mods;
|
var mods_no_shift = mods;
|
||||||
mods_no_shift.shift = false;
|
mods_no_shift.shift = false;
|
||||||
if (!mods_no_shift.empty()) break :should_modify true;
|
if (!mods_no_shift.empty()) break :should_modify true;
|
||||||
|
|
||||||
|
|
@ -370,7 +374,7 @@ fn legacy(
|
||||||
|
|
||||||
if (should_modify) {
|
if (should_modify) {
|
||||||
for (function_keys.modifiers, 2..) |modset, code| {
|
for (function_keys.modifiers, 2..) |modset, code| {
|
||||||
if (!binding_mods.equal(modset)) continue;
|
if (!mods.equal(modset)) continue;
|
||||||
return try std.fmt.bufPrint(
|
return try std.fmt.bufPrint(
|
||||||
buf,
|
buf,
|
||||||
"\x1B[27;{};{}~",
|
"\x1B[27;{};{}~",
|
||||||
|
|
@ -1984,6 +1988,22 @@ test "legacy: ctrl+shift+char with modify other state 2" {
|
||||||
try testing.expectEqualStrings("\x1b[27;6;72~", actual);
|
try testing.expectEqualStrings("\x1b[27;6;72~", actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "legacy: ctrl+shift+char with modify other state 2 and consumed mods" {
|
||||||
|
var buf: [128]u8 = undefined;
|
||||||
|
var enc: KeyEncoder = .{
|
||||||
|
.event = .{
|
||||||
|
.key = .key_h,
|
||||||
|
.mods = .{ .ctrl = true, .shift = true },
|
||||||
|
.consumed_mods = .{ .shift = true },
|
||||||
|
.utf8 = "H",
|
||||||
|
},
|
||||||
|
.modify_other_keys_state_2 = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const actual = try enc.legacy(&buf);
|
||||||
|
try testing.expectEqualStrings("\x1b[27;6;72~", actual);
|
||||||
|
}
|
||||||
|
|
||||||
test "legacy: fixterm awkward letters" {
|
test "legacy: fixterm awkward letters" {
|
||||||
var buf: [128]u8 = undefined;
|
var buf: [128]u8 = undefined;
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue