From 3cba2ba36e826985c160e58faf556a6b2d17fbcb Mon Sep 17 00:00:00 2001 From: Jiayi Zhao Date: Fri, 31 May 2019 16:13:54 -0400 Subject: add support for specifying certain keycodes for certain keyboard actions --- src/config/config.rs | 4 +- src/config/keymap.rs | 137 +++++++++++++++++++++++++++++++++++++++++++++---- src/config/mimetype.rs | 4 +- src/config/mod.rs | 6 +-- src/config/preview.rs | 4 +- src/config/theme.rs | 4 +- 6 files changed, 138 insertions(+), 21 deletions(-) (limited to 'src/config') diff --git a/src/config/config.rs b/src/config/config.rs index 14b4d67..f093d79 100644 --- a/src/config/config.rs +++ b/src/config/config.rs @@ -1,6 +1,6 @@ use serde_derive::Deserialize; -use super::{parse_config_file, ConfigStructure, Flattenable}; +use super::{parse_to_config_file, ConfigStructure, Flattenable}; use crate::sort; use crate::CONFIG_FILE; @@ -108,7 +108,7 @@ pub struct JoshutoConfig { impl ConfigStructure for JoshutoConfig { fn get_config() -> Self { - parse_config_file::(CONFIG_FILE) + parse_to_config_file::(CONFIG_FILE) .unwrap_or_else(JoshutoConfig::default) } } diff --git a/src/config/keymap.rs b/src/config/keymap.rs index 1befdfe..f5c8eb1 100644 --- a/src/config/keymap.rs +++ b/src/config/keymap.rs @@ -2,7 +2,7 @@ use serde_derive::Deserialize; use std::collections::{hash_map::Entry, HashMap}; use std::process::exit; -use super::{parse_config_file, ConfigStructure, Flattenable}; +use super::{parse_config_file, parse_to_config_file, ConfigStructure, Flattenable}; use crate::commands::{self, CommandKeybind, JoshutoCommand}; use crate::KEYMAP_FILE; @@ -13,6 +13,121 @@ pub const ESCAPE: i32 = 0x1B; /* #define KEY_ALT(x) KEY_F(60) + (x - 'A') */ +const fn default_up() -> i32 { + ncurses::KEY_UP +} + +const fn default_down() -> i32 { + ncurses::KEY_DOWN +} + +const fn default_left() -> i32 { + ncurses::KEY_LEFT +} + +const fn default_right() -> i32 { + ncurses::KEY_RIGHT +} + +const fn default_home() -> i32 { + ncurses::KEY_HOME +} + +const fn default_end() -> i32 { + ncurses::KEY_END +} + +const fn default_backspace() -> i32 { + BACKSPACE +} + +const fn default_delete() -> i32 { + ncurses::KEY_DC +} + +const fn default_enter() -> i32 { + ENTER +} + +const fn default_escape() -> i32 { + ESCAPE +} + +const fn default_tab() -> i32 { + TAB +} + +#[derive(Debug, Deserialize)] +struct JoshutoRawKeymapping { + #[serde(default)] + keymaps: JoshutoKeyMapping, + #[serde(skip)] + mapcommand: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct JoshutoKeyMapping { + #[serde(default = "default_up")] + pub up: i32, + #[serde(default = "default_down")] + pub down: i32, + #[serde(default = "default_left")] + pub left: i32, + #[serde(default = "default_right")] + pub right: i32, + #[serde(default = "default_home")] + pub home: i32, + #[serde(default = "default_end")] + pub end: i32, +/* + #[serde(default = "default_up")] + pub page_up: i32, + #[serde(default = "default_up")] + pub page_down: i32, +*/ + #[serde(default = "default_backspace")] + pub backspace: i32, + #[serde(default = "default_delete")] + pub delete: i32, + #[serde(default = "default_enter")] + pub enter: i32, + #[serde(default = "default_escape")] + pub escape: i32, + #[serde(default = "default_tab")] + pub tab: i32, +} + +impl std::default::Default for JoshutoKeyMapping { + fn default() -> Self { + JoshutoKeyMapping { + up: default_up(), + down: default_down(), + left: default_left(), + right: default_right(), + home: default_home(), + end: default_end(), + backspace: default_backspace(), + delete: default_delete(), + enter: default_enter(), + escape: default_escape(), + tab: default_tab(), + } + } +} + +impl Flattenable for JoshutoRawKeymapping { + fn flatten(self) -> JoshutoKeyMapping { + self.keymaps + } +} + +impl ConfigStructure for JoshutoKeyMapping { + fn get_config() -> Self { + parse_to_config_file::(KEYMAP_FILE) + .unwrap_or_else(JoshutoKeyMapping::default) + } +} + #[derive(Debug, Deserialize)] struct JoshutoMapCommand { pub keys: Vec, @@ -22,14 +137,16 @@ struct JoshutoMapCommand { } #[derive(Debug, Deserialize)] -struct JoshutoRawKeymap { +struct JoshutoRawCommandMapping { + #[serde(skip)] + keymaps: JoshutoKeyMapping, #[serde(default)] mapcommand: Vec, } -impl Flattenable for JoshutoRawKeymap { - fn flatten(self) -> JoshutoKeymap { - let mut keymaps = JoshutoKeymap::new(); +impl Flattenable for JoshutoRawCommandMapping { + fn flatten(self) -> JoshutoCommandMapping { + let mut keymaps = JoshutoCommandMapping::new(); self.mapcommand.iter().for_each(|m| { let args: Vec<&str> = m.args.iter().map(|s| s.as_str()).collect(); match commands::from_args(m.command.as_str(), &args) { @@ -41,16 +158,16 @@ impl Flattenable for JoshutoRawKeymap { } } -pub type JoshutoKeymap = HashMap; +pub type JoshutoCommandMapping = HashMap; -impl ConfigStructure for JoshutoKeymap { +impl ConfigStructure for JoshutoCommandMapping { fn get_config() -> Self { - parse_config_file::(KEYMAP_FILE) - .unwrap_or_else(JoshutoKeymap::default) + parse_to_config_file::(KEYMAP_FILE) + .unwrap_or_else(JoshutoCommandMapping::default) } } -fn insert_keycommand(map: &mut JoshutoKeymap, keycommand: Box, keys: &[i32]) { +fn insert_keycommand(map: &mut JoshutoCommandMapping, keycommand: Box, keys: &[i32]) { match keys.len() { 0 => {} 1 => match map.entry(keys[0]) { diff --git a/src/config/mimetype.rs b/src/config/mimetype.rs index 7e45d8d..eff0540 100644 --- a/src/config/mimetype.rs +++ b/src/config/mimetype.rs @@ -2,7 +2,7 @@ use serde_derive::Deserialize; use std::collections::HashMap; use std::fmt; -use super::{parse_config_file, ConfigStructure, Flattenable}; +use super::{parse_to_config_file, ConfigStructure, Flattenable}; use crate::MIMETYPE_FILE; const fn default_false() -> bool { @@ -92,7 +92,7 @@ impl JoshutoMimetype { impl ConfigStructure for JoshutoMimetype { fn get_config() -> Self { - parse_config_file::(MIMETYPE_FILE) + parse_to_config_file::(MIMETYPE_FILE) .unwrap_or_else(JoshutoMimetype::default) } } diff --git a/src/config/mod.rs b/src/config/mod.rs index 822af58..db15753 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -5,7 +5,7 @@ pub mod preview; pub mod theme; pub use self::config::JoshutoConfig; -pub use self::keymap::JoshutoKeymap; +pub use self::keymap::{JoshutoCommandMapping, JoshutoKeyMapping}; pub use self::mimetype::JoshutoMimetype; pub use self::preview::{JoshutoPreview, JoshutoPreviewEntry}; pub use self::theme::{JoshutoColorTheme, JoshutoTheme}; @@ -40,7 +40,7 @@ where } // parses a config file into its appropriate format -fn parse_config_file(filename: &str) -> Option +fn parse_to_config_file(filename: &str) -> Option where T: DeserializeOwned + Flattenable, { @@ -63,7 +63,7 @@ where } // parses a config file into its appropriate format -fn parse_config(filename: &str) -> Option +fn parse_config_file(filename: &str) -> Option where T: DeserializeOwned, { diff --git a/src/config/preview.rs b/src/config/preview.rs index aad3613..e966e4e 100644 --- a/src/config/preview.rs +++ b/src/config/preview.rs @@ -1,7 +1,7 @@ use serde_derive::Deserialize; use std::collections::HashMap; -use super::{parse_config_file, ConfigStructure, Flattenable}; +use super::{parse_to_config_file, ConfigStructure, Flattenable}; use crate::PREVIEW_FILE; #[derive(Debug, Deserialize)] @@ -45,7 +45,7 @@ pub struct JoshutoPreview { impl ConfigStructure for JoshutoPreview { fn get_config() -> Self { - parse_config_file::(PREVIEW_FILE) + parse_to_config_file::(PREVIEW_FILE) .unwrap_or_else(JoshutoPreview::default) } } diff --git a/src/config/theme.rs b/src/config/theme.rs index ab88d6f..ef5e9ba 100644 --- a/src/config/theme.rs +++ b/src/config/theme.rs @@ -1,7 +1,7 @@ use serde_derive::Deserialize; use std::collections::HashMap; -use super::{parse_config, ConfigStructure}; +use super::{parse_config_file, ConfigStructure}; const fn default_zero() -> i16 { 0 @@ -82,7 +82,7 @@ pub struct JoshutoTheme { impl ConfigStructure for JoshutoTheme { fn get_config() -> Self { - parse_config::(crate::THEME_FILE).unwrap_or_else(JoshutoTheme::default) + parse_config_file::(crate::THEME_FILE).unwrap_or_else(JoshutoTheme::default) } } -- cgit v1.2.3