SDL中文论坛
标题:
提示(Hint)
[打印本页]
作者:
ancientcc
时间:
2017-1-1 15:01
标题:
提示(Hint)
本帖最后由 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。读出的就是环境变量值。
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3