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.
This commit is contained in:
Maxime Coste 2019-09-24 23:28:11 +10:00
parent f066014d33
commit de3ff78b22
2 changed files with 6 additions and 1 deletions

View File

@ -361,6 +361,7 @@ NCursesUI::NCursesUI()
}}, }},
m_assistant(assistant_clippy) m_assistant(assistant_clippy)
{ {
m_original_stdin_flags = fcntl(STDIN_FILENO, F_GETFL, 0);
tcgetattr(STDIN_FILENO, &m_original_termios); tcgetattr(STDIN_FILENO, &m_original_termios);
initscr(); initscr();
@ -385,6 +386,7 @@ NCursesUI::~NCursesUI()
m_palette.set_change_colors(false); m_palette.set_change_colors(false);
endwin(); endwin();
tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios); 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(SIGWINCH, SIG_DFL);
set_signal_handler(SIGCONT, SIG_DFL); set_signal_handler(SIGCONT, SIG_DFL);
set_signal_handler(SIGTSTP, SIG_DFL); set_signal_handler(SIGTSTP, SIG_DFL);
@ -404,9 +406,11 @@ void NCursesUI::suspend()
sigaddset(&unblock_sigtstp, SIGTSTP); sigaddset(&unblock_sigtstp, SIGTSTP);
sigprocmask(SIG_UNBLOCK, &unblock_sigtstp, &old_mask); sigprocmask(SIG_UNBLOCK, &unblock_sigtstp, &old_mask);
tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios); tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios);
fcntl(STDIN_FILENO, F_SETFL, m_original_stdin_flags);
raise(SIGTSTP); // suspend here raise(SIGTSTP); // suspend here
m_original_stdin_flags = fcntl(STDIN_FILENO, F_GETFL, 0);
tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios); tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios);
set_signal_handler(SIGTSTP, current); set_signal_handler(SIGTSTP, current);
sigprocmask(SIG_SETMASK, &old_mask, nullptr); sigprocmask(SIG_SETMASK, &old_mask, nullptr);
@ -420,7 +424,7 @@ void NCursesUI::suspend()
void NCursesUI::set_raw_mode() const 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; termios attr = m_original_termios;
attr.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); attr.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);

View File

@ -121,6 +121,7 @@ private:
DisplayCoord m_dimensions; DisplayCoord m_dimensions;
termios m_original_termios{}; termios m_original_termios{};
int m_original_stdin_flags;
void set_raw_mode() const; void set_raw_mode() const;