SDL  2.0
SDL_quit.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "../SDL_internal.h"
22 #include "SDL_hints.h"
23 #include "SDL_assert.h"
24 
25 /* General quit handling code for SDL */
26 
27 #ifdef HAVE_SIGNAL_H
28 #include <signal.h>
29 #endif
30 
31 #include "SDL_events.h"
32 #include "SDL_events_c.h"
33 
36 
37 #ifdef HAVE_SIGNAL_H
38 static void
39 SDL_HandleSIG(int sig)
40 {
41  /* Reset the signal handler */
42  signal(sig, SDL_HandleSIG);
43 
44  /* Send a quit event next time the event loop pumps. */
45  /* We can't send it in signal handler; malloc() might be interrupted! */
47 }
48 #endif /* HAVE_SIGNAL_H */
49 
50 /* Public functions */
51 static int
53 {
54 #ifdef HAVE_SIGACTION
55  struct sigaction action;
56  sigaction(SIGINT, NULL, &action);
57 #ifdef HAVE_SA_SIGACTION
58  if ( action.sa_handler == SIG_DFL && (void (*)(int))action.sa_sigaction == SIG_DFL ) {
59 #else
60  if ( action.sa_handler == SIG_DFL ) {
61 #endif
62  action.sa_handler = SDL_HandleSIG;
63  sigaction(SIGINT, &action, NULL);
64  }
65  sigaction(SIGTERM, NULL, &action);
66 
67 #ifdef HAVE_SA_SIGACTION
68  if ( action.sa_handler == SIG_DFL && (void (*)(int))action.sa_sigaction == SIG_DFL ) {
69 #else
70  if ( action.sa_handler == SIG_DFL ) {
71 #endif
72  action.sa_handler = SDL_HandleSIG;
73  sigaction(SIGTERM, &action, NULL);
74  }
75 #elif HAVE_SIGNAL_H
76  void (*ohandler) (int);
77 
78  /* Both SIGINT and SIGTERM are translated into quit interrupts */
79  ohandler = signal(SIGINT, SDL_HandleSIG);
80  if (ohandler != SIG_DFL)
81  signal(SIGINT, ohandler);
82  ohandler = signal(SIGTERM, SDL_HandleSIG);
83  if (ohandler != SIG_DFL)
84  signal(SIGTERM, ohandler);
85 #endif /* HAVE_SIGNAL_H */
86 
87  /* That's it! */
88  return 0;
89 }
90 
91 int
93 {
95  return SDL_QuitInit_Internal();
96  }
97  return 0;
98 }
99 
100 static void
102 {
103 #ifdef HAVE_SIGACTION
104  struct sigaction action;
105  sigaction(SIGINT, NULL, &action);
106  if ( action.sa_handler == SDL_HandleSIG ) {
107  action.sa_handler = SIG_DFL;
108  sigaction(SIGINT, &action, NULL);
109  }
110  sigaction(SIGTERM, NULL, &action);
111  if ( action.sa_handler == SDL_HandleSIG ) {
112  action.sa_handler = SIG_DFL;
113  sigaction(SIGTERM, &action, NULL);
114  }
115 #elif HAVE_SIGNAL_H
116  void (*ohandler) (int);
117 
118  ohandler = signal(SIGINT, SIG_DFL);
119  if (ohandler != SDL_HandleSIG)
120  signal(SIGINT, ohandler);
121  ohandler = signal(SIGTERM, SIG_DFL);
122  if (ohandler != SDL_HandleSIG)
123  signal(SIGTERM, ohandler);
124 #endif /* HAVE_SIGNAL_H */
125 }
126 
127 void
129 {
130  if (!disable_signals) {
132  }
133 }
134 
135 /* This function returns 1 if it's okay to close the application window */
136 int
138 {
140  return SDL_SendAppEvent(SDL_QUIT);
141 }
142 
143 void
145 {
146  if (send_quit_pending) {
147  SDL_SendQuit();
149  }
150 }
151 
152 /* vi: set ts=4 sw=4 expandtab: */
static void SDL_HandleSIG(int sig)
Definition: SDL_quit.c:39
void SDL_QuitQuit(void)
Definition: SDL_quit.c:128
static SDL_bool disable_signals
Definition: SDL_quit.c:34
#define SDL_GetHintBoolean
static SDL_bool send_quit_pending
Definition: SDL_quit.c:35
int SDL_SendQuit(void)
Definition: SDL_quit.c:137
void SDL_SendPendingQuit(void)
Definition: SDL_quit.c:144
static void SDL_QuitQuit_Internal(void)
Definition: SDL_quit.c:101
int SDL_QuitInit(void)
Definition: SDL_quit.c:92
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define NULL
Definition: begin_code.h:164
SDL_bool
Definition: SDL_stdinc.h:139
#define SDL_HINT_NO_SIGNAL_HANDLERS
Tell SDL not to catch the SIGINT or SIGTERM signals.
Definition: SDL_hints.h:791
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:919
static int SDL_QuitInit_Internal(void)
Definition: SDL_quit.c:52