cpp-terminal 1.0.0
Small C++ library for writing multiplatform terminal applications
Loading...
Searching...
No Matches
signals.cpp
Go to the documentation of this file.
1/*
2* cpp-terminal
3* C++ library for writing multi-platform terminal applications.
4*
5* SPDX-FileCopyrightText: 2019-2025 cpp-terminal
6*
7* SPDX-License-Identifier: MIT
8*/
9
11
13
14#include <algorithm>
15#include <csignal>
16
17#ifndef NSIG
18 #define NSIG (_SIGMAX + 1) /* For QNX */
19#endif
20
21#ifdef _WIN32
22 #pragma warning(push)
23 #pragma warning(disable : 4668)
24 #include <windows.h>
25 #pragma warning(pop)
26static BOOL WINAPI consoleHandler(DWORD signal)
27{
28 switch(signal)
29 {
30 case CTRL_C_EVENT:
31 case CTRL_BREAK_EVENT:
32 {
34 return false;
35 }
36 default: return false;
37 }
38}
39#endif
40
41void Term::Private::Signals::clean_terminal() noexcept { const_cast<Term::Terminal*>(m_term)->clean(); }
42
44
46{
47 for(std::size_t signal = 0; signal != m_signals_number; ++signal)
48 {
49#ifdef _WIN32
50 if(signal != SIGINT) sighandler_t hand = std::signal(signal, handler);
51#else
52 sighandler_t hand = std::signal(signal, handler);
53#endif
54 }
55#ifdef _WIN32
56 SetConsoleCtrlHandler(consoleHandler, TRUE);
57#endif
58}
59
61
63{
66 for(std::size_t signal = 0; signal != m_signals_number; ++signal)
67 {
68 //if(std::find(ignore.begin(),ignore.end(),signal)==ignore.end())
69 //{
70 sighandler_t old = std::signal(signal, SIG_DFL);
71 //sighandler_t dumb=std::signal(signal, old);
72 m_handlers.push_back(old);
73 //}
74 //else
75 //{
76 // std::signal(signal, SIG_IGN);
77 // m_han.push_back(std::signal(signal, SIG_IGN));
78 // }
79 }
80}
81
82void Term::Private::Signals::reset_and_raise(const int& sign) noexcept
83{
85 const static std::vector<int> termin{
86#if defined(SIGHUP)
87 SIGHUP,
88#endif
89#if defined(SIGINT)
90 SIGINT,
91#endif
92#if defined(SIGQUIT)
93 SIGQUIT,
94#endif
95#if defined(SIGILL)
96 SIGILL,
97#endif
98#if defined(SIGTRAP)
99 SIGTRAP,
100#endif
101#if defined(SIGABRT)
102 SIGABRT,
103#endif
104#if defined(SIGIOT)
105 SIGIOT,
106#endif
107#if defined(SIGBUS)
108 SIGBUS,
109#endif
110#if defined(SIGFPE)
111 SIGFPE,
112#endif
113#if defined(SIGKILL)
114 SIGKILL,
115#endif
116#if defined(SIGUSR1)
117 SIGUSR1,
118#endif
119#if defined(SIGSEGV)
120 SIGSEGV,
121#endif
122#if defined(SIGUSR2)
123 SIGUSR2,
124#endif
125#if defined(SIGPIPE)
126 SIGPIPE,
127#endif
128#if defined(SIGALRM)
129 SIGALRM,
130#endif
131#if defined(SIGSTKFLT)
132 SIGSTKFLT,
133#endif
134#if defined(SIGCONT)
135 SIGCONT,
136#endif
137#if defined(SIGXCPU)
138 SIGXCPU,
139#endif
140#if defined(SIGXFSZ)
141 SIGXFSZ,
142#endif
143#if defined(SIGVTALRM)
144 SIGVTALRM,
145#endif
146#if defined(SIGPROF)
147 SIGPROF,
148#endif
149#if defined(SIGIO)
150 SIGIO,
151#endif
152#if defined(SIGPOLL)
153 SIGPOLL,
154#endif
155#if defined(SIGPWR)
156 SIGPWR,
157#endif
158#if defined(SIGSYS)
159 SIGSYS,
160#endif
161#if defined(SIGUNUSED)
162 SIGUNUSED,
163#endif
164#if defined(SIGUNUSED)
165 SIGUNUSED,
166#endif
167#if defined(SIGTERM)
168 SIGTERM
169#endif
170 };
171 if(std::find(termin.begin(), termin.end(), sign) != termin.end())
172 {
173 sighandler_t old = std::signal(sign, m_handlers[sign]);
174 old = std::signal(sign, m_handlers[sign]);
175 std::raise(sign);
176 }
177}
static const std::size_t m_signals_number
Definition signals.hpp:43
static void clean_terminal() noexcept
Definition signals.cpp:41
Signals(const Terminal &) noexcept
Definition signals.cpp:62
void setHandler(const sighandler_t &handler) noexcept
Definition signals.cpp:45
void reset_and_raise(const int &sign) noexcept
Definition signals.cpp:82
std::vector< sighandler_t > m_handlers
Definition signals.hpp:35
static const Term::Terminal * m_term
Definition signals.hpp:60
Term::Terminal & terminal
Definition terminal.cpp:19
#define NSIG
Definition signals.cpp:18
void(*)(int) sighandler_t
Definition signals.hpp:14