2
* Copyright (C) 1984-2000 Mark Nudelman
4
* You may distribute under the terms of either the GNU General Public
5
* License or the Less License, as specified in the README file.
7
* For more information about less, or for information on how to
8
* contact the author, see the README file.
13
* Routines dealing with signals.
15
* A signal usually merely causes a bit to be set in the "signals" word.
16
* At some convenient time, the mainline code checks to see if any
17
* signals need processing by calling psignal().
18
* If we happen to be reading from a file [in iread()] at the time
19
* the signal is received, we call intread to interrupt the iread.
26
* "sigs" contains bits indicating signals which need to be processed.
30
extern int sc_width, sc_height;
31
extern int screen_trashed;
38
* Interrupt signal handler.
46
LSIGNAL(SIGINT, SIG_ACK);
48
LSIGNAL(SIGINT, u_interrupt);
50
#if MSDOS_COMPILER==DJGPPC
52
* If a keyboard has been hit, it must be Ctrl-C
53
* (as opposed to Ctrl-Break), so consume it.
54
* (Otherwise, Less will beep when it sees Ctrl-C from keyboard.)
65
* "Stop" (^Z) signal handler.
72
LSIGNAL(SIGTSTP, stop);
81
* "Window" change handler
88
LSIGNAL(SIGWINCH, winch);
96
* "Window" change handler
103
LSIGNAL(SIGWIND, winch);
111
#if MSDOS_COMPILER==WIN32C
113
* Handle CTRL-C and CTRL-BREAK keys.
118
wbreak_handler(dwCtrlType)
124
case CTRL_BREAK_EVENT:
135
* Set up the signal handlers.
144
* Set signal handlers.
146
(void) LSIGNAL(SIGINT, u_interrupt);
147
#if MSDOS_COMPILER==WIN32C
148
SetConsoleCtrlHandler(wbreak_handler, TRUE);
151
(void) LSIGNAL(SIGTSTP, stop);
154
(void) LSIGNAL(SIGWINCH, winch);
157
(void) LSIGNAL(SIGWIND, winch);
160
(void) LSIGNAL(SIGQUIT, SIG_IGN);
166
* Restore signals to defaults.
168
(void) LSIGNAL(SIGINT, SIG_DFL);
169
#if MSDOS_COMPILER==WIN32C
170
SetConsoleCtrlHandler(wbreak_handler, FALSE);
173
(void) LSIGNAL(SIGTSTP, SIG_DFL);
176
(void) LSIGNAL(SIGWINCH, SIG_IGN);
179
(void) LSIGNAL(SIGWIND, SIG_IGN);
182
(void) LSIGNAL(SIGQUIT, SIG_DFL);
188
* Process any signals we have received.
189
* A received signal cause a bit to be set in "sigs".
194
register int tsignals;
196
if ((tsignals = sigs) == 0)
201
if (tsignals & S_STOP)
204
* Clean up the terminal.
207
LSIGNAL(SIGTTOU, SIG_IGN);
214
LSIGNAL(SIGTTOU, SIG_DFL);
216
LSIGNAL(SIGTSTP, SIG_DFL);
217
kill(getpid(), SIGTSTP);
220
* Hopefully we'll be back later and resume here...
221
* Reset the terminal and arrange to repaint the
222
* screen when we get back to the main command loop.
224
LSIGNAL(SIGTSTP, stop);
232
if (tsignals & S_WINCH)
234
int old_width, old_height;
236
* Re-execute scrsize() to read the new window size.
238
old_width = sc_width;
239
old_height = sc_height;
241
if (sc_width != old_width || sc_height != old_height)
243
wscroll = (sc_height + 1) / 2;
248
if (tsignals & S_INTERRUPT)
252
* {{ You may wish to replace the bell() with
253
* error("Interrupt", NULL_PARG); }}
257
* If we were interrupted while in the "calculating
258
* line numbers" loop, turn off line numbers.
266
error("Line numbers turned off", NULL_PARG);