SDL  2.0
SDL_hints.c File Reference
#include "./SDL_internal.h"
#include "SDL_hints.h"
#include "SDL_error.h"
#include "SDL_hints_c.h"
+ Include dependency graph for SDL_hints.c:

Go to the source code of this file.

Data Structures

struct  SDL_HintWatch
 
struct  SDL_Hint
 

Functions

SDL_bool SDL_SetHintWithPriority (const char *name, const char *value, SDL_HintPriority priority)
 Set a hint with a specific priority. More...
 
SDL_bool SDL_SetHint (const char *name, const char *value)
 Set a hint with normal priority. More...
 
const char * SDL_GetHint (const char *name)
 Get a hint. More...
 
SDL_bool SDL_GetStringBoolean (const char *value, SDL_bool default_value)
 
SDL_bool SDL_GetHintBoolean (const char *name, SDL_bool default_value)
 Get a hint. More...
 
void SDL_AddHintCallback (const char *name, SDL_HintCallback callback, void *userdata)
 Add a function to watch a particular hint. More...
 
void SDL_DelHintCallback (const char *name, SDL_HintCallback callback, void *userdata)
 Remove a function watching a particular hint. More...
 
void SDL_ClearHints (void)
 Clear all hints. More...
 

Variables

static SDL_HintSDL_hints
 

Function Documentation

◆ SDL_AddHintCallback()

void SDL_AddHintCallback ( const char *  name,
SDL_HintCallback  callback,
void userdata 
)

Add a function to watch a particular hint.

Parameters
nameThe hint to watch
callbackThe function to call when the hint value changes
userdataA pointer to pass to the callback function

Definition at line 142 of file SDL_hints.c.

143 {
144  SDL_Hint *hint;
145  SDL_HintWatch *entry;
146  const char *value;
147 
148  if (!name || !*name) {
149  SDL_InvalidParamError("name");
150  return;
151  }
152  if (!callback) {
153  SDL_InvalidParamError("callback");
154  return;
155  }
156 
157  SDL_DelHintCallback(name, callback, userdata);
158 
159  entry = (SDL_HintWatch *)SDL_malloc(sizeof(*entry));
160  if (!entry) {
161  SDL_OutOfMemory();
162  return;
163  }
164  entry->callback = callback;
165  entry->userdata = userdata;
166 
167  for (hint = SDL_hints; hint; hint = hint->next) {
168  if (SDL_strcmp(name, hint->name) == 0) {
169  break;
170  }
171  }
172  if (!hint) {
173  /* Need to add a hint entry for this watcher */
174  hint = (SDL_Hint *)SDL_malloc(sizeof(*hint));
175  if (!hint) {
176  SDL_OutOfMemory();
177  SDL_free(entry);
178  return;
179  }
180  hint->name = SDL_strdup(name);
181  hint->value = NULL;
182  hint->priority = SDL_HINT_DEFAULT;
183  hint->callbacks = NULL;
184  hint->next = SDL_hints;
185  SDL_hints = hint;
186  }
187 
188  /* Add it to the callbacks for this hint */
189  entry->next = hint->callbacks;
190  hint->callbacks = entry;
191 
192  /* Now call it with the current value */
194  callback(userdata, name, value, value);
195 }
#define SDL_malloc
#define SDL_free
#define SDL_strdup
#define SDL_strcmp
#define SDL_OutOfMemory()
Definition: SDL_error.h:88
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:90
void SDL_DelHintCallback(const char *name, SDL_HintCallback callback, void *userdata)
Remove a function watching a particular hint.
Definition: SDL_hints.c:198
static SDL_Hint * SDL_hints
Definition: SDL_hints.c:45
const char * SDL_GetHint(const char *name)
Get a hint.
Definition: SDL_hints.c:105
@ SDL_HINT_DEFAULT
Definition: SDL_hints.h:1494
GLuint const GLchar * name
GLsizei const GLfloat * value
#define NULL
Definition: begin_code.h:163
char * name
Definition: SDL_hints.c:38
SDL_HintWatch * callbacks
Definition: SDL_hints.c:41
struct SDL_Hint * next
Definition: SDL_hints.c:42
char * value
Definition: SDL_hints.c:39
SDL_HintPriority priority
Definition: SDL_hints.c:40
SDL_HintCallback callback
Definition: SDL_hints.c:32
void * userdata
Definition: SDL_hints.c:33
struct SDL_HintWatch * next
Definition: SDL_hints.c:34
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34

