SDL  2.0
SDL_hints.c File Reference
#include "./SDL_internal.h"
#include "SDL_hints.h"
#include "SDL_error.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...
 
void SDL_AddHintCallback (const char *name, SDL_HintCallback callback, void *userdata)
 
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

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

Definition at line 122 of file SDL_hints.c.

References SDL_HintWatch::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.

123 {
124  SDL_Hint *hint;
125  SDL_HintWatch *entry;
126  const char *value;
127 
128  if (!name || !*name) {
129  SDL_InvalidParamError("name");
130  return;
131  }
132  if (!callback) {
133  SDL_InvalidParamError("callback");
134  return;
135  }
136 
137  SDL_DelHintCallback(name, callback, userdata);
138 
139  entry = (SDL_HintWatch *)SDL_malloc(sizeof(*entry));
140  if (!entry) {
141  SDL_OutOfMemory();
142  return;
143  }
144  entry->callback = callback;
145  entry->userdata = userdata;
146 
147  for (hint = SDL_hints; hint; hint = hint->next) {
148  if (SDL_strcmp(name, hint->name) == 0) {
149  break;
150  }
151  }
152  if (!hint) {
153  /* Need to add a hint entry for this watcher */
154  hint = (SDL_Hint *)SDL_malloc(sizeof(*hint));
155  if (!hint) {
156  SDL_OutOfMemory();
157  SDL_free(entry);
158  return;
159  }
160  hint->name = SDL_strdup(name);
161  hint->value = NULL;
162  hint->priority = SDL_HINT_DEFAULT;
163  hint->callbacks = NULL;
164  hint->next = SDL_hints;
165  SDL_hints = hint;
166  }
167 
168  /* Add it to the callbacks for this hint */
169  entry->next = hint->callbacks;
170  hint->callbacks = entry;
171 
172  /* Now call it with the current value */
173  value = SDL_GetHint(name);
174  callback(userdata, name, value, value);
175 }
void * userdata
Definition: SDL_hints.c:32
const char * SDL_GetHint(const char *name)
Get a hint.
Definition: SDL_hints.c:104
void SDL_DelHintCallback(const char *name, SDL_HintCallback callback, void *userdata)
Remove a function watching a particular hint.
Definition: SDL_hints.c:178
struct SDL_Hint * next
Definition: SDL_hints.c:41
GLuint const GLchar * name
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
GLsizei const GLfloat * value
void SDL_free(void *mem)
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
SDL_HintWatch * callbacks
Definition: SDL_hints.c:40
#define NULL
Definition: begin_code.h:143
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_HintPriority priority
Definition: SDL_hints.c:39
#define SDL_strdup
#define SDL_malloc
#define SDL_strcmp
char * value
Definition: SDL_hints.c:38
SDL_HintCallback callback
Definition: SDL_hints.c:31
struct SDL_HintWatch * next
Definition: SDL_hints.c:33
char * name
Definition: SDL_hints.c:37
static SDL_Hint * SDL_hints
Definition: SDL_hints.c:44
void SDL_ClearHints ( void  )

Clear all hints.

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

Definition at line 203 of file SDL_hints.c.

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

204 {
205  SDL_Hint *hint;
206  SDL_HintWatch *entry;
207 
208  while (SDL_hints) {
209  hint = SDL_hints;
210  SDL_hints = hint->next;
211 
212  SDL_free(hint->name);
213  SDL_free(hint->value);
214  for (entry = hint->callbacks; entry; ) {
215  SDL_HintWatch *freeable = entry;
216  entry = entry->next;
217  SDL_free(freeable);
218  }
219  SDL_free(hint);
220  }
221 }
struct SDL_Hint * next
Definition: SDL_hints.c:41
void SDL_free(void *mem)
SDL_HintWatch * callbacks
Definition: SDL_hints.c:40
char * value
Definition: SDL_hints.c:38
struct SDL_HintWatch * next
Definition: SDL_hints.c:33
char * name
Definition: SDL_hints.c:37
static SDL_Hint * SDL_hints
Definition: SDL_hints.c:44
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 178 of file SDL_hints.c.

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

Referenced by SDL_AddHintCallback().

