Skip to content

Commit 095316b

Browse files
committed
Add CTRL+C handler
1 parent 728cbb3 commit 095316b

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

cpp-terminal/private/signals.cpp

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,38 @@
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+
2138
const std::size_t Term::Private::Signals::m_signals_number{NSIG - 1};
2239

2340
void 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

2855
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
6188
}
6289
}
6390

91+
void Term::Private::Signals::reset_and_raise(Term::Terminal& term) noexcept
92+
{
93+
term.clean();
94+
}
95+
6496
void 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)

cpp-terminal/private/signals.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class Signals
2525
~Signals() noexcept {}
2626
void setHandler(const sighandler_t& handler) noexcept;
2727
static void reset_and_raise(int sign, std::vector<sighandler_t>& m_han, Term::Terminal&) noexcept;
28+
static void reset_and_raise(Term::Terminal&) noexcept;
2829

2930
private:
3031
const static std::size_t m_signals_number;

0 commit comments

Comments
 (0)