From 1b67d19b35b8d77d012e11a4daac6f79de5f6176 Mon Sep 17 00:00:00 2001 From: Benalleng Date: Wed, 1 Apr 2026 11:20:02 -0400 Subject: [PATCH 1/2] Add mode to disable mouse inputs I did not expect mouse inputs to be accepted in the tui and when I clicked the window to switch focus it immediately played a new song. I think it would be nice to have a mode where mouse inputs are not accepted. --- src/core/app.rs | 11 +++++++++++ src/core/user_config.rs | 8 ++++++++ src/main.rs | 8 ++++++-- src/tui/ui/search.rs | 17 +++++++++++------ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/core/app.rs b/src/core/app.rs index 81ab4288..1a539fcf 100644 --- a/src/core/app.rs +++ b/src/core/app.rs @@ -2937,6 +2937,12 @@ impl App { description: "Force search bar to take full width".to_string(), value: SettingValue::Bool(self.user_config.behavior.enforce_wide_search_bar), }, + SettingItem { + id: "behavior.disable_mouse_inputs".to_string(), + name: "Disable Mouse Inputs".to_string(), + description: "Disable mouse inputs for keyboard-only navigation".to_string(), + value: SettingValue::Bool(self.user_config.behavior.disable_mouse_inputs), + }, SettingItem { id: "behavior.set_window_title".to_string(), name: "Set Window Title".to_string(), @@ -3352,6 +3358,11 @@ impl App { self.user_config.behavior.enforce_wide_search_bar = *v; } } + "behavior.disable_mouse_inputs" => { + if let SettingValue::Bool(v) = &setting.value { + self.user_config.behavior.disable_mouse_inputs = *v; + } + } "behavior.set_window_title" => { if let SettingValue::Bool(v) = &setting.value { self.user_config.behavior.set_window_title = *v; diff --git a/src/core/user_config.rs b/src/core/user_config.rs index d8b5998f..78e7fd19 100644 --- a/src/core/user_config.rs +++ b/src/core/user_config.rs @@ -638,6 +638,7 @@ pub struct BehaviorConfigString { pub show_loading_indicator: Option, pub enforce_wide_search_bar: Option, pub enable_global_song_count: Option, + pub disable_mouse_inputs: Option, pub enable_discord_rpc: Option, pub discord_rpc_client_id: Option, pub enable_announcements: Option, @@ -677,6 +678,7 @@ pub struct BehaviorConfig { pub show_loading_indicator: bool, pub enforce_wide_search_bar: bool, pub enable_global_song_count: bool, + pub disable_mouse_inputs: bool, pub enable_discord_rpc: bool, pub discord_rpc_client_id: Option, pub enable_announcements: bool, @@ -786,6 +788,7 @@ impl UserConfig { show_loading_indicator: true, enforce_wide_search_bar: false, enable_global_song_count: true, + disable_mouse_inputs: false, enable_discord_rpc: true, discord_rpc_client_id: None, enable_announcements: true, @@ -989,6 +992,10 @@ impl UserConfig { self.behavior.enable_global_song_count = enable_global_song_count; } + if let Some(disable_mouse_inputs) = behavior_config.disable_mouse_inputs { + self.behavior.disable_mouse_inputs = disable_mouse_inputs; + } + if let Some(enable_discord_rpc) = behavior_config.enable_discord_rpc { self.behavior.enable_discord_rpc = enable_discord_rpc; } @@ -1133,6 +1140,7 @@ impl UserConfig { show_loading_indicator: Some(self.behavior.show_loading_indicator), enforce_wide_search_bar: Some(self.behavior.enforce_wide_search_bar), enable_global_song_count: Some(self.behavior.enable_global_song_count), + disable_mouse_inputs: Some(self.behavior.disable_mouse_inputs), enable_discord_rpc: Some(self.behavior.enable_discord_rpc), discord_rpc_client_id: self.behavior.discord_rpc_client_id.clone(), enable_announcements: Some(self.behavior.enable_announcements), diff --git a/src/main.rs b/src/main.rs index 1ee8ff6a..96c98d0d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2649,7 +2649,9 @@ async fn start_ui( } event::Event::Mouse(mouse) => { let mut app = app.lock().await; - handlers::mouse_handler(mouse, &mut app); + if !app.user_config.behavior.disable_mouse_inputs { + handlers::mouse_handler(mouse, &mut app); + } } event::Event::Tick => { let mut app = app.lock().await; @@ -2955,7 +2957,9 @@ async fn start_ui( } event::Event::Mouse(mouse) => { let mut app = app.lock().await; - handlers::mouse_handler(mouse, &mut app); + if !app.user_config.behavior.disable_mouse_inputs { + handlers::mouse_handler(mouse, &mut app); + } } event::Event::Tick => { // Tick the main run loop so macOS delivers media key events. diff --git a/src/tui/ui/search.rs b/src/tui/ui/search.rs index ebc1680a..33df52d4 100644 --- a/src/tui/ui/search.rs +++ b/src/tui/ui/search.rs @@ -112,23 +112,28 @@ pub fn draw_input_and_help_box(f: &mut Frame<'_>, app: &App, layout_chunk: Rect) ); f.render_widget(help, help_area); - let settings_content = if compact_top_row { - ("Settings", "Open") + let settings_hint = if app.user_config.behavior.disable_mouse_inputs { + app + .effective_open_settings_key() + .to_string() + .trim_matches(|c| c == '<' || c == '>') + .to_string() + } else if compact_top_row { + "Open".to_string() } else { - ("Settings", "Click") + "Click".to_string() }; - let settings_color = app.user_config.theme.inactive; let settings_block = Block::default() .title(Span::styled( - settings_content.0, + "Settings", Style::default().fg(settings_color), )) .borders(Borders::ALL) .border_type(BorderType::Rounded) .border_style(Style::default().fg(settings_color)); - let settings = Paragraph::new(settings_content.1) + let settings = Paragraph::new(settings_hint.as_str()) .block(settings_block) .style( Style::default() From 32afc0733897bdac95b7bdffc64a14183f92eacf Mon Sep 17 00:00:00 2001 From: Benalleng Date: Wed, 1 Apr 2026 12:05:12 -0400 Subject: [PATCH 2/2] Try to simplify settings UI blocks --- src/tui/ui/search.rs | 50 +++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/tui/ui/search.rs b/src/tui/ui/search.rs index 33df52d4..fc2f11ce 100644 --- a/src/tui/ui/search.rs +++ b/src/tui/ui/search.rs @@ -16,8 +16,8 @@ use super::util::{ }; const COMPACT_TOP_ROW_THRESHOLD: u16 = 60; -const COMPACT_HELP_WIDTH: u16 = 8; -const COMPACT_SETTINGS_WIDTH: u16 = 12; +const COMPACT_HELP_WIDTH: u16 = 6; +const COMPACT_SETTINGS_WIDTH: u16 = 10; pub fn draw_input_and_help_box(f: &mut Frame<'_>, app: &App, layout_chunk: Rect) { let compact_top_row = layout_chunk.width < COMPACT_TOP_ROW_THRESHOLD; @@ -40,8 +40,8 @@ pub fn draw_input_and_help_box(f: &mut Frame<'_>, app: &App, layout_chunk: Rect) } else { [ Constraint::Percentage(80), - Constraint::Percentage(10), - Constraint::Percentage(10), + Constraint::Percentage(8), + Constraint::Percentage(12), ] }; @@ -88,23 +88,20 @@ pub fn draw_input_and_help_box(f: &mut Frame<'_>, app: &App, layout_chunk: Rect) f.render_widget(input, input_area); let help_content = if show_loading { - (app.user_config.theme.hint, "Help", "...") + (app.user_config.theme.hint, "...") } else if compact_top_row { - (app.user_config.theme.inactive, "Help", "?") + (app.user_config.theme.inactive, "?") } else { - (app.user_config.theme.inactive, "Help", "Type ?") + (app.user_config.theme.inactive, "Type ?") }; let block = Block::default() - .title(Span::styled( - help_content.1, - Style::default().fg(help_content.0), - )) + .title(Span::styled("Help", Style::default().fg(help_content.0))) .borders(Borders::ALL) .border_type(BorderType::Rounded) .border_style(Style::default().fg(help_content.0)); - let lines = Text::from(help_content.2); + let lines = Text::from(help_content.1); let help = Paragraph::new(lines).block(block).style( Style::default() .fg(help_content.0) @@ -112,16 +109,15 @@ pub fn draw_input_and_help_box(f: &mut Frame<'_>, app: &App, layout_chunk: Rect) ); f.render_widget(help, help_area); - let settings_hint = if app.user_config.behavior.disable_mouse_inputs { - app - .effective_open_settings_key() - .to_string() - .trim_matches(|c| c == '<' || c == '>') - .to_string() - } else if compact_top_row { - "Open".to_string() + let settings_keybind_string = app + .effective_open_settings_key() + .to_string() + .trim_matches(|c| c == '<' || c == '>') + .to_string(); + let settings_hint = if compact_top_row { + settings_keybind_string } else { - "Click".to_string() + format!("Type {}", settings_keybind_string) }; let settings_color = app.user_config.theme.inactive; let settings_block = Block::default() @@ -133,13 +129,11 @@ pub fn draw_input_and_help_box(f: &mut Frame<'_>, app: &App, layout_chunk: Rect) .border_type(BorderType::Rounded) .border_style(Style::default().fg(settings_color)); - let settings = Paragraph::new(settings_hint.as_str()) - .block(settings_block) - .style( - Style::default() - .fg(settings_color) - .bg(app.user_config.theme.background), - ); + let settings = Paragraph::new(settings_hint).block(settings_block).style( + Style::default() + .fg(settings_color) + .bg(app.user_config.theme.background), + ); f.render_widget(settings, settings_area); }