terminal: ScreenSearch restarts on resize

pull/9711/head
Mitchell Hashimoto 2025-11-26 08:31:06 -08:00
parent 8d11335ee4
commit 1786022ac3
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
1 changed files with 31 additions and 0 deletions

View File

@ -4,6 +4,7 @@ const testing = std.testing;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
const point = @import("../point.zig"); const point = @import("../point.zig");
const highlight = @import("../highlight.zig"); const highlight = @import("../highlight.zig");
const size = @import("../size.zig");
const FlattenedHighlight = highlight.Flattened; const FlattenedHighlight = highlight.Flattened;
const TrackedHighlight = highlight.Tracked; const TrackedHighlight = highlight.Tracked;
const PageList = @import("../PageList.zig"); const PageList = @import("../PageList.zig");
@ -57,6 +58,11 @@ pub const ScreenSearch = struct {
history_results: std.ArrayList(FlattenedHighlight), history_results: std.ArrayList(FlattenedHighlight),
active_results: std.ArrayList(FlattenedHighlight), active_results: std.ArrayList(FlattenedHighlight),
/// The dimensions of the screen. When this changes we need to
/// restart the whole search, currently.
rows: size.CellCountInt,
cols: size.CellCountInt,
pub const SelectedMatch = struct { pub const SelectedMatch = struct {
/// Index from the end of the match list (0 = most recent match) /// Index from the end of the match list (0 = most recent match)
idx: usize, idx: usize,
@ -129,6 +135,8 @@ pub const ScreenSearch = struct {
) Allocator.Error!ScreenSearch { ) Allocator.Error!ScreenSearch {
var result: ScreenSearch = .{ var result: ScreenSearch = .{
.screen = screen, .screen = screen,
.rows = screen.pages.rows,
.cols = screen.pages.cols,
.active = try .init(alloc, needle_unowned), .active = try .init(alloc, needle_unowned),
.history = null, .history = null,
.state = .active, .state = .active,
@ -247,6 +255,29 @@ pub const ScreenSearch = struct {
/// Feed on a complete screen search will perform some cleanup of /// Feed on a complete screen search will perform some cleanup of
/// potentially stale history results (pruned) and reclaim some memory. /// potentially stale history results (pruned) and reclaim some memory.
pub fn feed(self: *ScreenSearch) Allocator.Error!void { pub fn feed(self: *ScreenSearch) Allocator.Error!void {
// If the screen resizes, we have to reset our entire search. That
// isn't ideal but we don't have a better way right now to handle
// reflowing the search results beyond putting a tracked pin for
// every single result.
if (self.screen.pages.rows != self.rows or
self.screen.pages.cols != self.cols)
{
// Reinit
const new: ScreenSearch = try .init(
self.allocator(),
self.screen,
self.needle(),
);
// Deinit/reinit
self.deinit();
self.* = new;
// New result should have matching dimensions
assert(self.screen.pages.rows == self.rows);
assert(self.screen.pages.cols == self.cols);
}
const history: *PageListSearch = if (self.history) |*h| &h.searcher else { const history: *PageListSearch = if (self.history) |*h| &h.searcher else {
// No history to feed, search is complete. // No history to feed, search is complete.
self.state = .complete; self.state = .complete;