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 }

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 }

References SDL_TRUE, and send_quit_pending.

Referenced by SDL_EventSignal_Init(), and SDL_EventSignal_Quit().

◆ 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 }

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 }

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 }

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 }

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 }

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
206  return SDL_SendAppEvent(SDL_QUIT);
207 }

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().

disable_signals
static SDL_bool disable_signals
Definition: SDL_quit.c:39
SDL_QuitQuit_Internal
static void SDL_QuitQuit_Internal(void)
Definition: SDL_quit.c:138
NULL
#define NULL
Definition: begin_code.h:167
SDL_OnApplicationWillResignActive
void SDL_OnApplicationWillResignActive(void)
Definition: SDL_video.c:4039
SDL_HandleSIG
static void SDL_HandleSIG(int sig)
Definition: SDL_quit.c:51
SDL_EventSignal_Init
static void SDL_EventSignal_Init(const int sig)
Definition: SDL_quit.c:76
SDL_GetHintBoolean
#define SDL_GetHintBoolean
Definition: SDL_dynapi_overrides.h:608
SDL_FALSE
@ SDL_FALSE
Definition: SDL_stdinc.h:163
SDL_QUIT
@ SDL_QUIT
Definition: SDL_events.h:60
SDL_SendQuit
int SDL_SendQuit(void)
Definition: SDL_quit.c:201
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
SDL_OnApplicationDidBecomeActive
void SDL_OnApplicationDidBecomeActive(void)
Definition: SDL_video.c:4061
SDL_EventSignal_Quit
static void SDL_EventSignal_Quit(const int sig)
Definition: SDL_quit.c:99
SDL_HINT_NO_SIGNAL_HANDLERS
#define SDL_HINT_NO_SIGNAL_HANDLERS
Tell SDL not to catch the SIGINT or SIGTERM signals.
Definition: SDL_hints.h:923
SDL_TRUE
@ SDL_TRUE
Definition: SDL_stdinc.h:164
SDL_QuitInit_Internal
static int SDL_QuitInit_Internal(void)
Definition: SDL_quit.c:118
send_quit_pending
static SDL_bool send_quit_pending
Definition: SDL_quit.c:40
void
const SDL_PRINTF_FORMAT_STRING char int const SDL_PRINTF_FORMAT_STRING char int const SDL_PRINTF_FORMAT_STRING char int const SDL_PRINTF_FORMAT_STRING char const char const SDL_SCANF_FORMAT_STRING char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
Definition: SDL_dynapi_procs.h:89
SDL_SendAppEvent
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:965