diff --git a/build.rs b/build.rs index 9cb4bd6..32ea8fb 100644 --- a/build.rs +++ b/build.rs @@ -15,33 +15,7 @@ fn main() { write!(&mut file, "static KEYVAL_MAP: phf::Map<&'static str, &'static str> = ").unwrap(); phf_codegen::Map::new() - .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("colon", "\":\"") - .entry("period", "\".\"") .entry("BackSpace", "\"BS\"") - .entry("space", "\"space\"") .entry("Return", "\"CR\"") .entry("Escape", "\"Esc\"") .entry("Delete", "\"Del\"") diff --git a/src/input.rs b/src/input.rs new file mode 100644 index 0000000..97267ae --- /dev/null +++ b/src/input.rs @@ -0,0 +1,42 @@ + +use gdk; +use gdk::EventKey; +use phf; + +include!(concat!(env!("OUT_DIR"), "/key_map_table.rs")); + + +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 +} + +pub fn convert_key(ev: &EventKey) -> Option { + let keyval = ev.get_keyval(); + let state = ev.get_state(); + if let Some(ref keyval_name) = gdk::keyval_name(keyval) { + if let Some(cnvt) = KEYVAL_MAP.get(keyval_name as &str).cloned() { + return Some(keyval_to_input_string(cnvt, state)); + } + } + if let Some(ch) = gdk::keyval_to_unicode(keyval) { + return Some(if !state.is_empty() { + keyval_to_input_string(&ch.to_string(), state) + } else { + ch.to_string() + }); + } + + None +} diff --git a/src/main.rs b/src/main.rs index 8f82d74..e370c16 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ extern crate phf; mod nvim; mod ui_model; mod ui; +mod input; fn main() { gtk::init().expect("Failed to initialize GTK"); diff --git a/src/ui.rs b/src/ui.rs index 2b94305..2be48bb 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -13,14 +13,18 @@ use cairo::enums::{FontWeight, FontSlant}; use gtk; use gtk::prelude::*; use gtk::{Window, WindowType, DrawingArea, Grid, ToolButton, ButtonBox, Orientation, Image}; -use gdk; use gdk::EventKey; use neovim_lib::{Neovim, NeovimApi}; use ui_model::{UiModel, Attrs, Color}; use nvim::RedrawEvents; +use input::convert_key; + +#[cfg(target_os = "linux")] const FONT_NAME: &'static str = "Droid Sans Mono for Powerline"; +#[cfg(target_os = "windows")] +const FONT_NAME: &'static str = "Liberation_Mono:h12:cANSI"; const FONT_SIZE: f64 = 16.0; thread_local!(pub static UI: RefCell = { @@ -98,60 +102,12 @@ impl Ui { } } -use phf; -include!(concat!(env!("OUT_DIR"), "/key_map_table.rs")); - - -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 { - let keyval = ev.get_keyval(); - let state = ev.get_state(); - if let Some(keyval_name) = gdk::keyval_name(keyval) { - if !is_keyval_ignore(&keyval_name) { - UI.with(|ui_cell| { - let mut ui = ui_cell.borrow_mut(); - let input = if keyval_name.starts_with("KP_") { - keyval_name.chars().skip(3).collect() - } else { - keyval_name - }; - - let converted_input = convert_keyval(&input, state); - println!("{}", converted_input); - ui.nvim().input(&converted_input).expect("Error run input command to nvim"); - }); - } + if let Some(input) = convert_key(ev) { + UI.with(|ui_cell| { + let mut ui = ui_cell.borrow_mut(); + ui.nvim().input(&input).expect("Error run input command to nvim"); + }); } Inhibit(true) } @@ -213,11 +169,11 @@ fn gtk_draw(drawing_area: &DrawingArea, ctx: &cairo::Context) -> Inhibit { } request_width(&drawing_area, &ui, font_extents.height, char_bounds.width); - + }); - + Inhibit(true) }