Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(keybindings): support multiple modifiers (eg. Ctrl+Alt) and the kitty keyboard protocol #3383

Merged
merged 15 commits into from
May 27, 2024
Prev Previous commit
Next Next commit
style(fmt): rustfmt
  • Loading branch information
imsnif committed May 27, 2024
commit 295bf541156108850bcc9cf36c1dde10be661a64
8 changes: 6 additions & 2 deletions default-plugins/fixture-plugin-for-tests/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,9 @@ impl ZellijPlugin for State {
BareKey::Char('6') if key.has_no_modifiers() => close_focused_tab(),
BareKey::Char('7') if key.has_no_modifiers() => undo_rename_tab(),
BareKey::Char('8') if key.has_no_modifiers() => quit_zellij(),
BareKey::Char('a') if key.has_modifiers(&[KeyModifier::Ctrl]) => previous_swap_layout(),
BareKey::Char('a') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
previous_swap_layout()
},
BareKey::Char('b') if key.has_modifiers(&[KeyModifier::Ctrl]) => next_swap_layout(),
BareKey::Char('c') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
let tab_name = "my tab name";
Expand Down Expand Up @@ -295,7 +297,9 @@ impl ZellijPlugin for State {
BareKey::Char('5') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
switch_session(Some("my_new_session"));
},
BareKey::Char('6') if key.has_modifiers(&[KeyModifier::Ctrl]) => disconnect_other_clients(),
BareKey::Char('6') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
disconnect_other_clients()
},
BareKey::Char('7') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
switch_session_with_layout(
Some("my_other_new_session"),
Expand Down
66 changes: 34 additions & 32 deletions default-plugins/session-manager/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ impl State {
.with_args(args),
);
should_render = true;
}
},
BareKey::Char('c') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
self.new_session_info.new_session_folder = None;
should_render = true;
Expand All @@ -247,7 +247,7 @@ impl State {
self.new_session_info.handle_key(key);
should_render = true;
},
_ => {}
_ => {},
}
should_render
}
Expand All @@ -264,35 +264,35 @@ impl State {
.update_search_term(&self.search_term, &self.colors);
self.show_kill_all_sessions_warning = false;
should_render = true;
}
},
BareKey::Char('n') | BareKey::Esc if key.has_no_modifiers() => {
self.show_kill_all_sessions_warning = false;
should_render = true;
}
},
BareKey::Char('c') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
self.show_kill_all_sessions_warning = false;
should_render = true;
}
_ => {}
},
_ => {},
}
} else {
match key.bare_key {
BareKey::Right if key.has_no_modifiers() => {
self.sessions.result_expand();
should_render = true;
}
},
BareKey::Left if key.has_no_modifiers() => {
self.sessions.result_shrink();
should_render = true;
}
},
BareKey::Down if key.has_no_modifiers() => {
self.sessions.move_selection_down();
should_render = true;
}
},
BareKey::Up if key.has_no_modifiers() => {
self.sessions.move_selection_up();
should_render = true;
}
},
BareKey::Char(character) if key.has_no_modifiers() => {
if character == '\n' {
self.handle_selection();
Expand All @@ -304,7 +304,7 @@ impl State {
.update_search_term(&self.search_term, &self.colors);
}
should_render = true;
}
},
BareKey::Backspace if key.has_no_modifiers() => {
if let Some(new_session_name) = self.renaming_session_name.as_mut() {
if new_session_name.is_empty() {
Expand All @@ -318,15 +318,15 @@ impl State {
.update_search_term(&self.search_term, &self.colors);
}
should_render = true;
}
},
BareKey::Char('w') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
self.active_screen = ActiveScreen::NewSession;
should_render = true;
}
},
BareKey::Char('r') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
self.renaming_session_name = Some(String::new());
should_render = true;
}
},
BareKey::Delete if key.has_no_modifiers() => {
if let Some(selected_session_name) = self.sessions.get_selected_session_name() {
kill_sessions(&[selected_session_name]);
Expand All @@ -338,7 +338,7 @@ impl State {
self.show_error("Must select session before killing it.");
}
should_render = true;
}
},
BareKey::Char('d') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
let all_other_sessions = self.sessions.all_other_sessions();
if all_other_sessions.is_empty() {
Expand All @@ -347,8 +347,10 @@ impl State {
self.show_kill_all_sessions_warning = true;
}
should_render = true;
}
BareKey::Char('x') if key.has_modifiers(&[KeyModifier::Ctrl]) => disconnect_other_clients(),
},
BareKey::Char('x') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
disconnect_other_clients()
},
BareKey::Char('c') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
if !self.search_term.is_empty() {
self.search_term.clear();
Expand All @@ -360,70 +362,70 @@ impl State {
hide_self();
}
should_render = true;
}
},
BareKey::Tab if key.has_no_modifiers() => {
self.toggle_active_screen();
should_render = true;
}
},
BareKey::Esc if key.has_no_modifiers() => {
if self.renaming_session_name.is_some() {
self.renaming_session_name = None;
should_render = true;
} else if !self.is_welcome_screen {
hide_self();
}
}
_ => {}
},
_ => {},
}
}
should_render
}
fn handle_resurrect_session_key(&mut self, key: KeyWithModifier) -> bool {
let mut should_render = false;
match key.bare_key {
BareKey::Down if key.has_no_modifiers() => {
BareKey::Down if key.has_no_modifiers() => {
self.resurrectable_sessions.move_selection_down();
should_render = true;
}
},
BareKey::Up if key.has_no_modifiers() => {
self.resurrectable_sessions.move_selection_up();
should_render = true;
}
},
BareKey::Char(character) if key.has_no_modifiers() => {
if character == '\n' {
self.handle_selection();
} else {
self.resurrectable_sessions.handle_character(character);
}
should_render = true;
}
},
BareKey::Backspace if key.has_no_modifiers() => {
self.resurrectable_sessions.handle_backspace();
should_render = true;
}
},
BareKey::Char('w') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
self.active_screen = ActiveScreen::NewSession;
should_render = true;
}
},
BareKey::Tab if key.has_no_modifiers() => {
self.toggle_active_screen();
should_render = true;
}
},
BareKey::Delete if key.has_no_modifiers() => {
self.resurrectable_sessions.delete_selected_session();
should_render = true;
}
},
BareKey::Char('d') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
self.resurrectable_sessions
.show_delete_all_sessions_warning();
should_render = true;
}
},
BareKey::Esc if key.has_no_modifiers() => {
if !self.is_welcome_screen {
hide_self();
}
}
_ => {}
},
_ => {},
}
should_render
}
Expand Down
2 changes: 1 addition & 1 deletion default-plugins/session-manager/src/new_session_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ impl NewSessionInfo {
},
BareKey::Char('c') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
self.handle_break();
}
},
BareKey::Esc if key.has_no_modifiers() => {
self.handle_break();
},
Expand Down
Loading