summaryrefslogtreecommitdiffstats
path: root/zellij-server/src/panes
diff options
context:
space:
mode:
author哇呜哇呜呀咦耶 <pingao777@gmail.com>2022-10-28 22:15:16 +0800
committerGitHub <noreply@github.com>2022-10-28 14:15:16 +0000
commitc5b1eb0a9e9e3e1f8bec55fa028def15b581d763 (patch)
tree0b00bb0e860ae401067a26a6c2bf6cad3c8ac6af /zellij-server/src/panes
parent668df6bbd70be014a74dbb6e62c8d7cad7fd9bb9 (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.rs36
-rw-r--r--zellij-server/src/panes/plugin_pane.rs13
-rw-r--r--zellij-server/src/panes/terminal_pane.rs12
-rw-r--r--zellij-server/src/panes/tiled_panes/mod.rs35
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()