mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
terminal/kitty-gfx: delete newest
This commit is contained in:
@ -679,7 +679,7 @@ pub const Delete = union(enum) {
|
|||||||
// n/N
|
// n/N
|
||||||
newest: struct {
|
newest: struct {
|
||||||
delete: bool = false, // uppercase
|
delete: bool = false, // uppercase
|
||||||
count: u32 = 0, // I
|
image_number: u32 = 0, // I
|
||||||
placement_id: u32 = 0, // p
|
placement_id: u32 = 0, // p
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -747,7 +747,7 @@ pub const Delete = union(enum) {
|
|||||||
'n', 'N' => blk: {
|
'n', 'N' => blk: {
|
||||||
var result: Delete = .{ .newest = .{ .delete = what == 'N' } };
|
var result: Delete = .{ .newest = .{ .delete = what == 'N' } };
|
||||||
if (kv.get('I')) |v| {
|
if (kv.get('I')) |v| {
|
||||||
result.newest.count = v;
|
result.newest.image_number = v;
|
||||||
}
|
}
|
||||||
if (kv.get('p')) |v| {
|
if (kv.get('p')) |v| {
|
||||||
result.newest.placement_id = v;
|
result.newest.placement_id = v;
|
||||||
|
@ -63,18 +63,6 @@ pub const ImageStorage = struct {
|
|||||||
break :img copy;
|
break :img copy;
|
||||||
}});
|
}});
|
||||||
|
|
||||||
// If the image has an image number, we need to invalidate the last
|
|
||||||
// image with that same number.
|
|
||||||
if (img.number > 0) {
|
|
||||||
var it = self.images.iterator();
|
|
||||||
while (it.next()) |kv| {
|
|
||||||
if (kv.value_ptr.number == img.number) {
|
|
||||||
kv.value_ptr.number = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write our new image
|
// Write our new image
|
||||||
if (gop.found_existing) gop.value_ptr.deinit(alloc);
|
if (gop.found_existing) gop.value_ptr.deinit(alloc);
|
||||||
gop.value_ptr.* = img;
|
gop.value_ptr.* = img;
|
||||||
@ -112,12 +100,20 @@ pub const ImageStorage = struct {
|
|||||||
|
|
||||||
/// Get an image by its number. If the image doesn't exist, return null.
|
/// Get an image by its number. If the image doesn't exist, return null.
|
||||||
pub fn imageByNumber(self: *const ImageStorage, image_number: u32) ?Image {
|
pub fn imageByNumber(self: *const ImageStorage, image_number: u32) ?Image {
|
||||||
|
var newest: ?Image = null;
|
||||||
|
|
||||||
var it = self.images.iterator();
|
var it = self.images.iterator();
|
||||||
while (it.next()) |kv| {
|
while (it.next()) |kv| {
|
||||||
if (kv.value_ptr.number == image_number) return kv.value_ptr.*;
|
if (kv.value_ptr.number == image_number) {
|
||||||
|
if (newest == null or
|
||||||
|
kv.value_ptr.transmit_time.order(newest.?.transmit_time) == .gt)
|
||||||
|
{
|
||||||
|
newest = kv.value_ptr.*;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return newest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Delete placements, images.
|
/// Delete placements, images.
|
||||||
@ -139,25 +135,16 @@ pub const ImageStorage = struct {
|
|||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
.id => |v| {
|
.id => |v| self.deleteById(
|
||||||
// If no placement, we delete all placements with the ID
|
alloc,
|
||||||
if (v.placement_id == 0) {
|
v.image_id,
|
||||||
var it = self.placements.iterator();
|
v.placement_id,
|
||||||
while (it.next()) |entry| {
|
v.delete,
|
||||||
if (entry.key_ptr.image_id == v.image_id) {
|
),
|
||||||
self.placements.removeByPtr(entry.key_ptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_ = self.placements.remove(.{
|
|
||||||
.image_id = v.image_id,
|
|
||||||
.placement_id = v.placement_id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this is specified, then we also delete the image
|
.newest => |v| newest: {
|
||||||
// if it is no longer in use.
|
const img = self.imageByNumber(v.image_number) orelse break :newest;
|
||||||
if (v.delete) self.deleteIfUnused(alloc, v.image_id);
|
self.deleteById(alloc, img.id, v.placement_id, v.delete);
|
||||||
},
|
},
|
||||||
|
|
||||||
.intersect_cursor => |delete_images| {
|
.intersect_cursor => |delete_images| {
|
||||||
@ -223,11 +210,36 @@ pub const ImageStorage = struct {
|
|||||||
// We don't support animation frames yet so they are successfully
|
// We don't support animation frames yet so they are successfully
|
||||||
// deleted!
|
// deleted!
|
||||||
.animation_frames => {},
|
.animation_frames => {},
|
||||||
|
|
||||||
else => log.warn("unimplemented delete command: {}", .{cmd}),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn deleteById(
|
||||||
|
self: *ImageStorage,
|
||||||
|
alloc: Allocator,
|
||||||
|
image_id: u32,
|
||||||
|
placement_id: u32,
|
||||||
|
delete_unused: bool,
|
||||||
|
) void {
|
||||||
|
// If no placement, we delete all placements with the ID
|
||||||
|
if (placement_id == 0) {
|
||||||
|
var it = self.placements.iterator();
|
||||||
|
while (it.next()) |entry| {
|
||||||
|
if (entry.key_ptr.image_id == image_id) {
|
||||||
|
self.placements.removeByPtr(entry.key_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_ = self.placements.remove(.{
|
||||||
|
.image_id = image_id,
|
||||||
|
.placement_id = placement_id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is specified, then we also delete the image
|
||||||
|
// if it is no longer in use.
|
||||||
|
if (delete_unused) self.deleteIfUnused(alloc, image_id);
|
||||||
|
}
|
||||||
|
|
||||||
/// Delete an image if it is unused.
|
/// Delete an image if it is unused.
|
||||||
fn deleteIfUnused(self: *ImageStorage, alloc: Allocator, image_id: u32) void {
|
fn deleteIfUnused(self: *ImageStorage, alloc: Allocator, image_id: u32) void {
|
||||||
var it = self.placements.iterator();
|
var it = self.placements.iterator();
|
||||||
|
Reference in New Issue
Block a user