@@ -19,9 +19,12 @@ use crossterm::{
19 execute, terminal,
19 execute, terminal,
21#[cfg(not(windows))]
21#[cfg(not(windows))]
22−use signal_hook::{consts::signal, low_level};
23+ signal_hook::{consts::signal, low_level},
24+ signal_hook_tokio::Signals,
23−#[cfg(not(windows))]
26+#[cfg(windows)]
24−use signal_hook_tokio::Signals;
27+type Signals = futures_util::stream::Empty<()>;
26pub struct Application {
29pub struct Application {
27 compositor: Compositor,
30 compositor: Compositor,
@@ -40,7 +43,6 @@ pub struct Application {
40 #[allow(dead_code)]
43 #[allow(dead_code)]
41 syn_loader: Arc<syntax::Loader>,
44 syn_loader: Arc<syntax::Loader>,
44 signals: Signals,
46 signals: Signals,
45 jobs: Jobs,
47 jobs: Jobs,
46 lsp_progress: LspProgressMap,
48 lsp_progress: LspProgressMap,
@@ -108,6 +110,8 @@ impl Application {
109 editor.set_theme(theme);
111 editor.set_theme(theme);
114+ let signals = futures_util::stream::empty();
111 #[cfg(not(windows))]
115 #[cfg(not(windows))]
112 let signals = Signals::new(&[signal::SIGTSTP, signal::SIGCONT])?;
116 let signals = Signals::new(&[signal::SIGTSTP, signal::SIGCONT])?;
@@ -120,7 +124,6 @@ impl Application {
120 theme_loader,
124 theme_loader,
121 syn_loader,
125 syn_loader,
123− #[cfg(not(windows))]
125 jobs: Jobs::new(),
128 jobs: Jobs::new(),
126 lsp_progress: LspProgressMap::new(),
129 lsp_progress: LspProgressMap::new(),
@@ -158,7 +161,6 @@ impl Application {
159 use futures_util::StreamExt;
162 use futures_util::StreamExt;
161− #[cfg(not(windows))]
162 tokio::select! {
164 tokio::select! {
@@ -166,23 +168,7 @@ impl Application {
166 self.handle_terminal_events(event)
168 self.handle_terminal_events(event)
168 Some(signal) = self.signals.next() => {
170 Some(signal) = self.signals.next() => {
169− use helix_view::graphics::Rect;
171+ self.handle_signals(signal).await;
171− signal::SIGTSTP => {
172− self.compositor.save_cursor();
173− self.restore_term().unwrap();
174− low_level::emulate_default_handler(signal::SIGTSTP).unwrap();
176− signal::SIGCONT => {
177− self.claim_term().await.unwrap();
178− // redraw the terminal
179− let Rect { width, height, .. } = self.compositor.size();
180− self.compositor.resize(width, height);
181− self.compositor.load_cursor();
184− _ => unreachable!(),
187 Some((id, call)) = self.editor.language_servers.incoming.next() => {
173 Some((id, call)) = self.editor.language_servers.incoming.next() => {
188 self.handle_language_server_message(call, id).await;
174 self.handle_language_server_message(call, id).await;
@@ -202,31 +188,31 @@ impl Application {
202 self.render();
188 self.render();
205− #[cfg(windows)]
191+ }
206− tokio::select! {
192+ }
209− event = reader.next() => {
194+ #[cfg(windows)]
210− self.handle_terminal_events(event)
195+ // no signal handling available on windows
211− }
196+ pub async fn handle_signals(&mut self, _signal: ()) {}
212− Some((id, call)) = self.editor.language_servers.incoming.next() => {
197+
213− self.handle_language_server_message(call, id).await;
198+ #[cfg(not(windows))]
214− // limit render calls for fast language server messages
199+ pub async fn handle_signals(&mut self, signal: i32) {
215− let last = self.editor.language_servers.incoming.is_empty();
200+ use helix_view::graphics::Rect;
216− if last || last_render.elapsed() > deadline {
201+ match signal {
217− self.render();
202+ signal::SIGTSTP => {
218− last_render = Instant::now();
203+ self.compositor.save_cursor();
219− }
204+ self.restore_term().unwrap();
220− }
205+ low_level::emulate_default_handler(signal::SIGTSTP).unwrap();
221− Some(callback) = self.jobs.futures.next() => {
206+ }
222− self.jobs.handle_callback(&mut self.editor, &mut self.compositor, callback);
207+ signal::SIGCONT => {
223− self.render();
208+ self.claim_term().await.unwrap();
224− }
209+ // redraw the terminal
225− Some(callback) = self.jobs.wait_futures.next() => {
210+ let Rect { width, height, .. } = self.compositor.size();
226− self.jobs.handle_callback(&mut self.editor, &mut self.compositor, callback);
211+ self.compositor.resize(width, height);
212+ self.compositor.load_cursor();
227− self.render();
213+ self.render();
215+ _ => unreachable!(),