Input key map
This commit is contained in:
parent
dc1539d0d3
commit
3c45aff96e
33
build.rs
33
build.rs
@ -15,8 +15,39 @@ fn main() {
|
|||||||
|
|
||||||
write!(&mut file, "static KEYVAL_MAP: phf::Map<&'static str, &'static str> = ").unwrap();
|
write!(&mut file, "static KEYVAL_MAP: phf::Map<&'static str, &'static str> = ").unwrap();
|
||||||
phf_codegen::Map::new()
|
phf_codegen::Map::new()
|
||||||
.entry("Enter", "\"CR\"")
|
.entry("slash", "\"/\"")
|
||||||
|
.entry("backslash", "\"\\\\\"")
|
||||||
|
.entry("dead_circumflex", "\"^\"")
|
||||||
|
.entry("at", "\"@\"")
|
||||||
|
.entry("numbersign", "\"#\"")
|
||||||
|
.entry("dollar", "\"$\"")
|
||||||
|
.entry("percent", "\"%\"")
|
||||||
|
.entry("ampersand", "\"&\"")
|
||||||
|
.entry("asterisk", "\"*\"")
|
||||||
|
.entry("parenleft", "\"(\"")
|
||||||
|
.entry("parenright", "\")\"")
|
||||||
|
.entry("underscore", "\"_\"")
|
||||||
|
.entry("plus", "\"+\"")
|
||||||
|
.entry("minus", "\"-\"")
|
||||||
|
.entry("bracketleft", "\"[\"")
|
||||||
|
.entry("bracketright", "\"]\"")
|
||||||
|
.entry("braceleft", "\"{\"")
|
||||||
|
.entry("braceright", "\"}\"")
|
||||||
|
.entry("dead_diaeresis", "\"\\\"\"")
|
||||||
|
.entry("dead_acute", "\"'\"")
|
||||||
|
.entry("less", "\"<\"")
|
||||||
|
.entry("greater", "\">\"")
|
||||||
|
.entry("comma", "\",\"")
|
||||||
|
.entry("period", "\".\"")
|
||||||
|
.entry("BackSpace", "\"BS\"")
|
||||||
|
.entry("space", "\"space\"")
|
||||||
.entry("Return", "\"CR\"")
|
.entry("Return", "\"CR\"")
|
||||||
|
.entry("Escape", "\"Esc\"")
|
||||||
|
.entry("Delete", "\"Del\"")
|
||||||
|
.entry("Page_Up", "\"PageUp\"")
|
||||||
|
.entry("Page_Down", "\"PageDown\"")
|
||||||
|
.entry("Enter", "\"CR\"")
|
||||||
|
.entry("ISO_Left_Tab", "\"Tab\"")
|
||||||
.build(&mut file)
|
.build(&mut file)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
write!(&mut file, ";\n").unwrap();
|
write!(&mut file, ";\n").unwrap();
|
||||||
|
62
src/ui.rs
62
src/ui.rs
@ -2,6 +2,7 @@ use std::cell::RefCell;
|
|||||||
use std::thread;
|
use std::thread;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
use std::string::String;
|
||||||
|
|
||||||
use rmp::Value;
|
use rmp::Value;
|
||||||
use rmp::value::Integer;
|
use rmp::value::Integer;
|
||||||
@ -99,28 +100,57 @@ impl Ui {
|
|||||||
use phf;
|
use phf;
|
||||||
include!(concat!(env!("OUT_DIR"), "/key_map_table.rs"));
|
include!(concat!(env!("OUT_DIR"), "/key_map_table.rs"));
|
||||||
|
|
||||||
fn convert_keyval(input: &str) -> Option<&'static str> {
|
|
||||||
KEYVAL_MAP.get(input).cloned()
|
fn keyval_to_input_string(val: &str, state: gdk::ModifierType) -> String {
|
||||||
|
let mut input = String::from("<");
|
||||||
|
if state.contains(gdk::enums::modifier_type::ShiftMask) {
|
||||||
|
input.push_str("S-");
|
||||||
|
}
|
||||||
|
if state.contains(gdk::enums::modifier_type::ControlMask) {
|
||||||
|
input.push_str("C-");
|
||||||
|
}
|
||||||
|
if state.contains(gdk::enums::modifier_type::Mod1Mask) {
|
||||||
|
input.push_str("A-");
|
||||||
|
}
|
||||||
|
input.push_str(val);
|
||||||
|
input.push_str(">");
|
||||||
|
input
|
||||||
|
}
|
||||||
|
|
||||||
|
fn convert_keyval(input: &str, state: gdk::ModifierType) -> String {
|
||||||
|
if let Some(cnvt) = KEYVAL_MAP.get(input).cloned() {
|
||||||
|
keyval_to_input_string(cnvt, state)
|
||||||
|
} else {
|
||||||
|
if state.is_empty() {
|
||||||
|
input.to_string()
|
||||||
|
} else {
|
||||||
|
keyval_to_input_string(input, state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_keyval_ignore(keyval_name: &String) -> bool {
|
||||||
|
keyval_name.contains("Shift") || keyval_name.contains("Alt") || keyval_name.contains("Control")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gtk_key_press(_: &Window, ev: &EventKey) -> Inhibit {
|
fn gtk_key_press(_: &Window, ev: &EventKey) -> Inhibit {
|
||||||
let keyval = ev.get_keyval();
|
let keyval = ev.get_keyval();
|
||||||
|
let state = ev.get_state();
|
||||||
if let Some(keyval_name) = gdk::keyval_name(keyval) {
|
if let Some(keyval_name) = gdk::keyval_name(keyval) {
|
||||||
UI.with(|ui_cell| {
|
if !is_keyval_ignore(&keyval_name) {
|
||||||
let mut ui = ui_cell.borrow_mut();
|
UI.with(|ui_cell| {
|
||||||
let input = if keyval_name.starts_with("KP_") {
|
let mut ui = ui_cell.borrow_mut();
|
||||||
keyval_name.chars().skip(3).collect()
|
let input = if keyval_name.starts_with("KP_") {
|
||||||
} else {
|
keyval_name.chars().skip(3).collect()
|
||||||
keyval_name
|
} else {
|
||||||
};
|
keyval_name
|
||||||
|
};
|
||||||
|
|
||||||
let converted_input: &str = if let Some(cnvt) = convert_keyval(&input) {
|
let converted_input = convert_keyval(&input, state);
|
||||||
cnvt
|
println!("{}", converted_input);
|
||||||
} else {
|
ui.nvim().input(&converted_input).expect("Error run input command to nvim");
|
||||||
&input
|
});
|
||||||
};
|
}
|
||||||
ui.nvim().input(converted_input).expect("Error run input command to nvim");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
Inhibit(true)
|
Inhibit(true)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user