aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKyle Sutherland-Cash <kyle.sutherlandcash@gmail.com>2021-05-01 08:26:57 -0700
committerKyle Sutherland-Cash <kyle.sutherlandcash@gmail.com>2021-05-01 08:26:57 -0700
commitae6192d698fb4ddbd8514eb4fff26543034d13de (patch)
tree8fb4f7ca8eab67d83a8ad4662f35e36edd402040 /src
parentDefine shared bus type (diff)
downloadsl0ppij-ae6192d698fb4ddbd8514eb4fff26543034d13de.tar.gz
sl0ppij-ae6192d698fb4ddbd8514eb4fff26543034d13de.tar.xz
sl0ppij-ae6192d698fb4ddbd8514eb4fff26543034d13de.zip
Use Bus type for screen thread
Diffstat (limited to 'src')
-rw-r--r--src/common/mod.rs47
-rw-r--r--src/common/screen.rs54
2 files changed, 58 insertions, 43 deletions
diff --git a/src/common/mod.rs b/src/common/mod.rs
index ba506e8b..2b8adf4e 100644
--- a/src/common/mod.rs
+++ b/src/common/mod.rs
@@ -119,6 +119,34 @@ pub enum AppInstruction {
}
pub struct Bus<T> {
+ receiver: mpsc::Receiver<(T, ErrorContext)>,
+ to_screen: Option<SenderWithContext<ScreenInstruction>>,
+ to_pty: Option<SenderWithContext<PtyInstruction>>,
+ to_plugin: Option<SenderWithContext<PluginInstruction>>,
+ to_app: Option<SenderWithContext<AppInstruction>>,
+ os_input: Option<Box<dyn OsApi>>,
+}
+
+impl<T> Bus<T> {
+ fn new(
+ receiver: mpsc::Receiver<(T, ErrorContext)>,
+ to_screen: Option<&SenderWithContext<ScreenInstruction>>,
+ to_pty: Option<&SenderWithContext<PtyInstruction>>,
+ to_plugin: Option<&SenderWithContext<PluginInstruction>>,
+ to_app: Option<&SenderWithContext<AppInstruction>>,
+ os_input: Option<&Box<dyn OsApi>>,
+ ) -> Self {
+ Bus {
+ receiver,
+ to_screen: to_screen.cloned(),
+ to_pty: to_pty.cloned(),
+ to_plugin: to_plugin.cloned(),
+ to_app: to_app.cloned(),
+ os_input: os_input.cloned(),
+ }
+ }
+}
+
/// Start Zellij with the specified [`OsApi`] and command-line arguments.
// FIXME this should definitely be modularized and split into different functions.
pub fn start(mut os_input: Box<dyn OsApi>, opts: CliArgs) {
@@ -263,25 +291,26 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: CliArgs) {
.name("screen".to_string())
.spawn({
let mut command_is_executing = command_is_executing.clone();
- let os_input = os_input.clone();
- let send_pty_instructions = send_pty_instructions.clone();
- let send_plugin_instructions = send_plugin_instructions.clone();
- let send_app_instructions = send_app_instructions.clone();
+ let screen_bus = Bus::new(
+ receive_screen_instructions,
+ None,
+ Some(&send_pty_instructions),
+ Some(&send_plugin_instructions),
+ Some(&send_app_instructions),
+ Some(&os_input),
+ );
let max_panes = opts.max_panes;
move || {
let mut screen = Screen::new(
- receive_screen_instructions,
- send_pty_instructions,
- send_plugin_instructions,
- send_app_instructions,
+ screen_bus,
&full_screen_ws,
- os_input,
max_panes,
ModeInfo::default(),
);
loop {
let (event, mut err_ctx) = screen
+ .bus
.receiver
.recv()
.expect("failed to receive event on channel");
diff --git a/src/common/screen.rs b/src/common/screen.rs
index eee1166f..513368c7 100644
--- a/src/common/screen.rs
+++ b/src/common/screen.rs
@@ -6,6 +6,7 @@ use std::str;
use std::sync::mpsc::Receiver;
use super::{AppInstruction, SenderWithContext};
+use crate::common::Bus;
use crate::os_input_output::OsApi;
use crate::panes::PositionAndSize;
use crate::pty_bus::{PtyInstruction, VteBytes};
@@ -62,51 +63,33 @@ pub enum ScreenInstruction {
/// A [`Screen`] holds multiple [`Tab`]s, each one holding multiple [`panes`](crate::client::panes).
/// It only directly controls which tab is active, delegating the rest to the individual `Tab`.
pub struct Screen {
- /// A [`ScreenInstruction`] and [`ErrorContext`] receiver.
- pub receiver: Receiver<(ScreenInstruction, ErrorContext)>,
+ /// A Bus for sending and receiving messages with the other threads.
+ pub bus: Bus<ScreenInstruction>,
/// An optional maximal amount of panes allowed per [`Tab`] in this [`Screen`] instance.
max_panes: Option<usize>,
/// A map between this [`Screen`]'s tabs and their ID/key.
tabs: BTreeMap<usize, Tab>,
- /// A [`PtyInstruction`] and [`ErrorContext`] sender.
- pub send_pty_instructions: SenderWithContext<PtyInstruction>,
- /// A [`PluginInstruction`] and [`ErrorContext`] sender.
- pub send_plugin_instructions: SenderWithContext<PluginInstruction>,
- /// An [`AppInstruction`] and [`ErrorContext`] sender.
- pub send_app_instructions: SenderWithContext<AppInstruction>,
/// The full size of this [`Screen`].
full_screen_ws: PositionAndSize,
/// The index of this [`Screen`]'s active [`Tab`].
active_tab_index: Option<usize>,
- /// The [`OsApi`] this [`Screen`] uses.
- os_api: Box<dyn OsApi>,
mode_info: ModeInfo,
}
impl Screen {
- // FIXME: This lint needs actual fixing! Maybe by bundling the Senders
/// Creates and returns a new [`Screen`].
- #[allow(clippy::too_many_arguments)]
pub fn new(
- receive_screen_instructions: Receiver<(ScreenInstruction, ErrorContext)>,
- send_pty_instructions: SenderWithContext<PtyInstruction>,
- send_plugin_instructions: SenderWithContext<PluginInstruction>,
- send_app_instructions: SenderWithContext<AppInstruction>,
+ bus: Bus<ScreenInstruction>,
full_screen_ws: &PositionAndSize,
- os_api: Box<dyn OsApi>,
max_panes: Option<usize>,
mode_info: ModeInfo,
) -> Self {
Screen {
- receiver: receive_screen_instructions,
+ bus,
max_panes,
- send_pty_instructions,
- send_plugin_instructions,
- send_app_instructions,
full_screen_ws: *full_screen_ws,
active_tab_index: None,
tabs: BTreeMap::new(),
- os_api,
mode_info,
}
}
@@ -121,10 +104,10 @@ impl Screen {
position,
String::new(),
&self.full_screen_ws,
- self.os_api.clone(),
- self.send_pty_instructions.clone(),
- self.send_plugin_instructions.clone(),
- self.send_app_instructions.clone(),
+ self.bus.os_input.as_ref().unwrap().clone(),
+ self.bus.to_pty.as_ref().unwrap().clone(),
+ self.bus.to_plugin.as_ref().unwrap().clone(),
+ self.bus.to_app.as_ref().unwrap().clone(),
self.max_panes,
Some(PaneId::Terminal(pane_id)),
self.mode_info.clone(),
@@ -207,11 +190,14 @@ impl Screen {
// because this might be happening when the app is closing, at which point the pty thread
// has already closed and this would result in an error
let _ = self
- .send_pty_instructions
+ .bus
+ .to_pty
+ .as_ref()
+ .unwrap()
.send(PtyInstruction::CloseTab(pane_ids));
if self.tabs.is_empty() {
self.active_tab_index = None;
- self.send_app_instructions
+ self.bus.to_app.as_ref().unwrap()
.send(AppInstruction::Exit)
.unwrap();
} else {
@@ -225,7 +211,7 @@ impl Screen {
}
pub fn resize_to_screen(&mut self) {
- let new_screen_size = self.os_api.get_terminal_size_using_fd(0);
+ let new_screen_size = self.bus.os_input.as_ref().unwrap().get_terminal_size_using_fd(0);
self.full_screen_ws = new_screen_size;
for (_, tab) in self.tabs.iter_mut() {
tab.resize_whole_tab(new_screen_size);
@@ -276,10 +262,10 @@ impl Screen {
position,
String::new(),
&self.full_screen_ws,
- self.os_api.clone(),
- self.send_pty_instructions.clone(),
- self.send_plugin_instructions.clone(),
- self.send_app_instructions.clone(),
+ self.bus.os_input.as_ref().unwrap().clone(),
+ self.bus.to_pty.as_ref().unwrap().clone(),
+ self.bus.to_plugin.as_ref().unwrap().clone(),
+ self.bus.to_app.as_ref().unwrap().clone(),
self.max_panes,
None,
self.mode_info.clone(),
@@ -301,7 +287,7 @@ impl Screen {
is_sync_panes_active: tab.is_sync_panes_active(),
});
}
- self.send_plugin_instructions
+ self.bus.to_plugin.as_ref().unwrap()
.send(PluginInstruction::Update(None, Event::TabUpdate(tab_data)))
.unwrap();
}