References SDL_HintWatch::callback, callback(), SDL_Hint::callbacks, SDL_Hint::name, SDL_HintWatch::next, SDL_Hint::next, NULL, SDL_Hint::priority, SDL_DelHintCallback(), SDL_free, SDL_GetHint(), SDL_HINT_DEFAULT, SDL_hints, SDL_InvalidParamError, SDL_malloc, SDL_OutOfMemory, SDL_strcmp, SDL_strdup, SDL_HintWatch::userdata, and SDL_Hint::value.

◆ SDL_ClearHints()

void SDL_ClearHints ( void  )

Clear all hints.

This function is called during SDL_Quit() to free stored hints.

Definition at line 223 of file SDL_hints.c.

224 {
225  SDL_Hint *hint;
226  SDL_HintWatch *entry;
227 
228  while (SDL_hints) {
229  hint = SDL_hints;
230  SDL_hints = hint->next;
231 
232  SDL_free(hint->name);
233  SDL_free(hint->value);
234  for (entry = hint->callbacks; entry; ) {
235  SDL_HintWatch *freeable = entry;
236  entry = entry->next;
237  SDL_free(freeable);
238  }
239  SDL_free(hint);
240  }
241 }

References SDL_Hint::callbacks, SDL_Hint::name, SDL_HintWatch::next, SDL_Hint::next, SDL_free, SDL_hints, and SDL_Hint::value.

◆ SDL_DelHintCallback()

void SDL_DelHintCallback ( const char *  name,
SDL_HintCallback  callback,
void userdata 
)

Remove a function watching a particular hint.

Parameters
nameThe hint being watched
callbackThe function being called when the hint value changes
userdataA pointer being passed to the callback function

Definition at line 198 of file SDL_hints.c.

199 {
200  SDL_Hint *hint;
201  SDL_HintWatch *entry, *prev;
202 
203  for (hint = SDL_hints; hint; hint = hint->next) {
204  if (SDL_strcmp(name, hint->name) == 0) {
205  prev = NULL;
206  for (entry = hint->callbacks; entry; entry = entry->next) {
207  if (callback == entry->callback && userdata == entry->userdata) {
208  if (prev) {
209  prev->next = entry->next;
210  } else {
211  hint->callbacks = entry->next;
212  }
213  SDL_free(entry);
214  break;
215  }
216  prev = entry;
217  }
218  return;
219  }
220  }
221 }

References SDL_HintWatch::callback, callback(), SDL_Hint::callbacks, SDL_Hint::name, SDL_HintWatch::next, SDL_Hint::next, NULL, SDL_free, SDL_hints, SDL_strcmp, and SDL_HintWatch::userdata.

Referenced by SDL_AddHintCallback().

◆ SDL_GetHint()

const char* SDL_GetHint ( const char *  name)

Get a hint.

Returns
The string value of a hint variable.

Definition at line 105 of file SDL_hints.c.

106 {
107  const char *env;
108  SDL_Hint *hint;
109 
110  env = SDL_getenv(name);
111  for (hint = SDL_hints; hint; hint = hint->next) {
112  if (SDL_strcmp(name, hint->name) == 0) {
113  if (!env || hint->priority == SDL_HINT_OVERRIDE) {
114  return hint->value;
115  }
116  break;
117  }
118  }
119  return env;
120 }
#define SDL_getenv
@ SDL_HINT_OVERRIDE
Definition: SDL_hints.h:1496

References SDL_Hint::name, SDL_Hint::next, SDL_Hint::priority, SDL_getenv, SDL_HINT_OVERRIDE, SDL_hints, SDL_strcmp, and SDL_Hint::value.

Referenced by SDL_AddHintCallback(), and SDL_GetHintBoolean().

◆ SDL_GetHintBoolean()

SDL_bool SDL_GetHintBoolean ( const char *  name,
SDL_bool  default_value 
)

Get a hint.

Returns
The boolean value of a hint variable.

Definition at line 135 of file SDL_hints.c.

