Repaint + some basic input
This commit is contained in:
parent
62eeeec201
commit
8d2c22e571
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -3,6 +3,7 @@ name = "neovim-gtk"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cairo-rs 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cairo-rs 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"gdk 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"glib 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)",
|
"gtk 0.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"neovim-lib 0.1.0",
|
"neovim-lib 0.1.0",
|
||||||
|
@ -7,6 +7,7 @@ build = "build.rs"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
cairo-rs = "0.0.8"
|
cairo-rs = "0.0.8"
|
||||||
glib = "0.0.8"
|
glib = "0.0.8"
|
||||||
|
gdk = "0.3.0"
|
||||||
#neovim-lib = "0.1"
|
#neovim-lib = "0.1"
|
||||||
rmp = "0.7"
|
rmp = "0.7"
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
extern crate gtk;
|
extern crate gtk;
|
||||||
|
extern crate gdk;
|
||||||
extern crate glib;
|
extern crate glib;
|
||||||
extern crate cairo;
|
extern crate cairo;
|
||||||
extern crate neovim_lib;
|
extern crate neovim_lib;
|
||||||
|
@ -16,6 +16,8 @@ pub trait RedrawEvents {
|
|||||||
fn on_clear(&mut self);
|
fn on_clear(&mut self);
|
||||||
|
|
||||||
fn on_resize(&mut self, columns: u64, rows: u64);
|
fn on_resize(&mut self, columns: u64, rows: u64);
|
||||||
|
|
||||||
|
fn on_redraw(&self);
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! try_str {
|
macro_rules! try_str {
|
||||||
@ -72,6 +74,11 @@ fn nvim_cb(method: &str, params: Vec<Value>) {
|
|||||||
println!("Unsupported event type {:?}", ev);
|
println!("Unsupported event type {:?}", ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
safe_call(move |ui| {
|
||||||
|
ui.on_redraw();
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
println!("Notification {}", method);
|
println!("Notification {}", method);
|
||||||
}
|
}
|
||||||
|
34
src/ui.rs
34
src/ui.rs
@ -5,7 +5,9 @@ use cairo;
|
|||||||
use gtk;
|
use gtk;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::{Window, WindowType, DrawingArea, Grid, ToolButton, ButtonBox, Orientation, Image};
|
use gtk::{Window, WindowType, DrawingArea, Grid, ToolButton, ButtonBox, Orientation, Image};
|
||||||
use neovim_lib::Neovim;
|
use gdk;
|
||||||
|
use gdk::EventKey;
|
||||||
|
use neovim_lib::{Neovim, NeovimApi};
|
||||||
|
|
||||||
use ui_model::UiModel;
|
use ui_model::UiModel;
|
||||||
use nvim::RedrawEvents;
|
use nvim::RedrawEvents;
|
||||||
@ -74,6 +76,7 @@ impl Ui {
|
|||||||
|
|
||||||
window.add(&grid);
|
window.add(&grid);
|
||||||
window.show_all();
|
window.show_all();
|
||||||
|
window.connect_key_press_event(gtk_key_press);
|
||||||
window.connect_delete_event(|_, _| {
|
window.connect_delete_event(|_, _| {
|
||||||
gtk::main_quit();
|
gtk::main_quit();
|
||||||
Inhibit(false)
|
Inhibit(false)
|
||||||
@ -81,6 +84,22 @@ impl Ui {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn gtk_key_press(_: &Window, ev: &EventKey) -> Inhibit {
|
||||||
|
let keyval = ev.get_keyval();
|
||||||
|
if let Some(keyval_name) = gdk::keyval_name(keyval) {
|
||||||
|
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
|
||||||
|
};
|
||||||
|
ui.nvim().input(&input).expect("Error run input command to nvim");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Inhibit(true)
|
||||||
|
}
|
||||||
|
|
||||||
fn gtk_draw(drawing_area: &DrawingArea, ctx: &cairo::Context) -> Inhibit {
|
fn gtk_draw(drawing_area: &DrawingArea, ctx: &cairo::Context) -> Inhibit {
|
||||||
let width = drawing_area.get_allocated_width() as f64;
|
let width = drawing_area.get_allocated_width() as f64;
|
||||||
let height = drawing_area.get_allocated_height() as f64;
|
let height = drawing_area.get_allocated_height() as f64;
|
||||||
@ -89,14 +108,17 @@ fn gtk_draw(drawing_area: &DrawingArea, ctx: &cairo::Context) -> Inhibit {
|
|||||||
cairo::enums::FontSlant::Normal,
|
cairo::enums::FontSlant::Normal,
|
||||||
cairo::enums::FontWeight::Normal);
|
cairo::enums::FontWeight::Normal);
|
||||||
ctx.set_font_face(font_face);
|
ctx.set_font_face(font_face);
|
||||||
|
|
||||||
|
let font_extents = ctx.font_extents();
|
||||||
UI.with(|ui_cell| {
|
UI.with(|ui_cell| {
|
||||||
ctx.set_source_rgb(0.0, 0.0, 0.0);
|
|
||||||
let ui = ui_cell.borrow();
|
let ui = ui_cell.borrow();
|
||||||
let mut line_y = 30.0;
|
|
||||||
|
ctx.set_source_rgb(0.0, 0.0, 0.0);
|
||||||
|
let mut line_y = font_extents.height;
|
||||||
for line in ui.model.lines() {
|
for line in ui.model.lines() {
|
||||||
ctx.move_to(0.0, line_y);
|
ctx.move_to(0.0, line_y);
|
||||||
ctx.show_text(&line);
|
ctx.show_text(&line);
|
||||||
line_y += 30.0;
|
line_y += font_extents.height;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -119,4 +141,8 @@ impl RedrawEvents for Ui {
|
|||||||
fn on_resize(&mut self, columns: u64, rows: u64) {
|
fn on_resize(&mut self, columns: u64, rows: u64) {
|
||||||
self.model = UiModel::new(rows, columns);
|
self.model = UiModel::new(rows, columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_redraw(&self) {
|
||||||
|
self.drawing_area.queue_draw();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user