aboutsummaryrefslogtreecommitdiff
path: root/src/app/input
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-20 22:03:49 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-20 22:08:26 +0300
commitdf357b250c0fcf4edf2681d4f114e199afb51899 (patch)
treeeba744d9238057e8758e2098670e0561d920d998 /src/app/input
parentc584037c77c63f6a08f8837f357c89432b8043e7 (diff)
fix: clarify keybinding conflict warnings
refs #154
Diffstat (limited to 'src/app/input')
-rw-r--r--src/app/input/modal.rs38
-rw-r--r--src/app/input/navigate.rs12
-rw-r--r--src/app/input/sidebar.rs8
3 files changed, 37 insertions, 21 deletions
diff --git a/src/app/input/modal.rs b/src/app/input/modal.rs
index 5b585221..084f44a9 100644
--- a/src/app/input/modal.rs
+++ b/src/app/input/modal.rs
@@ -67,7 +67,7 @@ pub(super) fn modal_action_from_buttons<A: Copy>(
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum GlobalMenuAction {
- Quit,
+ Detach,
WhatsNew,
Keybinds,
ReloadConfig,
@@ -83,7 +83,7 @@ pub(super) fn global_menu_actions(state: &AppState) -> Vec<GlobalMenuAction> {
if state.update_available.is_some() || state.latest_release_notes_available {
actions.push(GlobalMenuAction::WhatsNew);
}
- actions.push(GlobalMenuAction::Quit);
+ actions.push(GlobalMenuAction::Detach);
actions
}
@@ -111,19 +111,19 @@ fn open_update_release_notes(state: &mut AppState) {
state.mode = Mode::ReleaseNotes;
}
-pub(super) fn request_quit_or_detach(state: &mut AppState) {
- if state.quit_detaches {
- state.detach_requested = true;
- } else {
+pub(super) fn request_detach(state: &mut AppState) {
+ if state.detach_exits {
state.should_quit = true;
+ } else {
+ state.detach_requested = true;
}
}
pub(super) fn apply_global_menu_action(state: &mut AppState, action: GlobalMenuAction) {
match action {
- GlobalMenuAction::Quit => {
+ GlobalMenuAction::Detach => {
leave_modal(state);
- request_quit_or_detach(state);
+ request_detach(state);
}
GlobalMenuAction::WhatsNew => open_update_release_notes(state),
GlobalMenuAction::Keybinds => open_keybind_help(state),
@@ -690,6 +690,28 @@ mod tests {
}
#[test]
+ fn detach_requests_client_detach_in_persistence_mode() {
+ let mut state = state_with_workspaces(&["test"]);
+ state.detach_exits = false;
+
+ request_detach(&mut state);
+
+ assert!(state.detach_requested);
+ assert!(!state.should_quit);
+ }
+
+ #[test]
+ fn detach_exits_in_no_session_mode() {
+ let mut state = state_with_workspaces(&["test"]);
+ state.detach_exits = true;
+
+ request_detach(&mut state);
+
+ assert!(state.should_quit);
+ assert!(!state.detach_requested);
+ }
+
+ #[test]
fn global_menu_whats_new_opens_saved_release_notes() {
let _guard = config_env_lock().lock().unwrap();
let path = temp_config_path("whats-new-saved-release-notes");
diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs
index 8bf10832..17180fed 100644
--- a/src/app/input/navigate.rs
+++ b/src/app/input/navigate.rs
@@ -479,7 +479,6 @@ pub(crate) enum NavigateAction {
CyclePanePrevious,
Help,
Settings,
- Quit,
ReloadConfig,
OpenNotificationTarget,
Detach,
@@ -545,7 +544,6 @@ fn action_for_key(
for (bindings, action) in [
(&kb.help, NavigateAction::Help),
(&kb.settings, NavigateAction::Settings),
- (&kb.quit, NavigateAction::Quit),
(&kb.workspace_picker, NavigateAction::WorkspacePicker),
(&kb.new_workspace, NavigateAction::NewWorkspace),
(&kb.rename_workspace, NavigateAction::RenameWorkspace),
@@ -727,10 +725,6 @@ pub(super) fn execute_navigate_action_in_context(
}
NavigateAction::Help => super::modal::open_keybind_help(state),
NavigateAction::Settings => super::settings::open_settings(state),
- NavigateAction::Quit => {
- super::modal::request_quit_or_detach(state);
- leave_navigate_mode(state);
- }
NavigateAction::ReloadConfig => {
state.request_reload_config = true;
leave_navigate_mode(state);
@@ -742,7 +736,7 @@ pub(super) fn execute_navigate_action_in_context(
}
}
NavigateAction::Detach => {
- state.detach_requested = true;
+ super::modal::request_detach(state);
leave_navigate_mode(state);
}
}
@@ -1449,9 +1443,9 @@ mod tests {
}
#[test]
- fn persistence_mode_navigate_q_detaches_instead_of_quitting_server() {
+ fn navigate_q_detaches_in_persistence_mode() {
let mut state = crate::app::state::AppState::test_new();
- state.quit_detaches = true;
+ state.detach_exits = false;
handle_navigate_key(
&mut state,
diff --git a/src/app/input/sidebar.rs b/src/app/input/sidebar.rs
index 7491c9c1..dc192e50 100644
--- a/src/app/input/sidebar.rs
+++ b/src/app/input/sidebar.rs
@@ -192,7 +192,7 @@ impl AppState {
} else if self.latest_release_notes_available {
labels.push("what's new");
}
- labels.push(if self.quit_detaches { "detach" } else { "quit" });
+ labels.push("detach");
labels
}
@@ -578,7 +578,7 @@ mod tests {
"keybinds",
"reload config",
"update ready",
- "quit"
+ "detach"
]
);
assert!(!app.state.should_quit);
@@ -587,7 +587,7 @@ mod tests {
#[test]
fn persistence_mode_menu_surfaces_detach_action() {
let mut app = app_for_mouse_test();
- app.state.quit_detaches = true;
+ app.state.detach_exits = false;
let launcher = app.state.global_launcher_rect();
app.handle_mouse(mouse(
@@ -625,7 +625,7 @@ mod tests {
"keybinds",
"reload config",
"what's new",
- "quit"
+ "detach"
]
);
}