aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKunal Mohan <kunalmohan99@gmail.com>2021-03-23 18:25:31 +0530
committerKunal Mohan <kunalmohan99@gmail.com>2021-05-04 20:47:52 +0530
commitbbcea3198892cb005d551a4c3b90c1f02712ace7 (patch)
treeecdb346c3bc699d010d0d939749973ebef4ca21c /src
parentHide IpcChannel entirely behind OsApi (diff)
downloadsl0ppij-bbcea3198892cb005d551a4c3b90c1f02712ace7.tar.gz
sl0ppij-bbcea3198892cb005d551a4c3b90c1f02712ace7.tar.xz
sl0ppij-bbcea3198892cb005d551a4c3b90c1f02712ace7.zip
Synchronize update tabs actions using command_is_executing
Diffstat (limited to 'src')
-rw-r--r--src/common/command_is_executing.rs20
-rw-r--r--src/common/input/handler.rs27
-rw-r--r--src/common/mod.rs17
3 files changed, 56 insertions, 8 deletions
diff --git a/src/common/command_is_executing.rs b/src/common/command_is_executing.rs
index 775a7bfc..fdce0429 100644
--- a/src/common/command_is_executing.rs
+++ b/src/common/command_is_executing.rs
@@ -5,6 +5,7 @@ use std::sync::{Arc, Condvar, Mutex};
pub struct CommandIsExecuting {
opening_new_pane: Arc<(Mutex<bool>, Condvar)>,
closing_pane: Arc<(Mutex<bool>, Condvar)>,
+ updating_tabs: Arc<(Mutex<bool>, Condvar)>,
}
impl CommandIsExecuting {
@@ -12,6 +13,7 @@ impl CommandIsExecuting {
CommandIsExecuting {
opening_new_pane: Arc::new((Mutex::new(false), Condvar::new())),
closing_pane: Arc::new((Mutex::new(false), Condvar::new())),
+ updating_tabs: Arc::new((Mutex::new(false), Condvar::new())),
}
}
pub fn closing_pane(&mut self) {
@@ -36,6 +38,17 @@ impl CommandIsExecuting {
*opening_new_pane = false;
cvar.notify_all();
}
+ pub fn updating_tabs(&mut self) {
+ let (lock, _cvar) = &*self.updating_tabs;
+ let mut updating_tabs = lock.lock().unwrap();
+ *updating_tabs = true;
+ }
+ pub fn done_updating_tabs(&self) {
+ let (lock, cvar) = &*self.updating_tabs;
+ let mut updating_tabs = lock.lock().unwrap();
+ *updating_tabs = false;
+ cvar.notify_one();
+ }
pub fn wait_until_pane_is_closed(&self) {
let (lock, cvar) = &*self.closing_pane;
let mut closing_pane = lock.lock().unwrap();
@@ -50,4 +63,11 @@ impl CommandIsExecuting {
opening_new_pane = cvar.wait(opening_new_pane).unwrap();
}
}
+ pub fn wait_until_tabs_are_updated(&self) {
+ let (lock, cvar) = &*self.updating_tabs;
+ let mut updating_tabs = lock.lock().unwrap();
+ while *updating_tabs {
+ updating_tabs = cvar.wait(updating_tabs).unwrap();
+ }
+ }
}
diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs
index b74e2929..0eda77bf 100644
--- a/src/common/input/handler.rs
+++ b/src/common/input/handler.rs
@@ -238,21 +238,25 @@ impl InputHandler {
self.command_is_executing.wait_until_pane_is_closed();
}
Action::NewTab => {
- self.command_is_executing.opening_new_pane();
+ self.command_is_executing.updating_tabs();
self.send_app_instructions
.send(AppInstruction::ToPty(PtyInstruction::NewTab))
.unwrap();
- self.command_is_executing.wait_until_new_pane_is_opened();
+ self.command_is_executing.wait_until_tabs_are_updated();
}
Action::GoToNextTab => {
+ self.command_is_executing.updating_tabs();
self.send_screen_instructions
.send(ScreenInstruction::SwitchTabNext)
.unwrap();
+ self.command_is_executing.wait_until_tabs_are_updated();
}
Action::GoToPreviousTab => {
+ self.command_is_executing.updating_tabs();
self.send_screen_instructions
.send(ScreenInstruction::SwitchTabPrev)
.unwrap();
+ self.command_is_executing.wait_until_tabs_are_updated();
}
Action::ToggleActiveSyncPanes => {
self.send_screen_instructions
@@ -260,22 +264,37 @@ impl InputHandler {
.unwrap();
}
Action::CloseTab => {
- self.command_is_executing.closing_pane();
+ self.command_is_executing.updating_tabs();
self.send_screen_instructions
.send(ScreenInstruction::CloseTab)
.unwrap();
- self.command_is_executing.wait_until_pane_is_closed();
+ self.command_is_executing.wait_until_tabs_are_updated();
}
Action::GoToTab(i) => {
+ self.command_is_executing.updating_tabs();
self.send_screen_instructions
.send(ScreenInstruction::GoToTab(i))
.unwrap();
+ self.command_is_executing.wait_until_tabs_are_updated();
}
Action::TabNameInput(c) => {
self.send_screen_instructions
.send(ScreenInstruction::UpdateTabName(c))
.unwrap();
}
+ Action::SaveTabName => {
+ self.command_is_executing.updating_tabs();
+ self.send_plugin_instructions
+ .send(PluginInstruction::Input(
+ PluginInputType::Event(EventType::Tab),
+ vec![b'\n'],
+ ))
+ .unwrap();
+ self.send_screen_instructions
+ .send(ScreenInstruction::UpdateTabName(vec![b'\n']))
+ .unwrap();
+ self.command_is_executing.wait_until_tabs_are_updated();
+ }
Action::NoOp => {}
}
diff --git a/src/common/mod.rs b/src/common/mod.rs
index 9cafb5d6..8bff832e 100644
--- a/src/common/mod.rs
+++ b/src/common/mod.rs
@@ -386,22 +386,31 @@ pub fn start(
}
ScreenInstruction::NewTab(pane_id) => {
screen.new_tab(pane_id);
- command_is_executing.done_opening_new_pane();
+ command_is_executing.done_updating_tabs();
+ }
+ ScreenInstruction::SwitchTabNext => {
+ screen.switch_tab_next();
+ command_is_executing.done_updating_tabs();
+ }
+ ScreenInstruction::SwitchTabPrev => {
+ screen.switch_tab_prev();
+ command_is_executing.done_updating_tabs();
}
- ScreenInstruction::SwitchTabNext => screen.switch_tab_next(),
- ScreenInstruction::SwitchTabPrev => screen.switch_tab_prev(),
ScreenInstruction::CloseTab => {
screen.close_tab();
+ command_is_executing.done_updating_tabs();
}
ScreenInstruction::ApplyLayout((layout, new_pane_pids)) => {
screen.apply_layout(Layout::new(layout), new_pane_pids);
command_is_executing.done_opening_new_pane();
}
ScreenInstruction::GoToTab(tab_index) => {
- screen.go_to_tab(tab_index as usize)
+ screen.go_to_tab(tab_index as usize);
+ command_is_executing.done_updating_tabs();
}
ScreenInstruction::UpdateTabName(c) => {
screen.update_active_tab_name(c);
+ command_is_executing.done_updating_tabs();
}
ScreenInstruction::Exit => {
break;