Skip to content

Commit 5e4fbff

Browse files
authored
Prevent page clear/show flash on kitty when pages have been cleared from memory. (#148)
* wip; start working on making it not flash when transferring new images * don't delete the images, just clear them * add changelog entry * fmt
1 parent 421401c commit 5e4fbff

5 files changed

Lines changed: 57 additions & 42 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- Added windows support! (thank you to [@jarjk](https://github.com/jarjk) for helping out!)
44
- Added keybindings (`0`/`$`) to scroll to left or right side of zoomed-in image ([#131](https://github.com/itsjunetime/tdf/pull/131), thank you [@IshDeshpa](https://github.com/IshDeshpa)!)
5+
- Fixed issue with images clearing/flashing after displaying a certain number on kitty
56
- (Internal) decreased runtime footprint of tokio runtime
67

78
# v0.5.0

Cargo.lock

Lines changed: 7 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ flexi_logger = "0.31"
5555
console-subscriber = { version = "0.5.0", optional = true }
5656

5757
[patch.crates-io]
58-
pathfinder_simd = { git = "https://github.com/itsjunetime/pathfinder.git", branch = "fix_nightly_arm_simd" }
58+
pathfinder_simd = { git = "https://github.com/itsjunetime/pathfinder.git", rev = "814671e162a1829e074521446317b915311d3d4d" }
5959

6060
[profile.production]
6161
inherits = "release"

src/kitty.rs

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -139,37 +139,37 @@ impl Display for DisplayErrSource<'_> {
139139

140140
pub async fn display_kitty_images<'es>(
141141
display: KittyDisplay<'_>,
142-
ev_stream: &'es mut EventStream
142+
ev_stream: &'es mut EventStream,
143+
last_z_index: &mut i32
143144
) -> Result<(), DisplayErr<'es>> {
144145
let images = match display {
145146
KittyDisplay::NoChange => return Ok(()),
146-
KittyDisplay::DisplayImages(_) | KittyDisplay::ClearImages => {
147-
run_action(
147+
KittyDisplay::ClearImages =>
148+
return run_action(
148149
Action::Delete(DeleteConfig {
149150
effect: ClearOrDelete::Clear,
150151
which: WhichToDelete::All
151152
}),
152153
ev_stream
153154
)
154155
.await
155-
.map_err(|e| DisplayErr::empty("Couldn't clear previous images", e))?;
156-
157-
let KittyDisplay::DisplayImages(images) = display else {
158-
return Ok(());
159-
};
160-
161-
images
162-
}
156+
.map_err(|e| DisplayErr::empty("Couldn't clear previous images", e))
157+
.map(|_: Option<ImageId>| ()),
158+
KittyDisplay::DisplayImages(imgs) => imgs
163159
};
164160

161+
let new_z_index = last_z_index.wrapping_add_unsigned(1);
162+
165163
let mut err = Ok::<(), (SmallVec<[usize; 2]>, DisplayErrSource<'es>)>(());
166164
for KittyReadyToDisplay {
167165
img,
168166
page_num,
169167
pos,
170-
display_loc
168+
mut display_loc
171169
} in images
172170
{
171+
display_loc.z_index = new_z_index;
172+
173173
let config = DisplayConfig {
174174
location: display_loc,
175175
cursor_movement: CursorMovementPolicy::DontMove,
@@ -199,24 +199,21 @@ pub async fn display_kitty_images<'es>(
199199
};
200200
std::mem::swap(image, &mut fake_image);
201201

202-
let res = run_action(
202+
run_action(
203203
Action::TransmitAndDisplay {
204204
image: fake_image,
205205
config,
206206
placement_id: None
207207
},
208208
ev_stream
209209
)
210-
.await;
211-
212-
match res {
213-
Ok(Some(img_id)) => {
214-
*img = MaybeTransferred::Transferred(img_id);
215-
Ok(())
216-
}
217-
Ok(None) => Err((page_num, DisplayErrSource::KittageReturnedNoId)),
218-
Err(e) => Err((page_num, DisplayErrSource::Transmission(e)))
219-
}
210+
.await
211+
.map_err(DisplayErrSource::Transmission)
212+
.and_then(|img_id| {
213+
img_id
214+
.map(|id| *img = MaybeTransferred::Transferred(id))
215+
.ok_or(DisplayErrSource::KittageReturnedNoId)
216+
})
220217
}
221218
MaybeTransferred::Transferred(image_id) => run_action(
222219
Action::Display {
@@ -229,22 +226,37 @@ pub async fn display_kitty_images<'es>(
229226
.await
230227
// don't need the return id 'cause we already know it
231228
.map(|_: Option<ImageId>| ())
232-
.map_err(|e| (page_num, DisplayErrSource::Transmission(e)))
229+
.map_err(DisplayErrSource::Transmission)
233230
};
234231

235232
log::debug!("this_err is {this_err:#?}");
236233

237-
if let Err((id, e)) = this_err {
234+
if let Err(e) = this_err {
238235
match err.as_mut() {
239-
Ok(()) => err = Err((SmallVec::from([id].as_slice()), e)),
240-
Err((v, _)) => v.push(id)
236+
Ok(()) => err = Err((SmallVec::from([page_num].as_slice()), e)),
237+
Err((v, _)) => v.push(page_num)
241238
}
242239
}
243240
}
244241

245-
err.map_err(|(failed_pages, source)| DisplayErr {
246-
failed_pages,
247-
user_facing_err: "Couldn't transfer image to the terminal",
248-
source
249-
})
242+
let z_idxes_to_remove = *last_z_index;
243+
*last_z_index = new_z_index;
244+
245+
match err {
246+
Err((failed_pages, source)) => Err(DisplayErr {
247+
failed_pages,
248+
user_facing_err: "Couldn't transfer image to the terminal",
249+
source
250+
}),
251+
Ok(()) => run_action(
252+
Action::Delete(DeleteConfig {
253+
effect: ClearOrDelete::Clear,
254+
which: WhichToDelete::PlacementsWithZIndex(z_idxes_to_remove)
255+
}),
256+
ev_stream
257+
)
258+
.await
259+
.map_err(|e| DisplayErr::empty("Couldn't clear previously-sent images", e))
260+
.map(|_| ())
261+
}
250262
}

src/main.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,8 @@ async fn enter_redraw_loop(
390390
mut main_area: tdf::tui::RenderLayout,
391391
font_size: FontSize
392392
) -> Result<(), Box<dyn Error>> {
393+
let mut kitty_z_idx = i32::MIN;
394+
393395
loop {
394396
let mut needs_redraw = true;
395397
let next_ev = ev_stream.next().fuse();
@@ -462,7 +464,8 @@ async fn enter_redraw_loop(
462464
to_display = tui.render(f, &main_area, font_size);
463465
})?;
464466

465-
let maybe_err = display_kitty_images(to_display, &mut ev_stream).await;
467+
let maybe_err =
468+
display_kitty_images(to_display, &mut ev_stream, &mut kitty_z_idx).await;
466469

467470
if let Err(DisplayErr {
468471
failed_pages,

0 commit comments

Comments
 (0)