diff options
author | Thomas Linford <tlinford@users.noreply.github.com> | 2022-10-31 17:04:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-31 17:04:38 +0100 |
commit | 855711ebb8ab2a726b27880c1f1d64414bf3ddba (patch) | |
tree | 4a4e583ec0fbf41784d851d4c721fd019ac3c4a8 /zellij-client | |
parent | 5c2f5f84708fa6fe7076189f262b6ec62a29363a (diff) |
feat(mouse): allow toggling mouse mode at runtime (#1883)
Diffstat (limited to 'zellij-client')
-rw-r--r-- | zellij-client/src/input_handler.rs | 16 | ||||
-rw-r--r-- | zellij-client/src/lib.rs | 5 | ||||
-rw-r--r-- | zellij-client/src/os_input_output.rs | 31 | ||||
-rw-r--r-- | zellij-client/src/unit/stdin_tests.rs | 9 |
4 files changed, 43 insertions, 18 deletions
diff --git a/zellij-client/src/input_handler.rs b/zellij-client/src/input_handler.rs index a4c4988c9..03cb57dc5 100644 --- a/zellij-client/src/input_handler.rs +++ b/zellij-client/src/input_handler.rs @@ -6,7 +6,7 @@ use crate::{ use zellij_utils::{ channels::{Receiver, SenderWithContext, OPENCALLS}, data::{InputMode, Key}, - errors::{ContextType, ErrorContext}, + errors::{ContextType, ErrorContext, FatalError}, input::{ actions::Action, cast_termwiz_key, @@ -44,6 +44,7 @@ struct InputHandler { should_exit: bool, receive_input_instructions: Receiver<(InputInstruction, ErrorContext)>, holding_mouse: Option<HeldMouseButton>, + mouse_mode_active: bool, } impl InputHandler { @@ -67,6 +68,7 @@ impl InputHandler { should_exit: false, receive_input_instructions, holding_mouse: None, + mouse_mode_active: false, } } @@ -78,7 +80,8 @@ impl InputHandler { let bracketed_paste_start = vec![27, 91, 50, 48, 48, 126]; // \u{1b}[200~ let bracketed_paste_end = vec![27, 91, 50, 48, 49, 126]; // \u{1b}[201~ if self.options.mouse_mode.unwrap_or(true) { - self.os_input.enable_mouse(); + self.os_input.enable_mouse().non_fatal(); + self.mouse_mode_active = true; } loop { if self.should_exit { @@ -284,6 +287,15 @@ impl InputHandler { self.command_is_executing .wait_until_input_thread_is_unblocked(); }, + Action::ToggleMouseMode => { + if self.mouse_mode_active { + self.os_input.disable_mouse().non_fatal(); + self.mouse_mode_active = false; + } else { + self.os_input.enable_mouse().non_fatal(); + self.mouse_mode_active = true; + } + }, _ => self .os_input .send_to_server(ClientToServerMsg::Action(action, client_id)), diff --git a/zellij-client/src/lib.rs b/zellij-client/src/lib.rs index c48fd5575..bc9355ceb 100644 --- a/zellij-client/src/lib.rs +++ b/zellij-client/src/lib.rs @@ -14,6 +14,7 @@ use std::path::Path; use std::process::Command; use std::sync::{Arc, Mutex}; use std::thread; +use zellij_utils::errors::FatalError; use crate::stdin_ansi_parser::{AnsiStdinInstruction, StdinAnsiParser}; use crate::{ @@ -324,7 +325,7 @@ pub fn start_client( os_input.unset_raw_mode(0).unwrap(); let goto_start_of_last_line = format!("\u{1b}[{};{}H", full_screen_ws.rows, 1); let restore_snapshot = "\u{1b}[?1049l"; - os_input.disable_mouse(); + os_input.disable_mouse().non_fatal(); let error = format!( "{}\n{}{}\n", restore_snapshot, goto_start_of_last_line, backtrace @@ -389,7 +390,7 @@ pub fn start_client( goto_start_of_last_line, restore_snapshot, reset_style, show_cursor, exit_msg ); - os_input.disable_mouse(); + os_input.disable_mouse().non_fatal(); info!("{}", exit_msg); os_input.unset_raw_mode(0).unwrap(); let mut stdout = os_input.get_stdout_writer(); diff --git a/zellij-client/src/os_input_output.rs b/zellij-client/src/os_input_output.rs index 1caf78721..8004b8ad2 100644 --- a/zellij-client/src/os_input_output.rs +++ b/zellij-client/src/os_input_output.rs @@ -1,3 +1,4 @@ +use zellij_utils::anyhow::{Context, Result}; use zellij_utils::pane_size::Size; use zellij_utils::{interprocess, libc, nix, signal_hook}; @@ -106,8 +107,8 @@ pub trait ClientOsApi: Send + Sync { /// Establish a connection with the server socket. fn connect_to_server(&self, path: &Path); fn load_palette(&self) -> Palette; - fn enable_mouse(&self); - fn disable_mouse(&self); + fn enable_mouse(&self) -> Result<()>; + fn disable_mouse(&self) -> Result<()>; // Repeatedly send action, until stdin is readable again fn stdin_poller(&self) -> StdinPoller; } @@ -215,18 +216,24 @@ impl ClientOsApi for ClientOsInputOutput { // }; default_palette() } - fn enable_mouse(&self) { - let _ = self - .get_stdout_writer() - .write(ENABLE_MOUSE_SUPPORT.as_bytes()) - .unwrap(); + fn enable_mouse(&self) -> Result<()> { + let err_context = "failed to enable mouse mode"; + let mut stdout = self.get_stdout_writer(); + stdout + .write_all(ENABLE_MOUSE_SUPPORT.as_bytes()) + .context(err_context)?; + stdout.flush().context(err_context)?; + Ok(()) } - fn disable_mouse(&self) { - let _ = self - .get_stdout_writer() - .write(DISABLE_MOUSE_SUPPORT.as_bytes()) - .unwrap(); + fn disable_mouse(&self) -> Result<()> { + let err_context = "failed to enable mouse mode"; + let mut stdout = self.get_stdout_writer(); + stdout + .write_all(DISABLE_MOUSE_SUPPORT.as_bytes()) + .context(err_context)?; + stdout.flush().context(err_context)?; + Ok(()) } fn stdin_poller(&self) -> StdinPoller { diff --git a/zellij-client/src/unit/stdin_tests.rs b/zellij-client/src/unit/stdin_tests.rs index d51734acf..aa1bd59ce 100644 --- a/zellij-client/src/unit/stdin_tests.rs +++ b/zellij-client/src/unit/stdin_tests.rs @@ -1,6 +1,7 @@ use super::input_loop; use crate::stdin_ansi_parser::StdinAnsiParser; use crate::stdin_loop; +use zellij_utils::anyhow::Result; use zellij_utils::data::{InputMode, Palette}; use zellij_utils::input::actions::{Action, Direction}; use zellij_utils::input::config::Config; @@ -181,8 +182,12 @@ impl ClientOsApi for FakeClientOsApi { fn load_palette(&self) -> Palette { unimplemented!() } - fn enable_mouse(&self) {} - fn disable_mouse(&self) {} + fn enable_mouse(&self) -> Result<()> { + Ok(()) + } + fn disable_mouse(&self) -> Result<()> { + Ok(()) + } fn stdin_poller(&self) -> StdinPoller { unimplemented!() } |