From 0ecc0eca02aef4ee4122115b92307ca4ad521604 Mon Sep 17 00:00:00 2001 From: Charles Cunningham Date: Thu, 19 Feb 2026 13:33:07 -0800 Subject: [PATCH] fix(tui): accept ctrl-up for queued message edit --- codex-rs/tui/src/chatwidget.rs | 6 ++++-- codex-rs/tui/src/chatwidget/tests.rs | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 9e746b4c57..c1c9525102 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -3100,10 +3100,12 @@ impl ChatWidget { } KeyEvent { code: KeyCode::Up, - modifiers: KeyModifiers::ALT, + modifiers, kind: KeyEventKind::Press, .. - } if !self.queued_user_messages.is_empty() => { + } if modifiers.intersects(KeyModifiers::ALT | KeyModifiers::CONTROL) + && !self.queued_user_messages.is_empty() => + { // Prefer the most recently queued item. if let Some(user_message) = self.queued_user_messages.pop_back() { self.restore_user_message_to_composer(user_message); diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 829c39d0a0..62e958c04c 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -2807,6 +2807,30 @@ async fn alt_up_edits_most_recent_queued_message() { ); } +#[tokio::test] +async fn control_up_edits_most_recent_queued_message() { + let (mut chat, _rx, _op_rx) = make_chatwidget_manual(None).await; + + chat.bottom_pane.set_task_running(true); + chat.queued_user_messages + .push_back(UserMessage::from("first queued".to_string())); + chat.queued_user_messages + .push_back(UserMessage::from("second queued".to_string())); + chat.refresh_queued_user_messages(); + + chat.handle_key_event(KeyEvent::new(KeyCode::Up, KeyModifiers::CONTROL)); + + assert_eq!( + chat.bottom_pane.composer_text(), + "second queued".to_string() + ); + assert_eq!(chat.queued_user_messages.len(), 1); + assert_eq!( + chat.queued_user_messages.front().unwrap().text, + "first queued" + ); +} + /// Pressing Up to recall the most recent history entry and immediately queuing /// it while a task is running should always enqueue the same text, even when it /// is queued repeatedly.