diff --git a/src/nvim/client.rs b/src/nvim/client.rs index 5e34554e..e4686083 100644 --- a/src/nvim/client.rs +++ b/src/nvim/client.rs @@ -23,6 +23,16 @@ impl<'a> NeovimRef<'a> { NeovimRef::SingleThreaded(nvim) } + fn try_nvim_async(nvim_async: &'a NeovimClientAsync) -> Option> { + let guard = nvim_async.nvim.try_lock(); + + if let Ok(guard) = guard { + Some(NeovimRef::MultiThreaded(guard)) + } else { + None + } + } + fn from_nvim_async(nvim_async: &'a NeovimClientAsync) -> Option> { let guard = nvim_async.nvim.lock().unwrap(); @@ -77,6 +87,10 @@ impl NeovimClientAsync { pub fn borrow(&self) -> Option { NeovimRef::from_nvim_async(self) } + + pub fn try_borrow(&self) -> Option { + NeovimRef::try_nvim_async(self) + } } impl Clone for NeovimClientAsync { @@ -146,6 +160,19 @@ impl NeovimClient { self.state.get() == NeovimClientState::InitInProgress } + /// In case neovimref locked in another thread + /// this method can return None + pub fn try_nvim(&self) -> Option { + let nvim = self.nvim.borrow_mut(); + if nvim.is_some() { + Some(NeovimRef::from_nvim(RefMut::map(nvim, |n| { + n.as_mut().unwrap() + }))) + } else { + self.nvim_async.try_borrow() + } + } + pub fn nvim(&self) -> Option { let nvim = self.nvim.borrow_mut(); if nvim.is_some() { diff --git a/src/shell.rs b/src/shell.rs index f4c0291f..bbb71c1c 100644 --- a/src/shell.rs +++ b/src/shell.rs @@ -435,15 +435,18 @@ impl State { let resize_timer = self.resize_timer.clone(); let resize_id = gtk::timeout_add(200, move || { - resize_timer.set(None); - - if let Some(mut nvim) = nvim.nvim() { + if let Some(mut nvim) = nvim.try_nvim() { debug!("ui_try_resize {}/{}", columns, rows); + resize_timer.set(None); + nvim.ui_try_resize_async(columns as u64, rows as u64) .cb(|r| r.report_err()) .call(); + + return Continue(false); } - Continue(false) + + Continue(true) }); self.resize_timer.set(Some(resize_id));