summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2023-02-26 19:20:49 +0100
committerGitHub <noreply@github.com>2023-02-26 19:20:49 +0100
commit6a2a845086386c5be71ef35d16ea63b2c21708b7 (patch)
treeec3d2686d6c82cde1fd6abe79dade786c4a4beb0
parent0a8e9f13a3fcd043d68f58e624782f0fb43651a9 (diff)
fix(layout): tab focus (#2197)
* fix(layout): tab focus * style(fmt): rustfmt
-rw-r--r--zellij-server/src/lib.rs4
-rw-r--r--zellij-server/src/screen.rs28
2 files changed, 25 insertions, 7 deletions
diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs
index f095e0c6c..5dc728fb4 100644
--- a/zellij-server/src/lib.rs
+++ b/zellij-server/src/lib.rs
@@ -385,9 +385,9 @@ pub fn start_server(mut os_input: Box<dyn ServerOsApi>, socket_path: PathBuf) {
.as_ref()
.unwrap()
.senders
- .send_to_pty(PtyInstruction::GoToTab(
+ .send_to_screen(ScreenInstruction::GoToTab(
(focused_tab_index + 1) as u32,
- client_id,
+ Some(client_id),
))
.unwrap();
}
diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs
index eb0d359ac..97acc0fdf 100644
--- a/zellij-server/src/screen.rs
+++ b/zellij-server/src/screen.rs
@@ -1413,6 +1413,10 @@ pub(crate) fn screen_thread_main(
copy_options,
);
+ let mut pending_tab_ids: HashSet<usize> = HashSet::new();
+ let mut pending_tab_switches: HashSet<(usize, ClientId)> = HashSet::new(); // usize is the
+ // tab_index
+
loop {
let (event, mut err_ctx) = screen
.bus
@@ -2011,6 +2015,7 @@ pub(crate) fn screen_thread_main(
client_id,
) => {
let tab_index = screen.get_new_tab_index();
+ pending_tab_ids.insert(tab_index);
screen.new_tab(tab_index, swap_layouts, client_id)?;
screen
.bus
@@ -2042,11 +2047,17 @@ pub(crate) fn screen_thread_main(
tab_index,
client_id,
)?;
+ pending_tab_ids.remove(&tab_index);
+ if pending_tab_ids.is_empty() {
+ for (tab_index, client_id) in pending_tab_switches.drain() {
+ screen.go_to_tab(tab_index as usize, client_id)?;
+ }
+ }
screen.unblock_input()?;
screen.render()?;
},
ScreenInstruction::GoToTab(tab_index, client_id) => {
- let client_id = if client_id.is_none() {
+ let client_id_to_switch = if client_id.is_none() {
None
} else if screen
.active_tab_indices
@@ -2056,10 +2067,17 @@ pub(crate) fn screen_thread_main(
} else {
screen.active_tab_indices.keys().next().copied()
};
- if let Some(client_id) = client_id {
- screen.go_to_tab(tab_index as usize, client_id)?;
- screen.unblock_input()?;
- screen.render()?;
+ match client_id_to_switch {
+ Some(client_id) => {
+ screen.go_to_tab(tab_index as usize, client_id)?;
+ screen.unblock_input()?;
+ screen.render()?;
+ },
+ None => {
+ if let Some(client_id) = client_id {
+ pending_tab_switches.insert((tab_index as usize, client_id));
+ }
+ },
}
},
ScreenInstruction::GoToTabName(tab_name, swap_layouts, create, client_id) => {