diff --git a/Cargo.lock b/Cargo.lock index 1f41c12..385cee3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,6 +5,8 @@ dependencies = [ "cairo-rs 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)", "gtk 0.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "neovim-lib 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rmp 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -24,6 +26,11 @@ name = "bitflags" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "byteorder" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "c_vec" version = "1.0.12" @@ -185,6 +192,16 @@ name = "libc" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "neovim-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rmp 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rmp-serialize 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pango" version = "0.0.7" @@ -212,3 +229,25 @@ name = "pkg-config" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rmp" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rmp-serialize" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rmp 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc-serialize" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" + diff --git a/Cargo.toml b/Cargo.toml index f4bc866..790a99d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,8 @@ build = "build.rs" [dependencies] cairo-rs = "0.0.8" glib = "0.0.8" +neovim-lib = "0.1" +rmp = "0.7" [dependencies.gtk] version = "0.0.7" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..38cad81 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +test: + cargo test diff --git a/src/main.rs b/src/main.rs index 21a6425..1b17022 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,17 @@ extern crate gtk; extern crate cairo; +extern crate neovim_lib; +extern crate rmp; +mod nvim; mod ui_model; mod ui; use ui::Ui; +use nvim::Nvim; fn main() { - Ui::new().start(); + let nvim = Nvim::start().expect("Can't start nvim instance"); + Ui::new().show(); } diff --git a/src/nvim.rs b/src/nvim.rs new file mode 100644 index 0000000..ea3382d --- /dev/null +++ b/src/nvim.rs @@ -0,0 +1,43 @@ +use neovim_lib::{Neovim, Session}; +use std::io::{Result, Error, ErrorKind}; +use rmp::Value; + +pub struct Nvim { + nvim: Neovim +} + +impl Nvim { + pub fn start() -> Result { + let mut session = try!(Session::new_tcp("127.0.0.1:6666")); + //let mut session = try!(Session::new_child()); + + session.start_event_loop_cb(Nvim::cb); + + let mut nvim = Neovim::new(session); + try!(nvim.ui_attach(80, 24, true).map_err(|e| Error::new(ErrorKind::Other, e))); + + Ok(Nvim { + nvim: nvim, + }) + } + + fn cb(method: &str, params: Vec) { + if method == "redraw" { + for ev in params { + if let Value::Array(ev_args) = ev { + if let Value::String(ref ev_name) = ev_args[0] { + println!("Event {}", ev_name); + } + else { + println!("Unsupported event {:?}", ev_args); + } + } + else { + println!("Unsupported event type {:?}", ev); + } + } + } else { + println!("Notification {}", method); + } + } +} diff --git a/src/ui.rs b/src/ui.rs index bea65c9..ceb0e49 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -5,14 +5,18 @@ use gtk::{Window, WindowType, DrawingArea, Grid, Button, ButtonBox, Orientation} use ui_model::UiModel; -pub struct Ui; +pub struct Ui { + model: UiModel, +} impl Ui { pub fn new() -> Ui { - Ui + Ui { + model: UiModel::empty(), + } } - pub fn start(&self) { + pub fn show(&self) { gtk::init().expect("Failed to initialize GTK"); let window = Window::new(WindowType::Toplevel); diff --git a/src/ui_model.rs b/src/ui_model.rs index 18705a6..fb50497 100644 --- a/src/ui_model.rs +++ b/src/ui_model.rs @@ -17,6 +17,10 @@ pub struct UiModel { } impl UiModel { + pub fn empty() -> UiModel { + UiModel::new(0, 0) + } + pub fn new(columns: u64, rows: u64) -> UiModel { let cells = (columns * rows) as usize; let mut model = Vec::with_capacity(cells);