aboutsummaryrefslogtreecommitdiff
path: root/src/app/mod.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-21 20:19:54 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-21 20:22:57 +0300
commit866aaf740e10fcfce169aaf81380ea0257fbe272 (patch)
treef815392b7c6b24a7c0de14e655bd635656383813 /src/app/mod.rs
parentca579c402d5668560ca13059f82c03178be18b2a (diff)
refactor: separate server client boundaries
Diffstat (limited to 'src/app/mod.rs')
-rw-r--r--src/app/mod.rs61
1 files changed, 44 insertions, 17 deletions
diff --git a/src/app/mod.rs b/src/app/mod.rs
index 4c4845a1..6a94f116 100644
--- a/src/app/mod.rs
+++ b/src/app/mod.rs
@@ -62,6 +62,7 @@ pub(crate) struct OverlayPaneState {
pub struct App {
pub state: AppState,
+ pub(crate) terminal_runtimes: crate::terminal::TerminalRuntimeRegistry,
pub event_tx: mpsc::Sender<AppEvent>,
pub(crate) event_rx: mpsc::Receiver<AppEvent>,
pub(crate) api_rx: tokio::sync::mpsc::UnboundedReceiver<crate::api::ApiRequestMessage>,
@@ -224,7 +225,7 @@ impl App {
// Try to restore previous session
let mut restored_terminals = std::collections::HashMap::new();
- let mut restored_terminal_runtimes = std::collections::HashMap::new();
+ let mut restored_terminal_runtimes = crate::terminal::TerminalRuntimeRegistry::new();
let (
workspaces,
active,
@@ -255,7 +256,7 @@ impl App {
render_dirty.clone(),
);
restored_terminals = terminals;
- restored_terminal_runtimes = terminal_runtimes;
+ restored_terminal_runtimes = terminal_runtimes.into();
if ws.is_empty() {
crate::logging::session_restored(0, "empty");
(
@@ -346,7 +347,6 @@ impl App {
let mut state = AppState {
terminals: std::collections::HashMap::new(),
- terminal_runtimes: std::collections::HashMap::new(),
direct_attach_resize_locks: std::collections::HashSet::new(),
workspaces,
active,
@@ -457,14 +457,14 @@ impl App {
global_menu: state::MenuListState::new(0),
host_terminal_theme: crate::terminal_theme::TerminalTheme::default(),
session_dirty: false,
+ terminal_runtime_shutdowns: Vec::new(),
};
state.terminals = restored_terminals;
- state.terminal_runtimes = restored_terminal_runtimes;
for ws_idx in 0..state.workspaces.len() {
let cwd = state.workspaces[ws_idx]
- .resolved_identity_cwd_from(&state.terminals, &state.terminal_runtimes);
+ .resolved_identity_cwd_from(&state.terminals, &restored_terminal_runtimes);
state.workspaces[ws_idx].cached_git_branch =
cwd.as_deref().and_then(crate::workspace::git_branch);
}
@@ -488,6 +488,7 @@ impl App {
config_diagnostic_deadline: None,
toast_deadline: None,
state,
+ terminal_runtimes: restored_terminal_runtimes,
event_tx,
event_rx,
last_git_remote_status_refresh: Instant::now() - GIT_REMOTE_STATUS_REFRESH_INTERVAL,
@@ -593,14 +594,31 @@ impl App {
let area = frame.area();
if kitty_graphics_enabled {
cell_size = crate::kitty_graphics::HostCellSize::from_terminal(area);
- crate::ui::compute_view_with_cell_size(&mut self.state, area, cell_size);
+ crate::ui::compute_view_with_cell_size(
+ &mut self.state,
+ &self.terminal_runtimes,
+ area,
+ cell_size,
+ );
} else {
- crate::ui::compute_view(&mut self.state, area);
+ crate::ui::compute_view_with_runtime_registry(
+ &mut self.state,
+ &self.terminal_runtimes,
+ area,
+ );
}
- crate::ui::render(&self.state, frame);
+ crate::ui::render_with_runtime_registry(
+ &self.state,
+ &self.terminal_runtimes,
+ frame,
+ );
})?;
if kitty_graphics_enabled {
- crate::kitty_graphics::paint_local_pane_graphics(&self.state, cell_size)?;
+ crate::kitty_graphics::paint_local_pane_graphics(
+ &self.state,
+ &self.terminal_runtimes,
+ cell_size,
+ )?;
}
self.last_render_at = Some(now);
needs_render = false;
@@ -664,7 +682,9 @@ impl App {
}
fn sync_host_mouse_capture(&self, active: &mut bool) -> io::Result<()> {
- let desired = self.state.should_capture_host_mouse();
+ let desired = self
+ .state
+ .should_capture_host_mouse_from(&self.terminal_runtimes);
if desired == *active {
return Ok(());
}
@@ -1024,7 +1044,8 @@ impl App {
if self.state.mouse_capture {
self.handle_mouse_event_headless(mouse);
} else {
- self.state.handle_pane_mouse_only(mouse);
+ self.state
+ .handle_pane_mouse_only(&self.terminal_runtimes, mouse);
}
}
crate::raw_input::RawInputEvent::Paste(text) => {
@@ -1032,9 +1053,11 @@ impl App {
if let Some(ws_idx) = self.state.active {
if let Some(ws) = self.state.workspaces.get(ws_idx) {
if let Some(focused) = ws.focused_pane_id() {
- if let Some(runtime) =
- self.state.runtime_for_pane_in_workspace(ws_idx, focused)
- {
+ if let Some(runtime) = self.state.runtime_for_pane_in_workspace(
+ &self.terminal_runtimes,
+ ws_idx,
+ focused,
+ ) {
let _ = runtime.try_send_bytes(bytes::Bytes::from(
if runtime
.input_state()
@@ -1087,7 +1110,11 @@ impl App {
input::handle_confirm_close_key(&mut self.state, key_event);
}
Mode::ContextMenu => {
- input::handle_context_menu_key(&mut self.state, key_event);
+ input::handle_context_menu_key(
+ &mut self.state,
+ &mut self.terminal_runtimes,
+ key_event,
+ );
}
Mode::KeybindHelp => {
input::handle_keybind_help_key(&mut self.state, key_event);
@@ -2221,7 +2248,7 @@ mod tests {
3
);
- let runtimes: Vec<_> = app.state.terminal_runtimes.drain().collect();
+ let runtimes: Vec<_> = app.terminal_runtimes.drain().collect();
for (_terminal_id, runtime) in runtimes {
runtime.shutdown();
}
@@ -2268,7 +2295,7 @@ mod tests {
assert_eq!(app.state.active, Some(0));
assert_eq!(app.state.workspaces[0].active_tab, background_tab);
- let runtimes: Vec<_> = app.state.terminal_runtimes.drain().collect();
+ let runtimes: Vec<_> = app.terminal_runtimes.drain().collect();
for (_terminal_id, runtime) in runtimes {
runtime.shutdown();
}