136 {
137  const char *hint = SDL_GetHint(name);
138  return SDL_GetStringBoolean(hint, default_value);
139 }
SDL_bool SDL_GetStringBoolean(const char *value, SDL_bool default_value)
Definition: SDL_hints.c:123

References SDL_GetHint(), and SDL_GetStringBoolean().

◆ SDL_GetStringBoolean()

SDL_bool SDL_GetStringBoolean ( const char *  value,
SDL_bool  default_value 
)

Definition at line 123 of file SDL_hints.c.

124 {
125  if (!value || !*value) {
126  return default_value;
127  }
128  if (*value == '0' || SDL_strcasecmp(value, "false") == 0) {
129  return SDL_FALSE;
130  }
131  return SDL_TRUE;
132 }
#define SDL_strcasecmp
@ SDL_TRUE
Definition: SDL_stdinc.h:170
@ SDL_FALSE
Definition: SDL_stdinc.h:169

References SDL_FALSE, SDL_strcasecmp, and SDL_TRUE.

Referenced by SDL_GetHintBoolean(), SDL_MouseTouchEventsChanged(), and SDL_TouchMouseEventsChanged().

◆ SDL_SetHint()

SDL_bool SDL_SetHint ( const char *  name,
const char *  value 
)

Set a hint with normal priority.

Returns
SDL_TRUE if the hint was set, SDL_FALSE otherwise

Definition at line 99 of file SDL_hints.c.

100 {
102 }
SDL_bool SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPriority priority)
Set a hint with a specific priority.
Definition: SDL_hints.c:48
@ SDL_HINT_NORMAL
Definition: SDL_hints.h:1495

References SDL_HINT_NORMAL, and SDL_SetHintWithPriority().

◆ SDL_SetHintWithPriority()

SDL_bool SDL_SetHintWithPriority ( const char *  name,
const char *  value,
SDL_HintPriority  priority 
)

Set a hint with a specific priority.

The priority controls the behavior when setting a hint that already has a value. Hints will replace existing hints of their priority and lower. Environment variables are considered to have override priority.

Returns
SDL_TRUE if the hint was set, SDL_FALSE otherwise

Definition at line 48 of file SDL_hints.c.

50 {
51  const char *env;
52  SDL_Hint *hint;
53  SDL_HintWatch *entry;
54 
55  if (!name || !value) {
56  return SDL_FALSE;
57  }
58 
59  env = SDL_getenv(name);
60  if (env && priority < SDL_HINT_OVERRIDE) {
61  return SDL_FALSE;
62  }
63 
64  for (hint = SDL_hints; hint; hint = hint->next) {
65  if (SDL_strcmp(name, hint->name) == 0) {
66  if (priority < hint->priority) {
67  return SDL_FALSE;
68  }
69  if (!hint->value || !value || SDL_strcmp(hint->value, value) != 0) {
70  for (entry = hint->callbacks; entry; ) {
71  /* Save the next entry in case this one is deleted */
72  SDL_HintWatch *next = entry->next;
73  entry->callback(entry->userdata, name, hint->value, value);
74  entry = next;
75  }
76  SDL_free(hint->value);
77  hint->value = value ? SDL_strdup(value) : NULL;
78  }
79  hint->priority = priority;
80  return SDL_TRUE;
81  }
82  }
83 
84  /* Couldn't find the hint, add a new one */
85  hint = (SDL_Hint *)SDL_malloc(sizeof(*hint));
86  if (!hint) {
87  return SDL_FALSE;
88  }
89  hint->name = SDL_strdup(name);
90  hint->value = value ? SDL_strdup(value) : NULL;
91  hint->priority = priority;
92  hint->callbacks = NULL;
93  hint->next = SDL_hints;
94  SDL_hints = hint;
95  return SDL_TRUE;
96 }

References SDL_HintWatch::callback, SDL_Hint::callbacks, SDL_Hint::name, SDL_HintWatch::next, SDL_Hint::next, NULL, SDL_Hint::priority, SDL_FALSE, SDL_free, SDL_getenv, SDL_HINT_OVERRIDE, SDL_hints, SDL_malloc, SDL_strcmp, SDL_strdup, SDL_TRUE, SDL_HintWatch::userdata, and SDL_Hint::value.

Referenced by SDL_SetHint().

Variable Documentation

◆ SDL_hints

SDL_Hint* SDL_hints
static