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:
parent
f066014d33
commit
de3ff78b22
|
@ -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);
|
||||
|
|
|
@ -121,6 +121,7 @@ private:
|
|||
|
||||
DisplayCoord m_dimensions;
|
||||
termios m_original_termios{};
|
||||
int m_original_stdin_flags;
|
||||
|
||||
void set_raw_mode() const;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user