From de3ff78b22a37f628f5208668f9aed02a7de6606 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 24 Sep 2019 23:28:11 +1000 Subject: [PATCH] Restore stdin status flags on suspend and quit Those flags are shared with the parent process, so the non-block flag added impacts their execution. --- src/ncurses_ui.cc | 6 +++++- src/ncurses_ui.hh | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ncurses_ui.cc b/src/ncurses_ui.cc index 8f9dac98..13859088 100644 --- a/src/ncurses_ui.cc +++ b/src/ncurses_ui.cc @@ -361,6 +361,7 @@ NCursesUI::NCursesUI() }}, m_assistant(assistant_clippy) { + m_original_stdin_flags = fcntl(STDIN_FILENO, F_GETFL, 0); tcgetattr(STDIN_FILENO, &m_original_termios); initscr(); @@ -385,6 +386,7 @@ NCursesUI::~NCursesUI() m_palette.set_change_colors(false); endwin(); tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios); + fcntl(STDIN_FILENO, F_SETFL, m_original_stdin_flags); set_signal_handler(SIGWINCH, SIG_DFL); set_signal_handler(SIGCONT, SIG_DFL); set_signal_handler(SIGTSTP, SIG_DFL); @@ -404,9 +406,11 @@ void NCursesUI::suspend() sigaddset(&unblock_sigtstp, SIGTSTP); sigprocmask(SIG_UNBLOCK, &unblock_sigtstp, &old_mask); tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios); + fcntl(STDIN_FILENO, F_SETFL, m_original_stdin_flags); raise(SIGTSTP); // suspend here + m_original_stdin_flags = fcntl(STDIN_FILENO, F_GETFL, 0); tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios); set_signal_handler(SIGTSTP, current); sigprocmask(SIG_SETMASK, &old_mask, nullptr); @@ -420,7 +424,7 @@ void NCursesUI::suspend() void NCursesUI::set_raw_mode() const { - fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK); + fcntl(STDIN_FILENO, F_SETFL, m_original_stdin_flags | O_NONBLOCK); termios attr = m_original_termios; attr.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); diff --git a/src/ncurses_ui.hh b/src/ncurses_ui.hh index 3a7b406a..296d6ca3 100644 --- a/src/ncurses_ui.hh +++ b/src/ncurses_ui.hh @@ -121,6 +121,7 @@ private: DisplayCoord m_dimensions; termios m_original_termios{}; + int m_original_stdin_flags; void set_raw_mode() const;