18
18
#define NSIG (_SIGMAX + 1 ) /* For QNX */
19
19
#endif
20
20
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
+
21
38
const std::size_t Term::Private::Signals::m_signals_number{NSIG - 1 };
22
39
23
40
void Term::Private::Signals::setHandler (const sighandler_t & handler) noexcept
24
41
{
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
26
53
}
27
54
28
55
Term::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
61
88
}
62
89
}
63
90
91
+ void Term::Private::Signals::reset_and_raise (Term::Terminal& term) noexcept
92
+ {
93
+ term.clean ();
94
+ }
95
+
64
96
void Term::Private::Signals::reset_and_raise (int sign, std::vector<sighandler_t >& m_han, Term::Terminal& term) noexcept
65
97
{
66
98
const static std::vector<int > termin{
67
99
#if defined(SIGHUP)
68
100
SIGHUP,
69
101
#endif
70
- #if defined(SIGHUP )
102
+ #if defined(SIGINT )
71
103
SIGINT,
72
104
#endif
73
105
#if defined(SIGQUIT)
74
106
SIGQUIT,
75
107
#endif
76
- #if defined(SIGQUIT )
108
+ #if defined(SIGILL )
77
109
SIGILL,
78
110
#endif
79
111
#if defined(SIGTRAP)
80
112
SIGTRAP,
81
113
#endif
82
- #if defined(SIGTRAP )
114
+ #if defined(SIGABRT )
83
115
SIGABRT,
84
116
#endif
85
117
#if defined(SIGIOT)
@@ -88,7 +120,7 @@ void Term::Private::Signals::reset_and_raise(int sign, std::vector<sighandler_t>
88
120
#if defined(SIGBUS)
89
121
SIGBUS,
90
122
#endif
91
- #if defined(SIGBUS )
123
+ #if defined(SIGFPE )
92
124
SIGFPE,
93
125
#endif
94
126
#if defined(SIGKILL)
@@ -103,7 +135,7 @@ void Term::Private::Signals::reset_and_raise(int sign, std::vector<sighandler_t>
103
135
#if defined(SIGUSR2)
104
136
SIGUSR2,
105
137
#endif
106
- #if defined(SIGUSR2 )
138
+ #if defined(SIGPIPE )
107
139
SIGPIPE,
108
140
#endif
109
141
#if defined(SIGALRM)
@@ -127,7 +159,7 @@ void Term::Private::Signals::reset_and_raise(int sign, std::vector<sighandler_t>
127
159
#if defined(SIGPROF)
128
160
SIGPROF,
129
161
#endif
130
- #if defined(SIGPROF )
162
+ #if defined(SIGIO )
131
163
SIGIO,
132
164
#endif
133
165
#if defined(SIGPOLL)
0 commit comments