diff --git a/Cargo.lock b/Cargo.lock index 6d11d0a..e2e74f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -229,6 +229,16 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" +[[package]] +name = "bytes" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +dependencies = [ + "byteorder", + "iovec", +] + [[package]] name = "bytes" version = "0.5.3" @@ -776,6 +786,105 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +[[package]] +name = "futures" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" + +[[package]] +name = "futures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcae98ca17d102fd8a3603727b9259fcf7fa4239b603d2142926189bc8999b86" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866" + +[[package]] +name = "futures-executor" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff" + +[[package]] +name = "futures-macro" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764" +dependencies = [ + "proc-macro-hack", + "proc-macro2 1.0.7", + "quote 1.0.2", + "syn 1.0.13", +] + +[[package]] +name = "futures-sink" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171be33efae63c2d59e6dbba34186fe0d6394fb378069a76dfd80fdcffd43c16" + +[[package]] +name = "futures-task" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bae52d6b29cf440e298856fec3965ee6fa71b06aa7495178615953fd669e5f9" + +[[package]] +name = "futures-util" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76" +dependencies = [ + "futures 0.1.29", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", + "tokio-io", +] + [[package]] name = "gdk" version = "0.8.0" @@ -1369,7 +1478,6 @@ dependencies = [ "image", "lru", "msgbox", - "neovim-lib", "nvim-rs", "rmpv", "rust-embed", @@ -1379,16 +1487,6 @@ dependencies = [ "winres", ] -[[package]] -name = "neovim-lib" -version = "0.6.0" -source = "git+https://github.com/daa84/neovim-lib#5291bf754bcfa55dcf6332808f72d09ebd78ce90" -dependencies = [ - "log", - "rmpv", - "unix_socket", -] - [[package]] name = "net2" version = "0.2.33" @@ -1493,16 +1591,16 @@ dependencies = [ [[package]] name = "nvim-rs" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f920d183863ab5de29bf953921b286dc5d214620f385e1bfed82a2b0ec6f44" +version = "0.1.1-alpha.0" +source = "git+https://github.com/KillTheMule/nvim-rs?branch=futures#d2012790f7d3876f3bad88185d07a030e4933d37" dependencies = [ "async-trait", + "futures 0.3.1", "log", + "pin-project", "rmp", "rmpv", "tokio", - "unix_socket", ] [[package]] @@ -1615,12 +1713,38 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "pin-project" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b90146c7216e4cb534069fb91366de4ea0ea353105ee45ed297e2d1619e469" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44ca92f893f0656d3cba8158dd0f2b99b94de256a4a54e870bd6922fcc6c8355" +dependencies = [ + "proc-macro2 1.0.7", + "quote 1.0.2", + "syn 1.0.13", +] + [[package]] name = "pin-project-lite" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8822eb8bb72452f038ebf6048efa02c3fe22bf83f76519c9583e47fc194a422" +[[package]] +name = "pin-utils" +version = "0.1.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" + [[package]] name = "pkg-config" version = "0.3.17" @@ -1656,6 +1780,12 @@ dependencies = [ "syn 1.0.13", ] +[[package]] +name = "proc-macro-nested" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" + [[package]] name = "proc-macro2" version = "0.4.30" @@ -1863,8 +1993,6 @@ checksum = "ff4792131b8bf59f4b49a546de03c004eb4b54468d4816044af12c3b7942df5b" dependencies = [ "num-traits", "rmp", - "serde", - "serde_bytes", ] [[package]] @@ -2013,15 +2141,6 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -[[package]] -name = "serde_bytes" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325a073952621257820e7a3469f55ba4726d8b28657e7e36653d1c36dc2c84ae" -dependencies = [ - "serde", -] - [[package]] name = "serde_json" version = "1.0.44" @@ -2294,7 +2413,7 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffa2fdcfa937b20cb3c822a635ceecd5fc1a27a6a474527e5516aa24b8c8820a" dependencies = [ - "bytes", + "bytes 0.5.3", "fnv", "iovec", "lazy_static", @@ -2310,6 +2429,17 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "tokio-io" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.29", + "log", +] + [[package]] name = "tokio-macros" version = "0.2.3" @@ -2362,16 +2492,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -[[package]] -name = "unix_socket" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aa2700417c405c38f5e6902d699345241c28c0b7ade4abaad71e35a87eb1564" -dependencies = [ - "cfg-if", - "libc", -] - [[package]] name = "vcpkg" version = "0.2.8" diff --git a/Cargo.toml b/Cargo.toml index b4c8a32..21fb009 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,13 +13,14 @@ lru = "0.4.3" skulpin = "0.5" derive-new = "0.5" env_logger = "0.7.1" -neovim-lib = { git = "https://github.com/daa84/neovim-lib", version = "0.6" } +#neovim-lib = { git = "https://github.com/daa84/neovim-lib", version = "0.6" } rmpv = "0.4.2" msgbox = "0.4.0" rust-embed = { version = "5.2.0", features = ["debug-embed"] } image = "0.22.3" -nvim-rs = "0.1.0" -tokio = { version = "0.2.9", features = [ "blocking" ] } +#nvim-rs = "0.1.0" +nvim-rs = { git = "https://github.com/KillTheMule/nvim-rs", branch = "futures", features = [ "use_tokio" ] } +tokio = { version = "0.2.9", features = [ "blocking", "process" ] } async-trait = "0.1.18" [build-dependencies] diff --git a/src/main.rs b/src/main.rs index d18afa4..ea8bf6e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,21 +8,21 @@ mod renderer; mod error_handling; mod ui_commands; -#[macro_use] extern crate async_trait; #[macro_use] extern crate derive_new; #[macro_use] extern crate rust_embed; use std::sync::{Arc, Mutex}; -use std::thread; +//use std::thread; use std::process::Stdio; -use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::mpsc::{channel, Receiver}; use async_trait::async_trait; use rmpv::Value; -use nvim_rs::runtime::ChildStdin; -use nvim_rs::{create, Neovim, UiAttachOptions, Handler}; +use tokio::process::ChildStdin; +use nvim_rs::{create::tokio as create, Neovim, UiAttachOptions, Handler, +compat::tokio::Compat}; use tokio::process::Command; -use tokio::task::spawn_blocking; +use tokio::runtime::Runtime; use window::ui_loop; use editor::Editor; @@ -54,11 +54,17 @@ fn create_nvim_command() -> Command { struct NeovimHandler(Arc>); +impl Clone for NeovimHandler { + fn clone(&self) -> Self { + NeovimHandler(Arc::clone(&self.0)) + } +} + #[async_trait] impl Handler for NeovimHandler { - type Writer = ChildStdin; + type Writer = Compat; - async fn handle_request(&self, event_name: String, arguments: Vec, neovim: Neovim) -> Result { + async fn handle_notify(&self, event_name: String, arguments: Vec, _neovim: Neovim>) { dbg!(&event_name); let parsed_events = parse_neovim_event(event_name, arguments) .unwrap_or_explained_panic("Could not parse event", "Could not parse event from neovim"); @@ -66,12 +72,10 @@ impl Handler for NeovimHandler { let mut editor = self.0.lock().unwrap(); editor.handle_redraw_event(event); } - Ok(Value::Nil) } } -#[tokio::main] -async fn start_nvim(editor: Arc>) -> Sender { +async fn start_nvim(editor: Arc>, receiver: Receiver) { let (mut nvim, io_handler, _) = create::new_child_cmd(&mut create_nvim_command(), NeovimHandler(editor.clone())).await .unwrap_or_explained_panic("Could not create nvim process", "Could not locate or start the neovim process"); @@ -87,23 +91,31 @@ async fn start_nvim(editor: Arc>) -> Sender { let mut options = UiAttachOptions::new(); options.set_linegrid_external(true); options.set_rgb(true); - nvim.set_var("neovide", Value::Boolean(true)).await; + nvim.set_var("neovide", Value::Boolean(true)).await + .unwrap_or_explained_panic("Could not communicate.", "Could not communicate with neovim process"); nvim.ui_attach(INITIAL_WIDTH as i64, INITIAL_HEIGHT as i64, &options).await .unwrap_or_explained_panic("Could not attach.", "Could not attach ui to neovim process"); - let (mut sender, receiver) = channel::(); - tokio::spawn(async move { - while let Ok(ui_command) = spawn_blocking(|| receiver.recv()).await.unwrap() { - dbg!(&ui_command); - ui_command.execute(&nvim).await; - } - }); + loop { + let r = receiver.recv(); - sender + if let Ok(ui_command) = r { + dbg!(&ui_command); + ui_command.execute(&nvim).await; + } else { + return + } + } } fn main() { + let rt = Runtime::new().unwrap(); + let editor = Arc::new(Mutex::new(Editor::new(INITIAL_WIDTH, INITIAL_HEIGHT))); - let sender = start_nvim(editor.clone()); + let (sender, receiver) = channel::(); + let editor_clone = editor.clone(); + rt.spawn_blocking(async move { + start_nvim(editor_clone, receiver).await; + }); ui_loop(editor, sender, (INITIAL_WIDTH, INITIAL_HEIGHT)); } diff --git a/src/ui_commands.rs b/src/ui_commands.rs index 2979114..9646a3b 100644 --- a/src/ui_commands.rs +++ b/src/ui_commands.rs @@ -1,5 +1,6 @@ use nvim_rs::Neovim; -use nvim_rs::runtime::ChildStdin; +use nvim_rs::compat::tokio::Compat; +use tokio::process::ChildStdin; #[derive(Debug)] pub enum UiCommand { @@ -11,7 +12,7 @@ pub enum UiCommand { } impl UiCommand { - pub async fn execute(&self, nvim: &Neovim) { + pub async fn execute(&self, nvim: &Neovim>) { match self { UiCommand::Resize { width, height } => nvim.ui_try_resize(*width.max(&10), *height.max(&3)).await