179 {
180  SDL_Hint *hint;
181  SDL_HintWatch *entry, *prev;
182 
183  for (hint = SDL_hints; hint; hint = hint->next) {
184  if (SDL_strcmp(name, hint->name) == 0) {
185  prev = NULL;
186  for (entry = hint->callbacks; entry; entry = entry->next) {
187  if (callback == entry->callback && userdata == entry->userdata) {
188  if (prev) {
189  prev->next = entry->next;
190  } else {
191  hint->callbacks = entry->next;
192  }
193  SDL_free(entry);
194  break;
195  }
196  prev = entry;
197  }
198  return;
199  }
200  }
201 }
void * userdata
Definition: SDL_hints.c:32
struct SDL_Hint * next
Definition: SDL_hints.c:41
GLuint const GLchar * name
void SDL_free(void *mem)
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
SDL_HintWatch * callbacks
Definition: SDL_hints.c:40
#define NULL
Definition: begin_code.h:143
#define SDL_strcmp
SDL_HintCallback callback
Definition: SDL_hints.c:31
struct SDL_HintWatch * next
Definition: SDL_hints.c:33
char * name
Definition: SDL_hints.c:37
static SDL_Hint * SDL_hints
Definition: SDL_hints.c:44
const char* SDL_GetHint ( const char *  name)

Get a hint.

Returns
The string value of a hint variable.

Definition at line 104 of file SDL_hints.c.

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

Referenced by SDL_AddHintCallback().

105 {
106  const char *env;
107  SDL_Hint *hint;
108 
109  env = SDL_getenv(name);
110  for (hint = SDL_hints; hint; hint = hint->next) {
111  if (SDL_strcmp(name, hint->name) == 0) {
112  if (!env || hint->priority == SDL_HINT_OVERRIDE) {
113  return hint->value;
114  }
115  break;
116  }
117  }
118  return env;
119 }
struct SDL_Hint * next
Definition: SDL_hints.c:41
GLuint const GLchar * name
#define SDL_getenv
SDL_HintPriority priority
Definition: SDL_hints.c:39
#define SDL_strcmp
char * value
Definition: SDL_hints.c:38
char * name
Definition: SDL_hints.c:37
static SDL_Hint * SDL_hints
Definition: SDL_hints.c:44
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 98 of file SDL_hints.c.

References SDL_HINT_NORMAL, and SDL_SetHintWithPriority().

99 {
101 }
SDL_bool SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPriority priority)
Set a hint with a specific priority.
Definition: SDL_hints.c:47
GLuint const GLchar * name
GLsizei const GLfloat * value
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 47 of file SDL_hints.c.

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

49 {
50  const char *env;
51  SDL_Hint *hint;
52  SDL_HintWatch *entry;
53 
54  if (!name || !value) {
55  return SDL_FALSE;
56  }
57 
58  env = SDL_getenv(name);
59  if (env && priority < SDL_HINT_OVERRIDE) {
60  return SDL_FALSE;
61  }
62 
63  for (hint = SDL_hints; hint; hint = hint->next) {
64  if (SDL_strcmp(name, hint->name) == 0) {
65  if (priority < hint->priority) {
66  return SDL_FALSE;
67  }
68  if (!hint->value || !value || SDL_strcmp(hint->value, value) != 0) {
69  for (entry = hint->callbacks; entry; ) {
70  /* Save the next entry in case this one is deleted */
71  SDL_HintWatch *next = entry->next;
72  entry->callback(entry->userdata, name, hint->value, value);
73  entry = next;
74  }
75  SDL_free(hint->value);
76  hint->value = value ? SDL_strdup(value) : NULL;
77  }
78  hint->priority = priority;
79  return SDL_TRUE;
80  }
81  }
82 
83  /* Couldn't find the hint, add a new one */
84  hint = (SDL_Hint *)SDL_malloc(sizeof(*hint));
85  if (!hint) {
86  return SDL_FALSE;
87  }
88  hint->name = SDL_strdup(name);
89  hint->value = value ? SDL_strdup(value) : NULL;
90  hint->priority = priority;
91  hint->callbacks = NULL;
92  hint->next = SDL_hints;
93  SDL_hints = hint;
94  return SDL_TRUE;
95 }
void * userdata
Definition: SDL_hints.c:32
struct SDL_Hint * next
Definition: SDL_hints.c:41
GLuint const GLchar * name
GLsizei const GLfloat * value
void SDL_free(void *mem)
SDL_HintWatch * callbacks
Definition: SDL_hints.c:40
#define SDL_getenv
#define NULL
Definition: begin_code.h:143
SDL_HintPriority priority
Definition: SDL_hints.c:39
#define SDL_strdup
#define SDL_malloc
#define SDL_strcmp
char * value
Definition: SDL_hints.c:38
SDL_HintCallback callback
Definition: SDL_hints.c:31
struct SDL_HintWatch * next
Definition: SDL_hints.c:33
char * name
Definition: SDL_hints.c:37
static SDL_Hint * SDL_hints
Definition: SDL_hints.c:44

Variable Documentation

SDL_Hint* SDL_hints
static

Definition at line 44 of file SDL_hints.c.

Referenced by SDL_AddHintCallback(), SDL_ClearHints(), and SDL_SetHintWithPriority().