summaryrefslogtreecommitdiffstats
path: root/zellij-server
diff options
context:
space:
mode:
author哇呜哇呜呀咦耶 <pingao777@gmail.com>2023-03-02 00:28:17 +0800
committerGitHub <noreply@github.com>2023-03-01 17:28:17 +0100
commitc2fb275319bb940cb13da48aa7a67cd611617f5b (patch)
tree0540919eeba3b9980e0a6c3b078db3a458e6b650 /zellij-server
parent715ee1109d1d6b389c876653a12c8f2721c4de05 (diff)
feat(cli): `QueryTabNames` cli action to list all tab names (#2145)
* extend display char in tab * Add action to list all tab names * print tab names and remove logs * change msg name, and handle Log in normal client * fix log * resolve code conflict * change var name * add snapshot test * fix failed test case * restore snapshot * Revert "restore snapshot" This reverts commit b97a9512ab106615a1a1e5882392a03a17cdf1a3. * restore snapshot * revert snapshot * fix(layout): various parser and ui fixes (#2191) * fix(layout): error on nodes outside layout node * fix(layout): move stacked property to pane * fix(layout): various stack exceptions * fix(ui): non-flexible stacked pane titles now take up their full length * fix(ui): stack titles with no-pane-frames take up their proper length * style(fmt): rustfmt * docs(changelog): layout fixes * fix(messaging): cache hold pane messages by their tab_id if the tab is not ready (#2196) * fix(messaging): cache hold pane messages by their tab_id if the tab is not ready * style(fmt): rustfmt * docs(changelog): open panes fix * fix(layout): tab focus (#2197) * fix(layout): tab focus * style(fmt): rustfmt * docs(changel0g): tab focus fix * fix(cli): new-tab now also looks in layout_dir for layouts (#2198) * fix(cli): the new-tab action now also searches for layouts in the layout dir * style(fmt): rustfmt * fix(tests): add missing parameter to cli action * docs(changelog): new-tab cli layout folder fix * fix(kdl): new-tab keybind looks in layout_dir for layouts (#2200) * fix(themes): missing tokyo-night-dark theme * fix(kdl): new-tab keybind also looks in layout_dir for layouts * docs(changelog): new-tab keybind layout folder fix * fix(cli): edit cwd (#2201) * fix(cli): properly set cwd for edit panes * fix(layouts): properly set cwd for edit panes * style(fmt): rustfmt * docs(changelog0 * fix(layouts): do not relayout twice on auto_layout (#2202) * fix(layouts): do not relayout twice on auto_layout * style(fmt): rustfmt * fix(new-tab): get config parameters from config file (#2203) * fix(cli): take default shell from config if it exists when opening new tab * fix(cli): take layout dir from config when opening new tab if it exists * style(fmt): rustfmt * docs(changelog): new-tab config parameters * fix(grid): only use background pending styling when deleting characters (#2204) * docs(changelog): neovim underline fix * feat(layouts): exact panes constraint (#2206) * style(fmt): remove warnings * fix(swap-layouts): introduce exact panes constraint * fix(swap-layouts): improve floating pane swap layout ux * style(fmt): rustfmt * docs(changelog): exact panes constraint * fix(pty): report no-cwd for empty path returned from sysinfo (#2213) * fix(sixel): report pixel size in winsize change ioctl (#2212) * fix(sixel): report pixel size in winsize change ioctl * style(fmt): rustfmt * docs(changelog): various fixes * style(code): naming * test(log): adjust query tab names test to look at the log message * style(fmt): rustfmt --------- Co-authored-by: Aram Drevekenin <aram@poor.dev> Co-authored-by: Jae-Heon Ji <32578710+jaeheonji@users.noreply.github.com>
Diffstat (limited to 'zellij-server')
-rw-r--r--zellij-server/src/lib.rs10
-rw-r--r--zellij-server/src/route.rs6
-rw-r--r--zellij-server/src/screen.rs15
-rw-r--r--zellij-server/src/tab/mod.rs2
-rw-r--r--zellij-server/src/unit/screen_tests.rs36
-rw-r--r--zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_query_tab_names_action.snap14
6 files changed, 81 insertions, 2 deletions
diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs
index 5dc728fb4..34c807f16 100644
--- a/zellij-server/src/lib.rs
+++ b/zellij-server/src/lib.rs
@@ -77,6 +77,7 @@ pub enum ServerInstruction {
AttachClient(ClientAttributes, Options, ClientId),
ConnStatus(ClientId),
ActiveClients(ClientId),
+ Log(Vec<String>, ClientId),
}
impl From<&ServerInstruction> for ServerContext {
@@ -93,6 +94,7 @@ impl From<&ServerInstruction> for ServerContext {
ServerInstruction::AttachClient(..) => ServerContext::AttachClient,
ServerInstruction::ConnStatus(..) => ServerContext::ConnStatus,
ServerInstruction::ActiveClients(_) => ServerContext::ActiveClients,
+ ServerInstruction::Log(..) => ServerContext::Log,
}
}
}
@@ -623,6 +625,14 @@ pub fn start_server(mut os_input: Box<dyn ServerOsApi>, socket_path: PathBuf) {
session_state
);
},
+ ServerInstruction::Log(lines_to_log, client_id) => {
+ send_to_client!(
+ client_id,
+ os_input,
+ ServerToClientMsg::Log(lines_to_log),
+ session_state
+ );
+ },
}
}
diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs
index 53ccf964d..a4ab8dcf9 100644
--- a/zellij-server/src/route.rs
+++ b/zellij-server/src/route.rs
@@ -659,6 +659,12 @@ pub(crate) fn route_action(
.send_to_screen(ScreenInstruction::NextSwapLayout(client_id))
.with_context(err_context)?;
},
+ Action::QueryTabNames => {
+ session
+ .senders
+ .send_to_screen(ScreenInstruction::QueryTabNames(client_id))
+ .with_context(err_context)?;
+ },
}
Ok(should_break)
}
diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs
index 97acc0fdf..a5b8b8cd0 100644
--- a/zellij-server/src/screen.rs
+++ b/zellij-server/src/screen.rs
@@ -248,6 +248,7 @@ pub enum ScreenInstruction {
ClearPaneFrameColorOverride(Vec<PaneId>),
PreviousSwapLayout(ClientId),
NextSwapLayout(ClientId),
+ QueryTabNames(ClientId),
}
impl From<&ScreenInstruction> for ScreenContext {
@@ -390,6 +391,7 @@ impl From<&ScreenInstruction> for ScreenContext {
},
ScreenInstruction::PreviousSwapLayout(..) => ScreenContext::PreviousSwapLayout,
ScreenInstruction::NextSwapLayout(..) => ScreenContext::NextSwapLayout,
+ ScreenInstruction::QueryTabNames(..) => ScreenContext::QueryTabNames,
}
}
}
@@ -1171,7 +1173,7 @@ impl Screen {
},
c => {
// It only allows printable unicode
- if buf.iter().all(|u| matches!(u, 0x20..=0x7E | 0x80..=0xFF)) {
+ if buf.iter().all(|u| matches!(u, 0x20..=0x7E | 0xA0..=0xFF)) {
active_tab.name.push_str(c);
}
},
@@ -2360,6 +2362,17 @@ pub(crate) fn screen_thread_main(
screen.update_tabs()?;
screen.unblock_input()?;
},
+ ScreenInstruction::QueryTabNames(client_id) => {
+ let tab_names = screen
+ .get_tabs_mut()
+ .values()
+ .map(|tab| tab.name.clone())
+ .collect::<Vec<String>>();
+ screen
+ .bus
+ .senders
+ .send_to_server(ServerInstruction::Log(tab_names, client_id))?;
+ },
}
}
Ok(())
diff --git a/zellij-server/src/tab/mod.rs b/zellij-server/src/tab/mod.rs
index 7cdef9619..d009a3714 100644
--- a/zellij-server/src/tab/mod.rs
+++ b/zellij-server/src/tab/mod.rs
@@ -3082,7 +3082,7 @@ impl Tab {
// It only allows printable unicode, delete and backspace keys.
let is_updatable = buf
.iter()
- .all(|u| matches!(u, 0x20..=0x7E | 0x80..=0xFF | 0x08 | 0x7F));
+ .all(|u| matches!(u, 0x20..=0x7E | 0xA0..=0xFF | 0x08 | 0x7F));
if is_updatable {
let s = str::from_utf8(&buf).with_context(err_context)?;
active_terminal.update_name(s);
diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs
index 8383a2462..3cde1d818 100644
--- a/zellij-server/src/unit/screen_tests.rs
+++ b/zellij-server/src/unit/screen_tests.rs
@@ -2674,3 +2674,39 @@ pub fn send_cli_undo_rename_tab() {
*received_plugin_instructions.lock().unwrap()
))
}
+
+#[test]
+pub fn send_cli_query_tab_names_action() {
+ let size = Size { cols: 80, rows: 10 };
+ let client_id = 10; // fake client id should not appear in the screen's state
+ let mut mock_screen = MockScreen::new(size);
+ mock_screen.new_tab(TiledPaneLayout::default());
+ let session_metadata = mock_screen.clone_session_metadata();
+ let screen_thread = mock_screen.run(Some(TiledPaneLayout::default()));
+ let received_server_instructions = Arc::new(Mutex::new(vec![]));
+ let server_receiver = mock_screen.server_receiver.take().unwrap();
+ let server_thread = log_actions_in_thread!(
+ received_server_instructions,
+ ServerInstruction::KillSession,
+ server_receiver
+ );
+ let query_tab_names = CliAction::QueryTabNames;
+ send_cli_action_to_server(
+ &session_metadata,
+ query_tab_names,
+ &mut mock_screen,
+ client_id,
+ );
+ std::thread::sleep(std::time::Duration::from_millis(100));
+ mock_screen.teardown(vec![server_thread, screen_thread]);
+ let log_tab_names_instruction = received_server_instructions
+ .lock()
+ .unwrap()
+ .iter()
+ .find(|instruction| match instruction {
+ ServerInstruction::Log(..) => true,
+ _ => false,
+ })
+ .cloned();
+ assert_snapshot!(format!("{:#?}", log_tab_names_instruction));
+}
diff --git a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_query_tab_names_action.snap b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_query_tab_names_action.snap
new file mode 100644
index 000000000..bdaf546fe
--- /dev/null
+++ b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_query_tab_names_action.snap
@@ -0,0 +1,14 @@
+---
+source: zellij-server/src/./unit/screen_tests.rs
+assertion_line: 2713
+expression: "format!(\"{:#?}\", log_tab_names_action)"
+---
+Some(
+ Log(
+ [
+ "Tab #1",
+ "Tab #2",
+ ],
+ 10,
+ ),
+)