diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-15 02:32:52 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-15 02:32:52 +0300 |
| commit | 88370e1516182ab519d22a12fa82d5780a40fee6 (patch) | |
| tree | b07be9b77abe14cdd3c1ff0e9acc1268729d8723 /src/server/clients.rs | |
| parent | 5d24d0d214d05858e344a9e15a63856dc1328eae (diff) | |
feat: add isolated pane graphics streaming
Diffstat (limited to 'src/server/clients.rs')
| -rw-r--r-- | src/server/clients.rs | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/server/clients.rs b/src/server/clients.rs index 705152eb..243a131d 100644 --- a/src/server/clients.rs +++ b/src/server/clients.rs @@ -20,6 +20,14 @@ pub(crate) type RenderTarget = ( ClientConnectionMode, ); +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub(crate) enum DeferredRender { + #[default] + None, + Graphics, + Full, +} + /// A connected client tracked by the server. pub(crate) struct ClientConnection { /// Whether this connection is the full app client or a direct terminal attach. @@ -50,8 +58,10 @@ pub(crate) struct ClientConnection { pub(crate) graphics_cache: crate::kitty_graphics::HostGraphicsCache, /// Whether the next graphics frame must clear and rebuild host-side Kitty state. pub(crate) graphics_surface_reset_pending: bool, - /// Whether a render was skipped because the render channel was full. + /// Whether an ordinary render was skipped because the render channel was full. pub(crate) render_pending: bool, + /// Whether a pane-graphics-only render was skipped because the channel was full. + pane_graphics_render_pending: bool, /// Last host mouse capture mode sent to this client. pub(crate) host_mouse_capture_active: Option<bool>, /// Temporary files staged from this client's local clipboard image pastes. @@ -115,6 +125,7 @@ impl ClientConnection { graphics_cache: crate::kitty_graphics::HostGraphicsCache::default(), graphics_surface_reset_pending: false, render_pending: false, + pane_graphics_render_pending: false, host_mouse_capture_active: None, staged_clipboard_files: Vec::new(), writer, @@ -124,6 +135,39 @@ impl ClientConnection { pub(crate) fn request_full_redraw(&mut self) { self.render_state.reset_baseline(); self.graphics_surface_reset_pending = true; + self.pane_graphics_render_pending = false; + } + + pub(crate) fn deferred_render(&self) -> DeferredRender { + if self.render_pending { + DeferredRender::Full + } else if self.pane_graphics_render_pending { + DeferredRender::Graphics + } else { + DeferredRender::None + } + } + + pub(crate) fn clear_deferred_render(&mut self) { + self.render_pending = false; + self.pane_graphics_render_pending = false; + } + + pub(crate) fn defer_full_render(&mut self) { + self.render_pending = true; + self.pane_graphics_render_pending = false; + } + + pub(crate) fn defer_pane_graphics_render(&mut self) { + if !self.render_pending { + self.pane_graphics_render_pending = true; + } + } + + pub(crate) fn take_deferred_render(&mut self) -> DeferredRender { + let deferred = self.deferred_render(); + self.clear_deferred_render(); + deferred } pub(crate) fn is_full_app_client(&self) -> bool { |
