diff options
author | 哇呜哇呜呀咦耶 <pingao777@gmail.com> | 2022-10-28 22:15:16 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-28 14:15:16 +0000 |
commit | c5b1eb0a9e9e3e1f8bec55fa028def15b581d763 (patch) | |
tree | 0b00bb0e860ae401067a26a6c2bf6cad3c8ac6af /zellij-server/src/panes | |
parent | 668df6bbd70be014a74dbb6e62c8d7cad7fd9bb9 (diff) |
improve error handling in ui module (#1870)
* improve error handling in ui module
* resolve problems in the review
Diffstat (limited to 'zellij-server/src/panes')
-rw-r--r-- | zellij-server/src/panes/floating_panes/mod.rs | 36 | ||||
-rw-r--r-- | zellij-server/src/panes/plugin_pane.rs | 13 | ||||
-rw-r--r-- | zellij-server/src/panes/terminal_pane.rs | 12 | ||||
-rw-r--r-- | zellij-server/src/panes/tiled_panes/mod.rs | 35 |
4 files changed, 64 insertions, 32 deletions
diff --git a/zellij-server/src/panes/floating_panes/mod.rs b/zellij-server/src/panes/floating_panes/mod.rs index 650a763a4..f686f40bb 100644 --- a/zellij-server/src/panes/floating_panes/mod.rs +++ b/zellij-server/src/panes/floating_panes/mod.rs @@ -17,6 +17,7 @@ use std::rc::Rc; use std::time::Instant; use zellij_utils::{ data::{ModeInfo, Style}, + errors::prelude::*, input::command::RunCommand, pane_size::{Offset, PaneGeom, Size, Viewport}, }; @@ -234,7 +235,8 @@ impl FloatingPanes { resize_pty!(pane, os_api); } } - pub fn render(&mut self, output: &mut Output) { + pub fn render(&mut self, output: &mut Output) -> Result<()> { + let err_context = || "failed to render output"; let connected_clients: Vec<ClientId> = { self.connected_clients.borrow().iter().copied().collect() }; let mut floating_panes: Vec<_> = self.panes.iter_mut().collect(); @@ -242,8 +244,16 @@ impl FloatingPanes { self.z_indices .iter() .position(|id| id == *a_id) - .unwrap() - .cmp(&self.z_indices.iter().position(|id| id == *b_id).unwrap()) + .with_context(err_context) + .fatal() + .cmp( + &self + .z_indices + .iter() + .position(|id| id == *b_id) + .with_context(err_context) + .fatal(), + ) }); for (z_index, (kind, pane)) in floating_panes.iter_mut().enumerate() { @@ -266,23 +276,27 @@ impl FloatingPanes { .get(client_id) .unwrap_or(&self.default_mode_info) .mode; - pane_contents_and_ui.render_pane_frame( - *client_id, - client_mode, - self.session_is_mirrored, - ); + pane_contents_and_ui + .render_pane_frame(*client_id, client_mode, self.session_is_mirrored) + .with_context(err_context)?; if let PaneId::Plugin(..) = kind { - pane_contents_and_ui.render_pane_contents_for_client(*client_id); + pane_contents_and_ui + .render_pane_contents_for_client(*client_id) + .with_context(err_context)?; } // this is done for panes that don't have their own cursor (eg. panes of // another user) - pane_contents_and_ui.render_fake_cursor_if_needed(*client_id); + pane_contents_and_ui + .render_fake_cursor_if_needed(*client_id) + .with_context(err_context)?; } if let PaneId::Terminal(..) = kind { pane_contents_and_ui - .render_pane_contents_to_multiple_clients(connected_clients.iter().copied()); + .render_pane_contents_to_multiple_clients(connected_clients.iter().copied()) + .with_context(err_context)?; } } + Ok(()) } pub fn resize(&mut self, new_screen_size: Size) { let display_area = *self.display_area.borrow(); diff --git a/zellij-server/src/panes/plugin_pane.rs b/zellij-server/src/panes/plugin_pane.rs index 5709d7fee..81610188f 100644 --- a/zellij-server/src/panes/plugin_pane.rs +++ b/zellij-server/src/panes/plugin_pane.rs @@ -231,10 +231,10 @@ impl Pane for PluginPane { _client_id: ClientId, frame_params: FrameParams, input_mode: InputMode, - ) -> Option<(Vec<CharacterChunk>, Option<String>)> { + ) -> Result<Option<(Vec<CharacterChunk>, Option<String>)>> { // FIXME: This is a hack that assumes all fixed-size panes are borderless. This // will eventually need fixing! - if self.frame && !(self.geom.rows.is_fixed() || self.geom.cols.is_fixed()) { + let res = if self.frame && !(self.geom.rows.is_fixed() || self.geom.cols.is_fixed()) { let pane_title = if self.pane_name.is_empty() && input_mode == InputMode::RenamePane && frame_params.is_main_client @@ -251,10 +251,15 @@ impl Pane for PluginPane { pane_title, frame_params, ); - Some(frame.render()) + Some( + frame + .render() + .with_context(|| format!("failed to render frame for client {_client_id}"))?, + ) } else { None - } + }; + Ok(res) } fn render_fake_cursor( &mut self, diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index 8d0651ad2..631df0c84 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -347,7 +347,8 @@ impl Pane for TerminalPane { client_id: ClientId, frame_params: FrameParams, input_mode: InputMode, - ) -> Option<(Vec<CharacterChunk>, Option<String>)> { + ) -> Result<Option<(Vec<CharacterChunk>, Option<String>)>> { + let err_context = || format!("failed to render frame for client {client_id}"); // TODO: remove the cursor stuff from here let pane_title = if self.pane_name.is_empty() && input_mode == InputMode::RenamePane @@ -398,12 +399,12 @@ impl Pane for TerminalPane { frame.add_exit_status(exit_status.as_ref().copied()); } - match self.frame.get(&client_id) { + let res = match self.frame.get(&client_id) { // TODO: use and_then or something? Some(last_frame) => { if &frame != last_frame { if !self.borderless { - let frame_output = frame.render(); + let frame_output = frame.render().with_context(err_context)?; self.frame.insert(client_id, frame); Some(frame_output) } else { @@ -415,14 +416,15 @@ impl Pane for TerminalPane { }, None => { if !self.borderless { - let frame_output = frame.render(); + let frame_output = frame.render().with_context(err_context)?; self.frame.insert(client_id, frame); Some(frame_output) } else { None } }, - } + }; + Ok(res) } fn render_fake_cursor( &mut self, diff --git a/zellij-server/src/panes/tiled_panes/mod.rs b/zellij-server/src/panes/tiled_panes/mod.rs index af7769f3b..35f7a3b93 100644 --- a/zellij-server/src/panes/tiled_panes/mod.rs +++ b/zellij-server/src/panes/tiled_panes/mod.rs @@ -12,6 +12,7 @@ use std::cell::RefCell; use std::collections::{BTreeMap, HashMap, HashSet}; use std::rc::Rc; use std::time::Instant; +use zellij_utils::errors::prelude::*; use zellij_utils::{ data::{ModeInfo, Style}, input::command::RunCommand, @@ -378,7 +379,8 @@ impl TiledPanes { pub fn has_panes(&self) -> bool { !self.panes.is_empty() } - pub fn render(&mut self, output: &mut Output, floating_panes_are_visible: bool) { + pub fn render(&mut self, output: &mut Output, floating_panes_are_visible: bool) -> Result<()> { + let err_context = || "failed to render tiled panes"; let connected_clients: Vec<ClientId> = { self.connected_clients.borrow().iter().copied().collect() }; let multiple_users_exist_in_session = { self.connected_clients_in_app.borrow().len() > 1 }; @@ -409,15 +411,17 @@ impl TiledPanes { .get(client_id) .unwrap_or(&self.default_mode_info) .mode; + let err_context = + || format!("failed to render tiled panes for client {client_id}"); if let PaneId::Plugin(..) = kind { - pane_contents_and_ui.render_pane_contents_for_client(*client_id); + pane_contents_and_ui + .render_pane_contents_for_client(*client_id) + .with_context(err_context)?; } if self.draw_pane_frames { - pane_contents_and_ui.render_pane_frame( - *client_id, - client_mode, - self.session_is_mirrored, - ); + pane_contents_and_ui + .render_pane_frame(*client_id, client_mode, self.session_is_mirrored) + .with_context(err_context)?; } else { let boundaries = client_id_to_boundaries .entry(*client_id) @@ -432,20 +436,27 @@ impl TiledPanes { pane_contents_and_ui.render_terminal_title_if_needed(*client_id, client_mode); // this is done for panes that don't have their own cursor (eg. panes of // another user) - pane_contents_and_ui.render_fake_cursor_if_needed(*client_id); + pane_contents_and_ui + .render_fake_cursor_if_needed(*client_id) + .with_context(err_context)?; } if let PaneId::Terminal(..) = kind { - pane_contents_and_ui.render_pane_contents_to_multiple_clients( - connected_clients.iter().copied(), - ); + pane_contents_and_ui + .render_pane_contents_to_multiple_clients(connected_clients.iter().copied()) + .with_context(err_context)?; } } } // render boundaries if needed for (client_id, boundaries) in &mut client_id_to_boundaries { // TODO: add some conditional rendering here so this isn't rendered for every character - output.add_character_chunks_to_client(*client_id, boundaries.render(), None); + output.add_character_chunks_to_client( + *client_id, + boundaries.render().with_context(err_context)?, + None, + ); } + Ok(()) } pub fn get_panes(&self) -> impl Iterator<Item = (&PaneId, &Box<dyn Pane>)> { self.panes.iter() |