From bd00c7e913a73188455b5c95800f508193d12ddc Mon Sep 17 00:00:00 2001 From: itsjunetime Date: Sun, 8 Feb 2026 23:43:56 -0600 Subject: [PATCH] Maybe fixed tmux for kitty --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/kitty.rs | 30 ++++++++++++++++++++++-------- src/main.rs | 8 ++++++-- src/tui.rs | 7 ++++--- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 099b9cf..1164d3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2390,7 +2390,7 @@ dependencies = [ [[package]] name = "ratatui-image" version = "10.0.5" -source = "git+https://github.com/itsjunetime/ratatui-image.git?rev=a276a87cb8e2976442c6cc59db831db81551da89#a276a87cb8e2976442c6cc59db831db81551da89" +source = "git+https://github.com/itsjunetime/ratatui-image.git?rev=8ad154a219c1e4832a378bd07aaf39b3ddff959b#8ad154a219c1e4832a378bd07aaf39b3ddff959b" dependencies = [ "base64-simd", "icy_sixel", diff --git a/Cargo.toml b/Cargo.toml index fe612fc..a771872 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ name = "tdf" ratatui = { git = "https://github.com/itsjunetime/ratatui.git", rev = "720ac2d0cad1ac6424364fea74856fec9c100cb1", default-features = false, features = [ "crossterm", "layout-cache" ] } # ratatui = { path = "./ratatui/ratatui/" } # We're using this to have the vb64 feature (for faster base64 encoding, since that does take up a good bit of time when converting images to the `Protocol`. It also just includes a few more features that I'm waiting on main to upstream -ratatui-image = { git = "https://github.com/itsjunetime/ratatui-image.git", rev = "a276a87cb8e2976442c6cc59db831db81551da89", default-features = false } +ratatui-image = { git = "https://github.com/itsjunetime/ratatui-image.git", rev = "8ad154a219c1e4832a378bd07aaf39b3ddff959b", default-features = false } # ratatui-image = { path = "./ratatui-image", default-features = false } crossterm = { version = "0.29.0", features = ["event-stream"] } # crossterm = { path = "../crossterm", features = ["event-stream"] } diff --git a/src/kitty.rs b/src/kitty.rs index 7efe19b..a88f40f 100644 --- a/src/kitty.rs +++ b/src/kitty.rs @@ -15,7 +15,8 @@ use kittage::{ display::{CursorMovementPolicy, DisplayConfig, DisplayLocation}, error::TransmitError, image::Image, - medium::Medium + medium::Medium, + tmux::TmuxWriter }; use ratatui::layout::Position; use smallvec::SmallVec; @@ -32,7 +33,7 @@ pub struct KittyReadyToDisplay<'tui> { pub enum KittyDisplay<'tui> { NoChange, ClearImages, - DisplayImages(Vec>) + DisplayImages(SmallVec<[KittyReadyToDisplay<'tui>; 1]>) } pub struct DbgWriter { @@ -64,6 +65,7 @@ impl Write for DbgWriter { pub async fn run_action<'es>( action: Action<'_, '_>, + is_tmux: bool, ev_stream: &'es mut EventStream ) -> Result, TransmitError<<&'es mut EventStream as AsyncInputReader>::Error>> { let writer = DbgWriter { @@ -71,13 +73,21 @@ pub async fn run_action<'es>( #[cfg(debug_assertions)] buf: String::new() }; - action - .execute_async(writer, ev_stream) - .await - .map(|(_, i)| i) + + if is_tmux { + action + .execute_async(TmuxWriter::new(writer), ev_stream) + .await + .map(|(_, i)| i) + } else { + action + .execute_async(writer, ev_stream) + .await + .map(|(_, i)| i) + } } -pub async fn do_shms_work(ev_stream: &mut EventStream) -> bool { +pub async fn do_shms_work(is_tmux: bool, ev_stream: &mut EventStream) -> bool { let img = DynamicImage::new_rgb8(1, 1); let pid = std::process::id(); let shm_name = format!("tdf_test_{pid}"); @@ -94,7 +104,7 @@ pub async fn do_shms_work(ev_stream: &mut EventStream) -> bool { enable_raw_mode().unwrap(); - let res = run_action(Action::Query(&k_img), ev_stream).await; + let res = run_action(Action::Query(&k_img), is_tmux, ev_stream).await; disable_raw_mode().unwrap(); @@ -139,6 +149,7 @@ impl Display for DisplayErrSource<'_> { pub async fn display_kitty_images<'es>( display: KittyDisplay<'_>, + is_tmux: bool, ev_stream: &'es mut EventStream, last_z_index: &mut i32 ) -> Result<(), DisplayErr<'es>> { @@ -150,6 +161,7 @@ pub async fn display_kitty_images<'es>( effect: ClearOrDelete::Clear, which: WhichToDelete::All }), + is_tmux, ev_stream ) .await @@ -205,6 +217,7 @@ pub async fn display_kitty_images<'es>( config, placement_id: None }, + is_tmux, ev_stream ) .await @@ -221,6 +234,7 @@ pub async fn display_kitty_images<'es>( placement_id: *image_id, config }, + is_tmux, ev_stream ) .await diff --git a/src/main.rs b/src/main.rs index 454fef1..dbc7aba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -298,8 +298,9 @@ async fn inner_main() -> Result<(), WrappedErr> { let (to_main, from_converter) = flume::unbounded(); let is_kitty = picker.protocol_type() == ProtocolType::Kitty; + let is_tmux = picker.is_tmux(); - let shms_work = is_kitty && do_shms_work(&mut ev_stream).await; + let shms_work = is_kitty && do_shms_work(is_tmux, &mut ev_stream).await; tokio::spawn(run_conversion_loop( to_main, from_main, picker, 20, shms_work @@ -329,6 +330,7 @@ async fn inner_main() -> Result<(), WrappedErr> { effect: ClearOrDelete::Delete, which: WhichToDelete::IdRange(NonZeroU32::new(1).unwrap()..=NonZeroU32::MAX) }), + is_tmux, &mut ev_stream ) .await @@ -357,6 +359,7 @@ async fn inner_main() -> Result<(), WrappedErr> { to_converter, from_converter, fullscreen, + is_tmux, tui, &mut term, main_area, @@ -385,6 +388,7 @@ async fn enter_redraw_loop( to_converter: Sender, mut from_converter: RecvStream<'_, Result>, mut fullscreen: bool, + is_tmux: bool, mut tui: Tui, term: &mut Terminal>, mut main_area: tdf::tui::RenderLayout, @@ -465,7 +469,7 @@ async fn enter_redraw_loop( })?; let maybe_err = - display_kitty_images(to_display, &mut ev_stream, &mut kitty_z_idx).await; + display_kitty_images(to_display, is_tmux, &mut ev_stream, &mut kitty_z_idx).await; if let Err(DisplayErr { failed_pages, diff --git a/src/tui.rs b/src/tui.rs index 707823d..5a2c0a5 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -19,6 +19,7 @@ use ratatui::{ widgets::{Block, Borders, Clear, Padding, Paragraph, Wrap} }; use ratatui_image::{FontSize, Image}; +use smallvec::SmallVec; use crate::{ FitOrFill, @@ -359,7 +360,7 @@ impl Tui { .cell_pan_from_top .min(img_cell_h.saturating_sub(img_section_h.ceil() as u16)); - KittyDisplay::DisplayImages(vec![KittyReadyToDisplay { + KittyDisplay::DisplayImages(SmallVec::from([KittyReadyToDisplay { img, page_num, pos: Position { @@ -375,7 +376,7 @@ impl Tui { rows: img_area.height, ..DisplayLocation::default() } - }]) + }])) } #[must_use] @@ -517,7 +518,7 @@ impl Tui { display_loc: DisplayLocation::default() }) }) - .collect::>(); + .collect::>(); // we want to set this at the very end so it doesn't get set somewhere halfway through and // then the whole diffing thing messes it up