diff options
Diffstat (limited to 'ttwhy/terminal')
| -rw-r--r-- | ttwhy/terminal/scoped_attributes.cppm | 29 | ||||
| -rw-r--r-- | ttwhy/terminal/signal_handling.cppm | 3 |
2 files changed, 31 insertions, 1 deletions
diff --git a/ttwhy/terminal/scoped_attributes.cppm b/ttwhy/terminal/scoped_attributes.cppm index 56fbe58..2d82826 100644 --- a/ttwhy/terminal/scoped_attributes.cppm +++ b/ttwhy/terminal/scoped_attributes.cppm @@ -150,9 +150,38 @@ namespace ttwhy::terminal return std::move(*this); } + //! Capture the currently active terminal mode and mark the attributes as suspended. + //! + //! Must be called before the terminal mode is changed while the process is being stopped. + auto suspend() & -> scoped_attributes & + { + if (m_file_descriptor > 0) + { + m_suspended = true; + m_suspended_canonical = canonical_mode(); + m_suspended_echo = echo(); + } + return *this; + } + + //! Restore the terminal mode captured before suspension. + auto resume() & -> scoped_attributes & + { + if (m_suspended) + { + canonical_mode(m_suspended_canonical); + echo(m_suspended_echo); + m_suspended = false; + } + return *this; + } + private: int m_file_descriptor; termios m_attributes; + bool m_suspended{false}; + bool m_suspended_canonical{false}; + bool m_suspended_echo{false}; }; } // namespace ttwhy::terminal diff --git a/ttwhy/terminal/signal_handling.cppm b/ttwhy/terminal/signal_handling.cppm index b0a3542..2921b96 100644 --- a/ttwhy/terminal/signal_handling.cppm +++ b/ttwhy/terminal/signal_handling.cppm @@ -49,13 +49,14 @@ namespace ttwhy::terminal } case SIGTSTP: { + attributes.suspend(); attributes.canonical_mode(true).echo(true); ::raise(SIGSTOP); break; } case SIGCONT: { - attributes.canonical_mode(false).echo(false); + attributes.resume(); break; } } |
