1818 #define NSIG (_SIGMAX + 1 ) /* For QNX */
1919#endif
2020
21+ #ifdef _WIN32
22+ #include < windows.h>
23+ static BOOL WINAPI consoleHandler (DWORD signal)
24+ {
25+ switch (signal)
26+ {
27+ case CTRL_C_EVENT:
28+ case CTRL_BREAK_EVENT:
29+ {
30+ Term::Private::Signals::reset_and_raise (Term::terminal);
31+ return false ;
32+ }
33+ default : return false ;
34+ }
35+ }
36+ #endif
37+
2138const std::size_t Term::Private::Signals::m_signals_number{NSIG - 1 };
2239
2340void Term::Private::Signals::setHandler (const sighandler_t & handler) noexcept
2441{
25- for (std::size_t signal = 0 ; signal != m_signals_number; ++signal) { sighandler_t hand = std::signal (signal, handler); }
42+ for (std::size_t signal = 0 ; signal != m_signals_number; ++signal)
43+ {
44+ #ifdef _WIN32
45+ if (signal!=SIGINT) sighandler_t hand = std::signal (signal, handler);
46+ #else
47+ sighandler_t hand = std::signal (signal, handler);
48+ #endif
49+ }
50+ #ifdef _WIN32
51+ SetConsoleCtrlHandler (consoleHandler, TRUE );
52+ #endif
2653}
2754
2855Term::Private::Signals::Signals (std::vector<sighandler_t >& m_han) noexcept
@@ -61,25 +88,30 @@ Term::Private::Signals::Signals(std::vector<sighandler_t>& m_han) noexcept
6188 }
6289}
6390
91+ void Term::Private::Signals::reset_and_raise (Term::Terminal& term) noexcept
92+ {
93+ term.clean ();
94+ }
95+
6496void Term::Private::Signals::reset_and_raise (int sign, std::vector<sighandler_t >& m_han, Term::Terminal& term) noexcept
6597{
6698 const static std::vector<int > termin{
6799#if defined(SIGHUP)
68100 SIGHUP,
69101#endif
70- #if defined(SIGHUP )
102+ #if defined(SIGINT )
71103 SIGINT,
72104#endif
73105#if defined(SIGQUIT)
74106 SIGQUIT,
75107#endif
76- #if defined(SIGQUIT )
108+ #if defined(SIGILL )
77109 SIGILL,
78110#endif
79111#if defined(SIGTRAP)
80112 SIGTRAP,
81113#endif
82- #if defined(SIGTRAP )
114+ #if defined(SIGABRT )
83115 SIGABRT,
84116#endif
85117#if defined(SIGIOT)
@@ -88,7 +120,7 @@ void Term::Private::Signals::reset_and_raise(int sign, std::vector<sighandler_t>
88120#if defined(SIGBUS)
89121 SIGBUS,
90122#endif
91- #if defined(SIGBUS )
123+ #if defined(SIGFPE )
92124 SIGFPE,
93125#endif
94126#if defined(SIGKILL)
@@ -103,7 +135,7 @@ void Term::Private::Signals::reset_and_raise(int sign, std::vector<sighandler_t>
103135#if defined(SIGUSR2)
104136 SIGUSR2,
105137#endif
106- #if defined(SIGUSR2 )
138+ #if defined(SIGPIPE )
107139 SIGPIPE,
108140#endif
109141#if defined(SIGALRM)
@@ -127,7 +159,7 @@ void Term::Private::Signals::reset_and_raise(int sign, std::vector<sighandler_t>
127159#if defined(SIGPROF)
128160 SIGPROF,
129161#endif
130- #if defined(SIGPROF )
162+ #if defined(SIGIO )
131163 SIGIO,
132164#endif
133165#if defined(SIGPOLL)
0 commit comments