SDL 2.0
SDL_quit.c File Reference
#include "../SDL_internal.h"
#include "SDL_hints.h"
#include "SDL_assert.h"
#include "SDL_events.h"
#include "SDL_events_c.h"
+ Include dependency graph for SDL_quit.c:

Go to the source code of this file.

Macros

#define HAVE_SIGNAL_SUPPORT   1
 

Functions

static void SDL_HandleSIG (int sig)
 
static void SDL_EventSignal_Init (const int sig)
 
static void SDL_EventSignal_Quit (const int sig)
 
static int SDL_QuitInit_Internal (void)
 
static void SDL_QuitQuit_Internal (void)
 
int SDL_QuitInit (void)
 
void SDL_QuitQuit (void)
 
void SDL_SendPendingSignalEvents (void)
 
int SDL_SendQuit (void)
 

Variables

static SDL_bool disable_signals = SDL_FALSE
 
static SDL_bool send_quit_pending = SDL_FALSE
 

Macro Definition Documentation

◆ HAVE_SIGNAL_SUPPORT

#define HAVE_SIGNAL_SUPPORT   1

Definition at line 35 of file SDL_quit.c.

Function Documentation

◆ SDL_EventSignal_Init()

static void SDL_EventSignal_Init ( const int  sig)
static

Definition at line 76 of file SDL_quit.c.

77{
78#ifdef HAVE_SIGACTION
79 struct sigaction action;
80
81 sigaction(sig, NULL, &action);
82#ifdef HAVE_SA_SIGACTION
83 if ( action.sa_handler == SIG_DFL && (void (*)(int))action.sa_sigaction == SIG_DFL ) {
84#else
85 if ( action.sa_handler == SIG_DFL ) {
86#endif
87 action.sa_handler = SDL_HandleSIG;
88 sigaction(sig, &action, NULL);
89 }
90#elif HAVE_SIGNAL_H
91 void (*ohandler) (int) = signal(sig, SDL_HandleSIG);
92 if (ohandler != SIG_DFL) {
93 signal(sig, ohandler);
94 }
95#endif
96}
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
static void SDL_HandleSIG(int sig)
Definition: SDL_quit.c:51
#define NULL
Definition: begin_code.h:167

References NULL, SDL_HandleSIG(), and void.

Referenced by SDL_QuitInit_Internal().

◆ SDL_EventSignal_Quit()

static void SDL_EventSignal_Quit ( const int  sig)
static

Definition at line 99 of file SDL_quit.c.

100{
101#ifdef HAVE_SIGACTION
102 struct sigaction action;
103 sigaction(sig, NULL, &action);
104 if ( action.sa_handler == SDL_HandleSIG ) {
105 action.sa_handler = SIG_DFL;
106 sigaction(sig, &action, NULL);
107 }
108#elif HAVE_SIGNAL_H
109 void (*ohandler) (int) = signal(sig, SIG_DFL);
110 if (ohandler != SDL_HandleSIG) {
111 signal(sig, ohandler);
112 }
113#endif /* HAVE_SIGNAL_H */
114}

References NULL, SDL_HandleSIG(), and void.

Referenced by SDL_QuitQuit_Internal().

◆ SDL_HandleSIG()

static void SDL_HandleSIG ( int  sig)
static

Definition at line 51 of file SDL_quit.c.

52{
53 /* Reset the signal handler */
54 signal(sig, SDL_HandleSIG);
55
56 /* Send a quit event next time the event loop pumps. */
57 /* We can't send it in signal handler; malloc() might be interrupted! */
58 if ((sig == SIGINT) || (sig == SIGTERM)) {
60 }
61
62 #ifdef SDL_BACKGROUNDING_SIGNAL
63 else if (sig == SDL_BACKGROUNDING_SIGNAL) {
64 send_backgrounding_pending = SDL_TRUE;
65 }
66 #endif
67
68 #ifdef SDL_FOREGROUNDING_SIGNAL
69 else if (sig == SDL_FOREGROUNDING_SIGNAL) {
70 send_foregrounding_pending = SDL_TRUE;
71 }
72 #endif
73}
static SDL_bool send_quit_pending
Definition: SDL_quit.c:40
@ SDL_TRUE
Definition: SDL_stdinc.h:164

References SDL_HandleSIG(), SDL_TRUE, and send_quit_pending.

Referenced by SDL_EventSignal_Init(), SDL_EventSignal_Quit(), and SDL_HandleSIG().

◆ SDL_QuitInit()

int SDL_QuitInit ( void  )

Definition at line 154 of file SDL_quit.c.

155{
156#ifdef HAVE_SIGNAL_SUPPORT
158 return SDL_QuitInit_Internal();
159 }
160#endif
161 return 0;
162}
#define SDL_GetHintBoolean
#define SDL_HINT_NO_SIGNAL_HANDLERS
Tell SDL not to catch the SIGINT or SIGTERM signals.
Definition: SDL_hints.h:923
static int SDL_QuitInit_Internal(void)
Definition: SDL_quit.c:118
@ SDL_FALSE
Definition: SDL_stdinc.h:163

