aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/input/keybinds.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2024-11-08 14:34:47 +0100
committerGitHub <noreply@github.com>2024-11-08 14:34:47 +0100
commite8b95402d82d66171d57d723a33a783fc7f7417d (patch)
treee34f3897ece666fc4ab4995011d7196ab0752c72 /zellij-utils/src/input/keybinds.rs
parentdocs(changelog): kitty input fix (diff)
downloadsl0ppij-e8b95402d82d66171d57d723a33a783fc7f7417d.tar.gz
sl0ppij-e8b95402d82d66171d57d723a33a783fc7f7417d.tar.xz
sl0ppij-e8b95402d82d66171d57d723a33a783fc7f7417d.zip
fix(input): refix ctrl-j (#3746)
* fix(input): refix ctrl-j * fix e2e tests
Diffstat (limited to 'zellij-utils/src/input/keybinds.rs')
-rw-r--r--zellij-utils/src/input/keybinds.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/zellij-utils/src/input/keybinds.rs b/zellij-utils/src/input/keybinds.rs
index 99ec0992..3da34e4b 100644
--- a/zellij-utils/src/input/keybinds.rs
+++ b/zellij-utils/src/input/keybinds.rs
@@ -1,7 +1,7 @@
use std::collections::{BTreeMap, HashMap};
use super::actions::Action;
-use crate::data::{InputMode, KeyWithModifier, KeybindsVec};
+use crate::data::{BareKey, InputMode, KeyWithModifier, KeybindsVec};
use serde::{Deserialize, Serialize};
use std::fmt;
@@ -44,8 +44,13 @@ impl Keybinds {
) -> Vec<Action> {
self.0
.get(mode)
- .and_then(|normal_mode_keybindings| normal_mode_keybindings.get(key_with_modifier))
- .cloned()
+ .and_then(|mode_keybindings| {
+ if raw_bytes == &[10] {
+ handle_ctrl_j(&mode_keybindings, &raw_bytes, key_is_kitty_protocol)
+ } else {
+ mode_keybindings.get(key_with_modifier).cloned()
+ }
+ })
.unwrap_or_else(|| {
vec![self.default_action_for_mode(
mode,
@@ -107,6 +112,26 @@ impl Keybinds {
}
}
+// we need to do this because [10] in standard STDIN, [10] is both Enter (without a carriage
+// return) and ctrl-j - so here, if ctrl-j is bound we return its bound action, and otherwise we
+// just write the raw bytes to the terminal and let whichever program is there decide what they are
+fn handle_ctrl_j(
+ mode_keybindings: &HashMap<KeyWithModifier, Vec<Action>>,
+ raw_bytes: &[u8],
+ key_is_kitty_protocol: bool,
+) -> Option<Vec<Action>> {
+ let ctrl_j = KeyWithModifier::new(BareKey::Char('j')).with_ctrl_modifier();
+ if mode_keybindings.get(&ctrl_j).is_some() {
+ mode_keybindings.get(&ctrl_j).cloned()
+ } else {
+ Some(vec![Action::Write(
+ Some(ctrl_j),
+ raw_bytes.to_vec().clone(),
+ key_is_kitty_protocol,
+ )])
+ }
+}
+
// The unit test location.
#[cfg(test)]
#[path = "./unit/keybinds_test.rs"]