Make shell global variable due to borrow check conflict
This commit is contained in:
parent
0bd7356cd6
commit
5f523b8896
@ -1,6 +1,6 @@
|
|||||||
use cairo;
|
use cairo;
|
||||||
use ui_model::Color;
|
use ui_model::Color;
|
||||||
use ui::{UI, UiMutex};
|
use ui::{SH, UiMutex};
|
||||||
use shell::{Shell, NvimMode};
|
use shell::{Shell, NvimMode};
|
||||||
use nvim::{RepaintMode, RedrawEvents};
|
use nvim::{RepaintMode, RedrawEvents};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
23
src/main.rs
23
src/main.rs
@ -10,10 +10,10 @@ extern crate pangocairo;
|
|||||||
extern crate neovim_lib;
|
extern crate neovim_lib;
|
||||||
extern crate phf;
|
extern crate phf;
|
||||||
|
|
||||||
mod nvim;
|
|
||||||
mod ui_model;
|
mod ui_model;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod ui;
|
mod ui;
|
||||||
|
mod nvim;
|
||||||
mod shell;
|
mod shell;
|
||||||
mod input;
|
mod input;
|
||||||
mod settings;
|
mod settings;
|
||||||
@ -24,6 +24,7 @@ use std::env;
|
|||||||
use gio::ApplicationExt;
|
use gio::ApplicationExt;
|
||||||
|
|
||||||
use shell::Shell;
|
use shell::Shell;
|
||||||
|
use ui::SH;
|
||||||
|
|
||||||
const BIN_PATH_ARG: &'static str = "--nvim-bin-path";
|
const BIN_PATH_ARG: &'static str = "--nvim-bin-path";
|
||||||
|
|
||||||
@ -45,17 +46,21 @@ fn main() {
|
|||||||
fn activate(app: >k::Application) {
|
fn activate(app: >k::Application) {
|
||||||
ui::UI.with(|ui_cell| {
|
ui::UI.with(|ui_cell| {
|
||||||
let mut ui = ui_cell.borrow_mut();
|
let mut ui = ui_cell.borrow_mut();
|
||||||
if !ui.initialized {
|
if !ui.initialized {
|
||||||
ui.init(app);
|
ui.init(app);
|
||||||
|
|
||||||
let path = nvim_bin_path(std::env::args());
|
let path = nvim_bin_path(std::env::args());
|
||||||
nvim::initialize(&mut ui.shell, path.as_ref())
|
SHELL!(shell = {
|
||||||
.expect("Can't start nvim instance");
|
nvim::initialize(&mut shell, path.as_ref())
|
||||||
|
.expect("Can't start nvim instance");
|
||||||
|
|
||||||
guard_dispatch_thread(&mut ui.shell);
|
guard_dispatch_thread(&mut shell);
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
|
||||||
nvim::open_file(ui.shell.nvim(), open_arg().as_ref());
|
SHELL!(shell = {
|
||||||
|
nvim::open_file(shell.nvim(), open_arg().as_ref());
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ use neovim_lib::{Neovim, NeovimApi, Session, Value, Integer, UiAttachOptions, Ca
|
|||||||
use std::io::{Result, Error, ErrorKind};
|
use std::io::{Result, Error, ErrorKind};
|
||||||
use std::result;
|
use std::result;
|
||||||
use ui_model::{UiModel, ModelRect};
|
use ui_model::{UiModel, ModelRect};
|
||||||
use ui;
|
use ui::SH;
|
||||||
use shell::Shell;
|
use shell::Shell;
|
||||||
use glib;
|
use glib;
|
||||||
|
|
||||||
@ -191,9 +191,9 @@ fn safe_call<F>(cb: F)
|
|||||||
where F: Fn(&mut Shell) -> result::Result<(), String> + 'static + Send
|
where F: Fn(&mut Shell) -> result::Result<(), String> + 'static + Send
|
||||||
{
|
{
|
||||||
glib::idle_add(move || {
|
glib::idle_add(move || {
|
||||||
ui::UI.with(|ui_cell| if let Err(msg) = cb(&mut ui_cell.borrow_mut().shell) {
|
SHELL!(shell = { if let Err(msg) = cb(&mut shell) {
|
||||||
println!("Error call function: {}", msg);
|
println!("Error call function: {}", msg);
|
||||||
});
|
}});
|
||||||
glib::Continue(false)
|
glib::Continue(false)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
50
src/shell.rs
50
src/shell.rs
@ -17,7 +17,7 @@ use settings;
|
|||||||
use ui_model::{UiModel, Cell, Attrs, Color, ModelRect, COLOR_BLACK, COLOR_WHITE, COLOR_RED};
|
use ui_model::{UiModel, Cell, Attrs, Color, ModelRect, COLOR_BLACK, COLOR_WHITE, COLOR_RED};
|
||||||
use nvim::{RedrawEvents, GuiApi, RepaintMode};
|
use nvim::{RedrawEvents, GuiApi, RepaintMode};
|
||||||
use input::{convert_key, keyval_to_input_string};
|
use input::{convert_key, keyval_to_input_string};
|
||||||
use ui::{UI, Ui, SET};
|
use ui::{UI, SH, SET};
|
||||||
use cursor::Cursor;
|
use cursor::Cursor;
|
||||||
|
|
||||||
const DEFAULT_FONT_NAME: &'static str = "DejaVu Sans Mono 12";
|
const DEFAULT_FONT_NAME: &'static str = "DejaVu Sans Mono 12";
|
||||||
@ -256,20 +256,18 @@ fn gtk_key_press(_: &DrawingArea, ev: &EventKey) -> Inhibit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn gtk_draw(_: &DrawingArea, ctx: &cairo::Context) -> Inhibit {
|
fn gtk_draw(_: &DrawingArea, ctx: &cairo::Context) -> Inhibit {
|
||||||
UI.with(|ui_cell| {
|
SHELL!(shell = {
|
||||||
let mut ui = ui_cell.borrow_mut();
|
if shell.line_height.is_none() {
|
||||||
|
let (width, height) = calc_char_bounds(&shell, ctx);
|
||||||
if ui.shell.line_height.is_none() {
|
shell.line_height = Some(height as f64);
|
||||||
let (width, height) = calc_char_bounds(&ui.shell, ctx);
|
shell.char_width = Some(width as f64);
|
||||||
ui.shell.line_height = Some(height as f64);
|
|
||||||
ui.shell.char_width = Some(width as f64);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
draw(&ui.shell, ctx);
|
draw(&shell, ctx);
|
||||||
|
request_width(&mut shell);
|
||||||
request_width(&mut ui);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Inhibit(false)
|
Inhibit(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,27 +440,31 @@ fn calc_char_bounds(shell: &Shell, ctx: &cairo::Context) -> (i32, i32) {
|
|||||||
layout.get_pixel_size()
|
layout.get_pixel_size()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn request_width(ui: &mut Ui) {
|
fn request_width(shell: &mut Shell) {
|
||||||
if !ui.shell.request_width {
|
if !shell.request_width {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ui.shell.resize_timer.is_some() {
|
if shell.resize_timer.is_some() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ui.shell.request_width = false;
|
shell.request_width = false;
|
||||||
|
|
||||||
let width = ui.shell.drawing_area.get_allocated_width();
|
let width = shell.drawing_area.get_allocated_width();
|
||||||
let height = ui.shell.drawing_area.get_allocated_height();
|
let height = shell.drawing_area.get_allocated_height();
|
||||||
let request_height = (ui.shell.model.rows as f64 * ui.shell.line_height.unwrap()) as i32;
|
let request_height = (shell.model.rows as f64 * shell.line_height.unwrap()) as i32;
|
||||||
let request_width = (ui.shell.model.columns as f64 * ui.shell.char_width.unwrap()) as i32;
|
let request_width = (shell.model.columns as f64 * shell.char_width.unwrap()) as i32;
|
||||||
|
|
||||||
if width != request_width || height != request_height {
|
if width != request_width || height != request_height {
|
||||||
let window = ui.window.as_ref().unwrap();
|
UI.with(|ui_cell| {
|
||||||
let (win_width, win_height) = window.get_size();
|
let ui = ui_cell.borrow();
|
||||||
let h_border = win_width - width;
|
|
||||||
let v_border = win_height - height;
|
let window = ui.window.as_ref().unwrap();
|
||||||
window.resize(request_width + h_border, request_height + v_border);
|
let (win_width, win_height) = window.get_size();
|
||||||
|
let h_border = win_width - width;
|
||||||
|
let v_border = win_height - height;
|
||||||
|
window.resize(request_width + h_border, request_height + v_border);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
91
src/ui.rs
91
src/ui.rs
@ -21,20 +21,21 @@ macro_rules! ui_thread_var {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ui_thread_var!(UI, Ui, Ui::new());
|
ui_thread_var!(UI, Ui, Ui::new());
|
||||||
|
ui_thread_var!(SH, Shell, Shell::new());
|
||||||
ui_thread_var!(SET, settings::Settings, settings::Settings::new());
|
ui_thread_var!(SET, settings::Settings, settings::Settings::new());
|
||||||
|
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! SHELL {
|
macro_rules! SHELL {
|
||||||
(&$id:ident = $expr:expr) => (
|
(&$id:ident = $expr:expr) => (
|
||||||
UI.with(|ui_cell| {
|
SH.with(|shell_cell| {
|
||||||
let $id = &ui_cell.borrow().shell;
|
let $id = &shell_cell.borrow();
|
||||||
$expr
|
$expr
|
||||||
});
|
});
|
||||||
);
|
);
|
||||||
($id:ident = $expr:expr) => (
|
($id:ident = $expr:expr) => (
|
||||||
UI.with(|ui_cell| {
|
SH.with(|shell_cell| {
|
||||||
let mut $id = &mut ui_cell.borrow_mut().shell;
|
let mut $id = &mut shell_cell.borrow_mut();
|
||||||
$expr
|
$expr
|
||||||
});
|
});
|
||||||
);
|
);
|
||||||
@ -44,7 +45,6 @@ pub struct Ui {
|
|||||||
pub initialized: bool,
|
pub initialized: bool,
|
||||||
pub window: Option<ApplicationWindow>,
|
pub window: Option<ApplicationWindow>,
|
||||||
header_bar: HeaderBar,
|
header_bar: HeaderBar,
|
||||||
pub shell: Shell,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ui {
|
impl Ui {
|
||||||
@ -53,7 +53,6 @@ impl Ui {
|
|||||||
window: None,
|
window: None,
|
||||||
header_bar: HeaderBar::new(),
|
header_bar: HeaderBar::new(),
|
||||||
initialized: false,
|
initialized: false,
|
||||||
shell: Shell::new(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +62,9 @@ impl Ui {
|
|||||||
|
|
||||||
pub fn destroy(&mut self) {
|
pub fn destroy(&mut self) {
|
||||||
self.close_window();
|
self.close_window();
|
||||||
self.shell.nvim().ui_detach().expect("Error in ui_detach");
|
SHELL!(shell = {
|
||||||
|
shell.nvim().ui_detach().expect("Error in ui_detach");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init(&mut self, app: >k::Application) {
|
pub fn init(&mut self, app: >k::Application) {
|
||||||
@ -72,60 +73,58 @@ impl Ui {
|
|||||||
}
|
}
|
||||||
self.initialized = true;
|
self.initialized = true;
|
||||||
|
|
||||||
SET.with(|settings| {
|
SHELL!(shell = {
|
||||||
let mut settings = settings.borrow_mut();
|
SET.with(|settings| {
|
||||||
settings.init(&mut self.shell);
|
let mut settings = settings.borrow_mut();
|
||||||
|
settings.init(&mut shell);
|
||||||
|
});
|
||||||
|
|
||||||
|
self.header_bar.set_show_close_button(true);
|
||||||
|
|
||||||
|
let save_image = Image::new_from_icon_name("document-save",
|
||||||
|
gtk_sys::GTK_ICON_SIZE_SMALL_TOOLBAR as i32);
|
||||||
|
let save_btn = ToolButton::new(Some(&save_image), None);
|
||||||
|
save_btn.connect_clicked(|_| edit_save_all());
|
||||||
|
self.header_bar.pack_start(&save_btn);
|
||||||
|
|
||||||
|
let paste_image = Image::new_from_icon_name("edit-paste",
|
||||||
|
gtk_sys::GTK_ICON_SIZE_SMALL_TOOLBAR as i32);
|
||||||
|
let paste_btn = ToolButton::new(Some(&paste_image), None);
|
||||||
|
paste_btn.connect_clicked(|_| edit_paste());
|
||||||
|
self.header_bar.pack_start(&paste_btn);
|
||||||
|
|
||||||
|
shell.init();
|
||||||
|
|
||||||
|
self.window = Some(ApplicationWindow::new(app));
|
||||||
|
let window = self.window.as_ref().unwrap();
|
||||||
|
|
||||||
|
window.set_titlebar(Some(&self.header_bar));
|
||||||
|
window.add(&shell.drawing_area);
|
||||||
|
window.show_all();
|
||||||
|
window.connect_delete_event(gtk_delete);
|
||||||
|
window.set_title("Neovim-gtk");
|
||||||
|
|
||||||
|
shell.add_configure_event();
|
||||||
});
|
});
|
||||||
|
|
||||||
self.header_bar.set_show_close_button(true);
|
|
||||||
|
|
||||||
let save_image = Image::new_from_icon_name("document-save",
|
|
||||||
gtk_sys::GTK_ICON_SIZE_SMALL_TOOLBAR as i32);
|
|
||||||
let save_btn = ToolButton::new(Some(&save_image), None);
|
|
||||||
save_btn.connect_clicked(|_| edit_save_all());
|
|
||||||
self.header_bar.pack_start(&save_btn);
|
|
||||||
|
|
||||||
let paste_image = Image::new_from_icon_name("edit-paste",
|
|
||||||
gtk_sys::GTK_ICON_SIZE_SMALL_TOOLBAR as i32);
|
|
||||||
let paste_btn = ToolButton::new(Some(&paste_image), None);
|
|
||||||
paste_btn.connect_clicked(|_| edit_paste());
|
|
||||||
self.header_bar.pack_start(&paste_btn);
|
|
||||||
|
|
||||||
self.shell.init();
|
|
||||||
|
|
||||||
self.window = Some(ApplicationWindow::new(app));
|
|
||||||
let window = self.window.as_ref().unwrap();
|
|
||||||
|
|
||||||
window.set_titlebar(Some(&self.header_bar));
|
|
||||||
window.add(&self.shell.drawing_area);
|
|
||||||
window.show_all();
|
|
||||||
window.connect_delete_event(gtk_delete);
|
|
||||||
window.set_title("Neovim-gtk");
|
|
||||||
|
|
||||||
self.shell.add_configure_event();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn edit_paste() {
|
fn edit_paste() {
|
||||||
UI.with(|ui_cell| {
|
SHELL!(shell = {
|
||||||
let mut ui = ui_cell.borrow_mut();
|
let paste_command = if shell.mode == NvimMode::Normal {
|
||||||
|
|
||||||
let paste_command = if ui.shell.mode == NvimMode::Normal {
|
|
||||||
"\"*p"
|
"\"*p"
|
||||||
} else {
|
} else {
|
||||||
"<Esc>\"*pa"
|
"<Esc>\"*pa"
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut nvim = ui.shell.nvim();
|
let mut nvim = shell.nvim();
|
||||||
nvim.input(paste_command).report_err(nvim);
|
nvim.input(paste_command).report_err(nvim);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn edit_save_all() {
|
fn edit_save_all() {
|
||||||
UI.with(|ui_cell| {
|
SHELL!(shell = {
|
||||||
let mut ui = ui_cell.borrow_mut();
|
let mut nvim = shell.nvim();
|
||||||
|
|
||||||
let mut nvim = ui.shell.nvim();
|
|
||||||
nvim.command(":wa").report_err(nvim);
|
nvim.command(":wa").report_err(nvim);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user