From 9672b9949c1390192f1d049c8fc2f3b9afd90887 Mon Sep 17 00:00:00 2001 From: Priec Date: Fri, 12 Sep 2025 19:14:21 +0200 Subject: [PATCH] finally a working space --- client/config.toml | 2 +- client/src/ui/handlers/ui.rs | 59 +++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/client/config.toml b/client/config.toml index b51ce0d..764dd4b 100644 --- a/client/config.toml +++ b/client/config.toml @@ -50,7 +50,7 @@ move_down = ["j", "Down"] move_line_end = ["$"] move_word_next = ["w"] next_field = ["Tab"] -# move_word_prev = ["b"] +move_word_prev = ["b"] move_word_end = ["e"] move_last_line = ["shift+g"] move_word_end_prev = ["ge"] diff --git a/client/src/ui/handlers/ui.rs b/client/src/ui/handlers/ui.rs index 3fb273b..99c115d 100644 --- a/client/src/ui/handlers/ui.rs +++ b/client/src/ui/handlers/ui.rs @@ -26,6 +26,7 @@ use crate::buffer::state::AppView; use crate::state::app::state::AppState; use crate::tui::terminal::{EventReader, TerminalCore}; use crate::ui::handlers::render::render_ui; +use crate::input::leader::leader_has_any_start; use crate::pages::login; use crate::pages::register; use crate::pages::login::LoginResult; @@ -237,24 +238,46 @@ pub async fn run_ui() -> Result<()> { }; if inside_canvas { - if let Page::Form(path) = &router.current { - if let Some(editor) = app_state.editor_for_path(path) { - match editor.handle_key_event(*key_event) { - KeyEventOutcome::Consumed(Some(msg)) => { - event_handler.command_message = msg; - needs_redraw = true; - continue; - } - KeyEventOutcome::Consumed(None) => { - needs_redraw = true; - continue; - } - KeyEventOutcome::Pending => { - needs_redraw = true; - continue; - } - KeyEventOutcome::NotMatched => { - // fall through to client-level handling + // Do NOT forward to canvas while a leader is active or about to start. + // This prevents the canvas from stealing the second/third key (b/d/r). + let leader_in_progress = event_handler.input_engine.has_active_sequence(); + let is_space = matches!(key_event.code, crossterm_event::KeyCode::Char(' ')); + let can_start_leader = leader_has_any_start(&config); + let form_in_edit_mode = match &router.current { + Page::Form(path) => app_state + .editor_for_path_ref(path) + .map(|e| e.mode() == canvas::AppMode::Edit) + .unwrap_or(false), + _ => false, + }; + + let defer_to_engine_for_leader = leader_in_progress + || (is_space && can_start_leader && !form_in_edit_mode); + + if defer_to_engine_for_leader { + info!( + "Skipping canvas pre-handle: leader sequence active or starting" + ); + } else { + if let Page::Form(path) = &router.current { + if let Some(editor) = app_state.editor_for_path(path) { + match editor.handle_key_event(*key_event) { + KeyEventOutcome::Consumed(Some(msg)) => { + event_handler.command_message = msg; + needs_redraw = true; + continue; + } + KeyEventOutcome::Consumed(None) => { + needs_redraw = true; + continue; + } + KeyEventOutcome::Pending => { + needs_redraw = true; + continue; + } + KeyEventOutcome::NotMatched => { + // fall through to client-level handling + } } } }