From fb9aff54087aa8a606e9260a689986d2bd76f5fa Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Wed, 13 May 2026 00:54:24 +0300 Subject: feat: render kitty graphics in local panes --- src/app/mod.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'src/app') diff --git a/src/app/mod.rs b/src/app/mod.rs index e9d0b41e..0719dc0c 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -18,7 +18,7 @@ mod theme_sync; use std::collections::{HashMap, HashSet}; use std::future::pending; -use std::io; +use std::io::{self, Write}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -90,6 +90,25 @@ pub(crate) enum LoopEvent { RenderRequested, } +struct SyncOutputGuard; + +impl SyncOutputGuard { + fn begin() -> io::Result { + let mut stdout = io::stdout().lock(); + stdout.write_all(b"\x1b[?2026h")?; + stdout.flush()?; + Ok(Self) + } +} + +impl Drop for SyncOutputGuard { + fn drop(&mut self) { + let mut stdout = io::stdout().lock(); + let _ = stdout.write_all(b"\x1b[?2026l"); + let _ = stdout.flush(); + } +} + async fn recv_raw_input_or_pending( input_rx: Option<&mut mpsc::Receiver>, ) -> Option { @@ -479,10 +498,15 @@ impl App { if needs_render && self.can_render_now(now) { self.render_dirty.swap(false, Ordering::AcqRel); + let _sync_output = SyncOutputGuard::begin()?; + let mut cell_size = crate::kitty_graphics::HostCellSize::default(); terminal.draw(|frame| { - crate::ui::compute_view(&mut self.state, frame.area()); + let area = frame.area(); + cell_size = crate::kitty_graphics::HostCellSize::from_terminal(area); + crate::ui::compute_view_with_cell_size(&mut self.state, area, cell_size); crate::ui::render(&self.state, frame); })?; + crate::kitty_graphics::paint_local_pane_graphics(&self.state, cell_size)?; self.last_render_at = Some(now); needs_render = false; continue; -- cgit v1.2.3