Merge pull request #2177 from jcollie/kitty-graphics-local-more

kitty graphics: fix usage of "m" key for local-only transmission mediums
This commit is contained in:
Mitchell Hashimoto
2024-09-01 21:19:05 -07:00
committed by GitHub

View File

@ -451,9 +451,20 @@ pub const Transmission = struct {
};
}
// If the transmission medium is a local-only medium, ignore the "m"
// key. The Kitty graphics protocol specification does not explicitly
// call out this behavior (although the "m" key is only mentioned in
// connection with remote clients) but that's how it's implemented in
// Kitty and at least one client (mpv) relies on this behavior when
// using the shared memory transmission medium.
//
// https://sw.kovidgoyal.net/kitty/graphics-protocol/#the-transmission-medium
// https://github.com/kovidgoyal/kitty/blob/ccc3bee9af794f332b4e9adcd714a649f639c397/kitty/graphics.c#L547-L592
if (result.medium == .direct) {
if (kv.get('m')) |v| {
result.more_chunks = v > 0;
}
}
return result;
}
@ -911,6 +922,40 @@ test "transmission command" {
try testing.expectEqual(@as(u32, 20), v.height);
}
test "transmission ignores 'm' if medium is not direct" {
const testing = std.testing;
const alloc = testing.allocator;
var p = Parser.init(alloc);
defer p.deinit();
const input = "a=t,t=t,m=1";
for (input) |c| try p.feed(c);
const command = try p.complete();
defer command.deinit(alloc);
try testing.expect(command.control == .transmit);
const v = command.control.transmit;
try testing.expectEqual(Transmission.Medium.temporary_file, v.medium);
try testing.expect(!v.more_chunks);
}
test "transmission respects 'm' if medium is direct" {
const testing = std.testing;
const alloc = testing.allocator;
var p = Parser.init(alloc);
defer p.deinit();
const input = "a=t,t=d,m=1";
for (input) |c| try p.feed(c);
const command = try p.complete();
defer command.deinit(alloc);
try testing.expect(command.control == .transmit);
const v = command.control.transmit;
try testing.expectEqual(Transmission.Medium.direct, v.medium);
try testing.expect(v.more_chunks);
}
test "query command" {
const testing = std.testing;
const alloc = testing.allocator;