|
本帖最后由 ancientcc 于 2017-1-1 19:10 编辑
提示(Hint)表示一种设置。各操作系统存在个和设置相关的环境区,像Windows上的SetEnvironmentVariable/GetEnvironmentVariable,linux中的putenv/setenv。Hint区和环境区可存在同名变量。
设置、读取提示
- SDL_bool SDL_SetHintWithPriority(const char *name, const char *value, SDL_HintPriority priority)
- SDL_bool SDL_SetHint(const char *name, const char *value)。priority固定为SDL_HINT_NORMAL的SDL_SetHintWithPriority。
复制代码
- name:提示名称,不能是null,大小写敏感。SDL会定义这些提示名称。app可以使用自定义名称,这意味着SDL只支持存储、读取这提示,不会影响SDL内部行为。
- value:提示值,不能是null,大小写敏感。当name[0]=='\0',会认为它是有效值,但除了表示空字符串,强烈建议不要用在其它类型,像bool、整型。
- priority:优先级。如果系统中没有该提示,将把该优先级绑定到此提示。下次如果想修改该提示,不能低于此优先级。如果修改时使用的优先级比原先优先级高,会将新优先级绑定到此提示。
0 | SDL_HINT_DEFAULT | | 1 | SDL_HINT_NORMAL | SDL_SetHint时默认使用该优先级 | 2 | SDL_HINT_OVERRIDE | 要想访问环境变量,必须使用此优先级。重载:如果环境区中已有此变量,Hint区将新建此变量,然后使用此中的value。 |
系统以着一个开环单向链表结构表示已有的提示。结点类型是SDL_Hint,当中的next指向下一个结点。变量SDL_hints指向头结点。以下是SDL_Hint数据结构。
- typedef struct SDL_Hint {
- char *name;
- char *value;
- SDL_HintPriority priority;
- SDL_HintWatch *callbacks;
- struct SDL_Hint *next;
- } SDL_Hint;
- typedef struct SDL_HintWatch {
- SDL_HintCallback callback;
- void *userdata;
- struct SDL_HintWatch *next;
- } SDL_HintWatch;
复制代码
priority存放着设置该提示时的最低优先级。callbacks指示该值发生修改(新建不属于修改)时要执行的回调。
- 如果环境变量中存有该名称,优先级小于SDL_HINT_OVERRIDE,设置失败。
- 一旦出现修改(新建不属于修改),会调用callbacks中的所有回调。
- 此次设置使用的priority绑定到该提示。
- const char* SDL_GetHint(const char *name)
- SDL_bool SDL_GetHintBoolean(const char *name, SDL_bool default_value)
- const char *hint = SDL_GetHint(name);
- if (!hint) {
- return default_value;
- }
- if (*hint == '0' || SDL_strcasecmp(hint, "false") == 0) {
- return SDL_FALSE;
- }
- return SDL_TRUE;
- }
复制代码
- default_value:SDL_GetHint返回null时,返回该值。
值是"0"或"false"时,返回SDL_FALSE,否则SDL_TRUE。value[0]='\0'是返回SDL_TRUE。这不符惯常认为,因而除非是表示字符串,强烈建议不要传下value[0]='\0'。
和环境区变量关系
Hint系统不可能修改环境区变量中的值,但可以读取环境区变量。以下是如何读环境区变量。
- 之前不能使用SDL_SetHintWithPriority设置过该环境区变量。或SDL_GetHint使用低于SDL_HINT_OVERRIDE的优先级。
- 调用SDL_GetHint。读出的就是环境变量值。
|
|