References SDL_FALSE, SDL_GetHintBoolean, SDL_HINT_NO_SIGNAL_HANDLERS, and SDL_QuitInit_Internal().

Referenced by SDL_EventsInit().

◆ SDL_QuitInit_Internal()

static int SDL_QuitInit_Internal ( void  )
static

Definition at line 118 of file SDL_quit.c.

119{
120 /* Both SIGINT and SIGTERM are translated into quit interrupts */
121 /* and SDL can be built to simulate iOS/Android semantics with arbitrary signals. */
122 SDL_EventSignal_Init(SIGINT);
123 SDL_EventSignal_Init(SIGTERM);
124
125 #ifdef SDL_BACKGROUNDING_SIGNAL
126 SDL_EventSignal_Init(SDL_BACKGROUNDING_SIGNAL);
127 #endif
128
129 #ifdef SDL_FOREGROUNDING_SIGNAL
130 SDL_EventSignal_Init(SDL_FOREGROUNDING_SIGNAL);
131 #endif
132
133 /* That's it! */
134 return 0;
135}
static void SDL_EventSignal_Init(const int sig)
Definition: SDL_quit.c:76

References SDL_EventSignal_Init().

Referenced by SDL_QuitInit().

◆ SDL_QuitQuit()

void SDL_QuitQuit ( void  )

Definition at line 165 of file SDL_quit.c.

166{
167#ifdef HAVE_SIGNAL_SUPPORT
168 if (!disable_signals) {
170 }
171#endif
172}
static SDL_bool disable_signals
Definition: SDL_quit.c:39
static void SDL_QuitQuit_Internal(void)
Definition: SDL_quit.c:138

References disable_signals, and SDL_QuitQuit_Internal().

Referenced by SDL_EventsQuit().

◆ SDL_QuitQuit_Internal()

static void SDL_QuitQuit_Internal ( void  )
static

Definition at line 138 of file SDL_quit.c.

139{
140 SDL_EventSignal_Quit(SIGINT);
141 SDL_EventSignal_Quit(SIGTERM);
142
143 #ifdef SDL_BACKGROUNDING_SIGNAL
144 SDL_EventSignal_Quit(SDL_BACKGROUNDING_SIGNAL);
145 #endif
146
147 #ifdef SDL_FOREGROUNDING_SIGNAL
148 SDL_EventSignal_Quit(SDL_FOREGROUNDING_SIGNAL);
149 #endif
150}
static void SDL_EventSignal_Quit(const int sig)
Definition: SDL_quit.c:99

References SDL_EventSignal_Quit().

Referenced by SDL_QuitQuit().

◆ SDL_SendPendingSignalEvents()

void SDL_SendPendingSignalEvents ( void  )

Definition at line 175 of file SDL_quit.c.

176{
177#ifdef HAVE_SIGNAL_SUPPORT
178 if (send_quit_pending) {
179 SDL_SendQuit();
181 }
182
183 #ifdef SDL_BACKGROUNDING_SIGNAL
184 if (send_backgrounding_pending) {
185 send_backgrounding_pending = SDL_FALSE;
187 }
188 #endif
189
190 #ifdef SDL_FOREGROUNDING_SIGNAL
191 if (send_foregrounding_pending) {
192 send_foregrounding_pending = SDL_FALSE;
194 }
195 #endif
196#endif
197}
#define SDL_assert(condition)
Definition: SDL_assert.h:169
int SDL_SendQuit(void)
Definition: SDL_quit.c:201
void SDL_OnApplicationDidBecomeActive(void)
Definition: SDL_video.c:4061
void SDL_OnApplicationWillResignActive(void)
Definition: SDL_video.c:4039

References SDL_assert, SDL_FALSE, SDL_OnApplicationDidBecomeActive(), SDL_OnApplicationWillResignActive(), SDL_SendQuit(), and send_quit_pending.

Referenced by SDL_PumpEvents().

◆ SDL_SendQuit()

int SDL_SendQuit ( void  )

Definition at line 201 of file SDL_quit.c.

202{
203#ifdef HAVE_SIGNAL_SUPPORT
205#endif
207}
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:965
@ SDL_QUIT
Definition: SDL_events.h:60

References SDL_FALSE, SDL_QUIT, SDL_SendAppEvent(), and send_quit_pending.

Referenced by SDL_SendPendingSignalEvents(), and SDL_SendWindowEvent().

Variable Documentation

◆ disable_signals

SDL_bool disable_signals = SDL_FALSE
static

Definition at line 39 of file SDL_quit.c.

Referenced by SDL_QuitQuit().

◆ send_quit_pending

SDL_bool send_quit_pending = SDL_FALSE
static

Definition at line 40 of file SDL_quit.c.

Referenced by SDL_HandleSIG(), SDL_SendPendingSignalEvents(), and SDL_SendQuit().