on master help sign in
fix: Handle signals before crossterm events (#6170)

This is a workaround for a freeze when suspending Helix with C-z on non-Windows systems. The check for the keyboard enhancement protocol locks up crossterm's internal event reading/polling system by trying to set up multiple concurrent readers. `input_stream.next()` sets up one reader looking for regular crossterm events while the `supports_keyboard_enhancement` query sets up another looking for internal events. The latter hangs for two seconds or until the former yields an event. By handling signals first we don't lock up the mutex by trying to read keyboard events.

commita2e54167d8f9ad8764ba586488d3995aeb33a559 authorAlexander Brevig <alexanderbrevig@gmail.com> dateSun 5 Mar 2023, 02:52 (4 years ago) parentbf87236
1 file changed+3−3
helix-term/src/application.rs+3−3
helix-term/src/application.rs+3−3
@@ -345,12 +345,12 @@ impl Application {
345345 tokio::select! {
346346 biased;
347347
348− Some(event) = input_stream.next() => {
349− self.handle_terminal_events(event).await;
350− }
351348 Some(signal) = self.signals.next() => {
352349 self.handle_signals(signal).await;
353350 }
351+ Some(event) = input_stream.next() => {
352+ self.handle_terminal_events(event).await;
353+ }
354354 Some(callback) = self.jobs.futures.next() => {
355355 self.jobs.handle_callback(&mut self.editor, &mut self.compositor, callback);
356356 self.render().await;