mirror of
https://github.com/alacritty/alacritty.git
synced 2025-04-14 17:53:03 -04:00
wip
doesn't work on ubuntu 16.04 for some reason
This commit is contained in:
parent
89937e7bc5
commit
077a058cc4
5 changed files with 213 additions and 57 deletions
82
Cargo.lock
generated
82
Cargo.lock
generated
|
@ -4,6 +4,7 @@ version = "0.1.0"
|
|||
dependencies = [
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cgmath 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clipboard 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"errno 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"font 0.1.0",
|
||||
"gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -48,6 +49,11 @@ name = "bitflags"
|
|||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "block"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "0.5.3"
|
||||
|
@ -82,6 +88,29 @@ dependencies = [
|
|||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clipboard"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"clipboard-win 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"objc 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"objc_id 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"x11 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clipboard-win"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"windows-error 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cmake"
|
||||
version = "0.1.17"
|
||||
|
@ -596,6 +625,24 @@ dependencies = [
|
|||
"malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc-foundation"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"objc 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"objc_id 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc_id"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"objc 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "osmesa-sys"
|
||||
version = "0.1.2"
|
||||
|
@ -821,6 +868,15 @@ dependencies = [
|
|||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "user32-sys"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "utf8parse"
|
||||
version = "0.1.0"
|
||||
|
@ -910,6 +966,15 @@ name = "winapi-build"
|
|||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "windows-error"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ws2_32-sys"
|
||||
version = "0.2.1"
|
||||
|
@ -919,6 +984,15 @@ dependencies = [
|
|||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "x11"
|
||||
version = "2.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "x11-dl"
|
||||
version = "2.8.0"
|
||||
|
@ -949,11 +1023,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dead7461c1127cf637931a1e50934eb6eee8bff2f74433ac7909e9afcee04a3"
|
||||
"checksum bitflags 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "72cd7314bd4ee024071241147222c706e80385a1605ac7d4cd2fcc339da2ae46"
|
||||
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
|
||||
"checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
|
||||
"checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855"
|
||||
"checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27"
|
||||
"checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c"
|
||||
"checksum cgl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8bdd78cca65a739cb5475dbf6b6bbb49373e327f4a6f2b499c0f98632df38c10"
|
||||
"checksum cgmath 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75e93b3eb66e74ffb946a69ff54c6026c1399960241c843f249ea0127b96b9f6"
|
||||
"checksum clipboard 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "811169a9ffda99ed1841a6db3c48cffbab9a9101376f77fee3c14a7581ab933d"
|
||||
"checksum clipboard-win 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "238830bd83336a8620cbc1d6edf6b9222f45a2c52d02c164348fb6b466277b21"
|
||||
"checksum cmake 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "dfcf5bcece56ef953b8ea042509e9dcbdfe97820b7e20d86beb53df30ed94978"
|
||||
"checksum cocoa 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3afe4613f57a171039a98db1773f5840b5743cf85aaf03afb65ddfade4f4a9db"
|
||||
"checksum core-foundation 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "20a6d0448d3a99d977ae4a2aa5a98d886a923e863e81ad9ff814645b6feb3bbd"
|
||||
|
@ -1007,6 +1084,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum num-rational 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "54ff603b8334a72fbb27fe66948aac0abaaa40231b3cecd189e76162f6f38aaf"
|
||||
"checksum num-traits 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "8359ea48994f253fa958b5b90b013728b06f54872e5a58bce39540fcdd0f2527"
|
||||
"checksum objc 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9311aa5acd7bee14476afa0f0557f564e9d0d61218a8b833d9b1f871fa5fba"
|
||||
"checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
|
||||
"checksum objc_id 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4730aa1c64d722db45f7ccc4113a3e2c465d018de6db4d3e7dfe031e8c8a297"
|
||||
"checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
|
||||
"checksum parking_lot 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aa2a676a66f54ed4c84f55261814eb357e530eb2b703cd21466beee4bcf30238"
|
||||
"checksum parking_lot_core 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "06f24c980718110494e9cfb7db7438895c3f54505101bb6170329d5e43a53f64"
|
||||
|
@ -1036,6 +1115,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum tempfile 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9270837a93bad1b1dac18fe67e786b3c960513af86231f6f4f57fddd594ff0c8"
|
||||
"checksum time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7ec6d62a20df54e07ab3b78b9a3932972f4b7981de295563686849eb3989af"
|
||||
"checksum user32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6717129de5ac253f5642fc78a51d0c7de6f9f53d617fc94e9bae7f6e71cf5504"
|
||||
"checksum user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47"
|
||||
"checksum utf8parse 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a15ea87f3194a3a454c78d79082b4f5e85f6956ddb6cb86bbfbe4892aa3c0323"
|
||||
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||
"checksum vte 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "182acba7edb46d25ab5ddfc9f390b8c6cc1dcec7a4efc2798f0a8918f07d8c8a"
|
||||
|
@ -1047,7 +1127,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum wayland-window 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "309b69d3a863c9c21422d889fb7d98cf02f8a2ca054960a49243ce5b67ad884c"
|
||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
||||
"checksum windows-error 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa34b3180ad6b4fe63cbc4fb773da4a83c5b3db8db15789051a4785f2b43e58"
|
||||
"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
|
||||
"checksum x11 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfc828b6baf54ccdde44e0b5f16e035ab9c54f60a0f0c218fb5ddbc6ab38a2a9"
|
||||
"checksum x11-dl 2.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6acc29bdc98d7565e18dc71b3e933aa94a195d0c2f4ec84f675679d9744b0d6b"
|
||||
"checksum xml-rs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65e74b96bd3179209dc70a980da6df843dff09e46eee103a0376c0949257e3ef"
|
||||
"checksum yaml-rust 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ebfe12f475ad59be6178ebf004d51e682022496535994f8d23fd7ed31084598c"
|
||||
|
|
|
@ -19,6 +19,7 @@ serde_yaml = "0.4"
|
|||
serde_macros = "0.8"
|
||||
vte = "0.1.2"
|
||||
mio = "0.6"
|
||||
clipboard = "0.1.2"
|
||||
|
||||
[build-dependencies]
|
||||
gl_generator = "0.5"
|
||||
|
|
|
@ -60,7 +60,14 @@ impl<N: input::Notify> Processor<N> {
|
|||
let processor = &mut self.input_processor;
|
||||
let notifier = &mut self.notifier;
|
||||
|
||||
processor.process(state, key, mods, notifier, *terminal.mode());
|
||||
processor.process_key(state, key, mods, notifier, *terminal.mode());
|
||||
},
|
||||
glutin::Event::MouseInput(state, button) => {
|
||||
let terminal = self.terminal.lock();
|
||||
let processor = &mut self.input_processor;
|
||||
let notifier = &mut self.notifier;
|
||||
|
||||
processor.mouse_input(state, button, notifier, *terminal.mode());
|
||||
},
|
||||
_ => (),
|
||||
}
|
||||
|
|
177
src/input.rs
177
src/input.rs
|
@ -25,7 +25,8 @@
|
|||
//! TODO handling xmodmap would be good
|
||||
use std::borrow::Cow;
|
||||
|
||||
use glutin::{ElementState, VirtualKeyCode};
|
||||
use clipboard::ClipboardContext;
|
||||
use glutin::{ElementState, VirtualKeyCode, MouseButton};
|
||||
use glutin::{Mods, mods};
|
||||
|
||||
use term::mode::{self, TermMode};
|
||||
|
@ -70,107 +71,116 @@ pub struct Binding {
|
|||
/// Modifier keys required to activate binding
|
||||
mods: Mods,
|
||||
/// String to send to pty if mods and mode match
|
||||
send: &'static str,
|
||||
action: Action,
|
||||
/// Terminal mode required to activate binding
|
||||
mode: TermMode,
|
||||
/// excluded terminal modes where the binding won't be activated
|
||||
notmode: TermMode,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Action {
|
||||
/// Write an escape sequence
|
||||
Esc(&'static str),
|
||||
|
||||
/// Paste contents of system clipboard
|
||||
Paste,
|
||||
}
|
||||
|
||||
/// Bindings for the LEFT key.
|
||||
static LEFT_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::SHIFT, send: "\x1b[1;2D", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, send: "\x1b[1;5D", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, send: "\x1b[1;3D", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, send: "\x1b[D", mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, send: "\x1bOD", mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
Binding { mods: mods::SHIFT, action: Action::Esc("\x1b[1;2D"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, action: Action::Esc("\x1b[1;5D"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, action: Action::Esc("\x1b[1;3D"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[D"), mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOD"), mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the RIGHT key
|
||||
static RIGHT_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::SHIFT, send: "\x1b[1;2C", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, send: "\x1b[1;5C", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, send: "\x1b[1;3C", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, send: "\x1b[C", mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, send: "\x1bOC", mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
Binding { mods: mods::SHIFT, action: Action::Esc("\x1b[1;2C"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, action: Action::Esc("\x1b[1;5C"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, action: Action::Esc("\x1b[1;3C"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[C"), mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOC"), mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the UP key
|
||||
static UP_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::SHIFT, send: "\x1b[1;2A", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, send: "\x1b[1;5A", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, send: "\x1b[1;3A", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, send: "\x1b[A", mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, send: "\x1bOA", mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
Binding { mods: mods::SHIFT, action: Action::Esc("\x1b[1;2A"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, action: Action::Esc("\x1b[1;5A"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, action: Action::Esc("\x1b[1;3A"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[A"), mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOA"), mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the DOWN key
|
||||
static DOWN_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::SHIFT, send: "\x1b[1;2B", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, send: "\x1b[1;5B", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, send: "\x1b[1;3B", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, send: "\x1b[B", mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, send: "\x1bOB", mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
Binding { mods: mods::SHIFT, action: Action::Esc("\x1b[1;2B"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, action: Action::Esc("\x1b[1;5B"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ALT, action: Action::Esc("\x1b[1;3B"), mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[B"), mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOB"), mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F1 key
|
||||
static F1_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1bOP", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOP"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F2 key
|
||||
static F2_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1bOQ", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOQ"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F3 key
|
||||
static F3_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1bOR", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOR"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F4 key
|
||||
static F4_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1bOS", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1bOS"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F5 key
|
||||
static F5_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[15~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[15~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F6 key
|
||||
static F6_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[17~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[17~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F7 key
|
||||
static F7_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[18~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[18~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F8 key
|
||||
static F8_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[19~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[19~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F9 key
|
||||
static F9_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[20~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[20~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F10 key
|
||||
static F10_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[21~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[21~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F11 key
|
||||
static F11_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[23~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[23~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the F11 key
|
||||
static F12_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[24~", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[24~"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the H key
|
||||
|
@ -179,18 +189,40 @@ static F12_BINDINGS: &'static [Binding] = &[
|
|||
/// since DEL and BACKSPACE are inverted. This binding is a work around to that
|
||||
/// capture.
|
||||
static H_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::CONTROL, send: "\x08", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::CONTROL, action: Action::Esc("\x08"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the V Key
|
||||
///
|
||||
/// Cmd-V on macOS should trigger a paste
|
||||
#[cfg(target_os="macos")]
|
||||
static V_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::SUPER, action: Action::Paste, mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
#[cfg(not(target_os="macos"))]
|
||||
static V_BINDINGS: &'static [Binding] = &[];
|
||||
|
||||
#[cfg(target_os="linux")]
|
||||
static MOUSE_MIDDLE_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, action: Action::Paste, mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
#[cfg(not(target_os="linux"))]
|
||||
static MOUSE_MIDDLE_BINDINGS: &'static [Binding] = &[];
|
||||
|
||||
static MOUSE_LEFT_BINDINGS: &'static [Binding] = &[];
|
||||
static MOUSE_RIGHT_BINDINGS: &'static [Binding] = &[];
|
||||
|
||||
/// Bindings for the Backspace key
|
||||
static BACKSPACE_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x7f", mode: mode::ANY, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x7f"), mode: mode::ANY, notmode: mode::NONE },
|
||||
];
|
||||
|
||||
/// Bindings for the Delete key
|
||||
static DELETE_BINDINGS: &'static [Binding] = &[
|
||||
Binding { mods: mods::ANY, send: "\x1b[3~", mode: mode::APP_KEYPAD, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, send: "\x1b[P", mode: mode::ANY, notmode: mode::APP_KEYPAD },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[3~"), mode: mode::APP_KEYPAD, notmode: mode::NONE },
|
||||
Binding { mods: mods::ANY, action: Action::Esc("\x1b[P"), mode: mode::ANY, notmode: mode::APP_KEYPAD },
|
||||
];
|
||||
|
||||
// key mods escape appkey appcursor crlf
|
||||
|
@ -204,14 +236,35 @@ impl Processor {
|
|||
Default::default()
|
||||
}
|
||||
|
||||
pub fn process<N>(&mut self,
|
||||
state: ElementState,
|
||||
key: Option<VirtualKeyCode>,
|
||||
mods: Mods,
|
||||
notifier: &mut N,
|
||||
mode: TermMode)
|
||||
where N: Notify
|
||||
{
|
||||
pub fn mouse_input<N: Notify>(
|
||||
&mut self,
|
||||
state: ElementState,
|
||||
input: MouseButton,
|
||||
notifier: &mut N,
|
||||
mode: TermMode
|
||||
) {
|
||||
if let ElementState::Released = state {
|
||||
return;
|
||||
}
|
||||
|
||||
let bindings = match input {
|
||||
MouseButton::Middle => MOUSE_MIDDLE_BINDINGS,
|
||||
MouseButton::Left => MOUSE_LEFT_BINDINGS,
|
||||
MouseButton::Right => MOUSE_RIGHT_BINDINGS,
|
||||
MouseButton::Other(_index) => return,
|
||||
};
|
||||
|
||||
self.process_bindings(bindings, mode, notifier, mods::NONE);
|
||||
}
|
||||
|
||||
pub fn process_key<N: Notify>(
|
||||
&mut self,
|
||||
state: ElementState,
|
||||
key: Option<VirtualKeyCode>,
|
||||
mods: Mods,
|
||||
notifier: &mut N,
|
||||
mode: TermMode
|
||||
) {
|
||||
if let Some(key) = key {
|
||||
// Ignore release events
|
||||
if state == ElementState::Released {
|
||||
|
@ -240,6 +293,7 @@ impl Processor {
|
|||
VirtualKeyCode::Back => BACKSPACE_BINDINGS,
|
||||
VirtualKeyCode::Delete => DELETE_BINDINGS,
|
||||
VirtualKeyCode::H => H_BINDINGS,
|
||||
VirtualKeyCode::V => V_BINDINGS,
|
||||
// Mode keys ignored now
|
||||
VirtualKeyCode::LAlt | VirtualKeyCode::RAlt | VirtualKeyCode::LShift |
|
||||
VirtualKeyCode::RShift | VirtualKeyCode::LControl | VirtualKeyCode::RControl |
|
||||
|
@ -251,7 +305,7 @@ impl Processor {
|
|||
VirtualKeyCode::I | VirtualKeyCode::J | VirtualKeyCode::K | VirtualKeyCode::L |
|
||||
VirtualKeyCode::M | VirtualKeyCode::N | VirtualKeyCode::O | VirtualKeyCode::P |
|
||||
VirtualKeyCode::Q | VirtualKeyCode::R | VirtualKeyCode::S | VirtualKeyCode::T |
|
||||
VirtualKeyCode::U | VirtualKeyCode::V | VirtualKeyCode::W | VirtualKeyCode::X |
|
||||
VirtualKeyCode::U | VirtualKeyCode::W | VirtualKeyCode::X |
|
||||
VirtualKeyCode::Y | VirtualKeyCode::Z => return,
|
||||
VirtualKeyCode::Key1 | VirtualKeyCode::Key2 | VirtualKeyCode::Key3 |
|
||||
VirtualKeyCode::Key4 | VirtualKeyCode::Key5 | VirtualKeyCode::Key6 |
|
||||
|
@ -284,8 +338,19 @@ impl Processor {
|
|||
if binding.notmode.is_empty() || !mode.intersects(binding.notmode) {
|
||||
// Modifier keys
|
||||
if binding.mods.is_all() || mods.intersects(binding.mods) {
|
||||
// everything matches
|
||||
notifier.notify(binding.send.as_bytes());
|
||||
// everything matches; run the binding action
|
||||
match binding.action {
|
||||
Action::Esc(s) => notifier.notify(s.as_bytes()),
|
||||
Action::Paste => {
|
||||
let clip = ClipboardContext::new().expect("get clipboard");
|
||||
clip.get_contents()
|
||||
.map(|contents| notifier.notify(contents.into_bytes()))
|
||||
.unwrap_or_else(|err| {
|
||||
err_println!("Error getting clipboard contents: {}", err);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -337,7 +402,7 @@ mod tests {
|
|||
|
||||
test_process_binding! {
|
||||
name: process_binding_nomode_shiftmod_require_shift,
|
||||
binding: Binding { mods: mods::SHIFT, send: "\x1b[1;2D", mode: mode::ANY, notmode: mode::NONE },
|
||||
binding: Binding { mods: mods::SHIFT, action: Action::Esc("\x1b[1;2D"), mode: mode::ANY, notmode: mode::NONE },
|
||||
expect: Some(String::from("\x1b[1;2D")),
|
||||
mode: mode::NONE,
|
||||
mods: mods::SHIFT
|
||||
|
@ -345,7 +410,7 @@ mod tests {
|
|||
|
||||
test_process_binding! {
|
||||
name: process_binding_nomode_nomod_require_shift,
|
||||
binding: Binding { mods: mods::SHIFT, send: "\x1b[1;2D", mode: mode::ANY, notmode: mode::NONE },
|
||||
binding: Binding { mods: mods::SHIFT, action: Action::Esc("\x1b[1;2D"), mode: mode::ANY, notmode: mode::NONE },
|
||||
expect: None,
|
||||
mode: mode::NONE,
|
||||
mods: mods::NONE
|
||||
|
@ -353,7 +418,7 @@ mod tests {
|
|||
|
||||
test_process_binding! {
|
||||
name: process_binding_nomode_controlmod,
|
||||
binding: Binding { mods: mods::CONTROL, send: "\x1b[1;5D", mode: mode::ANY, notmode: mode::NONE },
|
||||
binding: Binding { mods: mods::CONTROL, action: Action::Esc("\x1b[1;5D"), mode: mode::ANY, notmode: mode::NONE },
|
||||
expect: Some(String::from("\x1b[1;5D")),
|
||||
mode: mode::NONE,
|
||||
mods: mods::CONTROL
|
||||
|
@ -361,7 +426,7 @@ mod tests {
|
|||
|
||||
test_process_binding! {
|
||||
name: process_binding_nomode_nomod_require_not_appcursor,
|
||||
binding: Binding { mods: mods::ANY, send: "\x1b[D", mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
binding: Binding { mods: mods::ANY, action: Action::Esc("\x1b[D"), mode: mode::ANY, notmode: mode::APP_CURSOR },
|
||||
expect: Some(String::from("\x1b[D")),
|
||||
mode: mode::NONE,
|
||||
mods: mods::NONE
|
||||
|
@ -369,7 +434,7 @@ mod tests {
|
|||
|
||||
test_process_binding! {
|
||||
name: process_binding_appcursormode_nomod_require_appcursor,
|
||||
binding: Binding { mods: mods::ANY, send: "\x1bOD", mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
binding: Binding { mods: mods::ANY, action: Action::Esc("\x1bOD"), mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
expect: Some(String::from("\x1bOD")),
|
||||
mode: mode::APP_CURSOR,
|
||||
mods: mods::NONE
|
||||
|
@ -377,7 +442,7 @@ mod tests {
|
|||
|
||||
test_process_binding! {
|
||||
name: process_binding_nomode_nomod_require_appcursor,
|
||||
binding: Binding { mods: mods::ANY, send: "\x1bOD", mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
binding: Binding { mods: mods::ANY, action: Action::Esc("\x1bOD"), mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
expect: None,
|
||||
mode: mode::NONE,
|
||||
mods: mods::NONE
|
||||
|
@ -385,7 +450,7 @@ mod tests {
|
|||
|
||||
test_process_binding! {
|
||||
name: process_binding_appcursormode_appkeypadmode_nomod_require_appcursor,
|
||||
binding: Binding { mods: mods::ANY, send: "\x1bOD", mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
binding: Binding { mods: mods::ANY, action: Action::Esc("\x1bOD"), mode: mode::APP_CURSOR, notmode: mode::NONE },
|
||||
expect: Some(String::from("\x1bOD")),
|
||||
mode: mode::APP_CURSOR | mode::APP_KEYPAD,
|
||||
mods: mods::NONE
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#![feature(core_intrinsics)]
|
||||
|
||||
extern crate cgmath;
|
||||
extern crate clipboard;
|
||||
extern crate errno;
|
||||
extern crate font;
|
||||
extern crate glutin;
|
||||
|
|
Loading…
Add table
Reference in a new issue