Options opt;
+Options def_opt = {
+ 1280, 800,
+ false, // vr
+ true, // srgb
+ false, // fullscreen
+ 0 // path
+};
+
enum {
+ OPT_SIZE,
OPT_VR,
OPT_SRGB,
OPT_FULLSCREEN,
static optcfg_option options[] = {
// short, long, id, desc
+ {'s', "size", OPT_SIZE, "window size (WxH)"},
{0, "vr", OPT_VR, "enable VR mode"},
{0, "srgb", OPT_SRGB, "use linear color space"},
{'f', "fullscreen", OPT_FULLSCREEN, "run in fullscreen mode"},
};
static int opt_handler(optcfg *oc, int opt, void *cls);
+static int arg_handler(optcfg *oc, const char *arg, void *cls);
bool init_options(int argc, char **argv, const char *cfgfile)
{
// default options
- memset(&opt, 0, sizeof opt);
- opt.srgb = true;
+ opt = def_opt;
optcfg *oc = optcfg_init(options);
optcfg_set_opt_callback(oc, opt_handler, 0);
+ optcfg_set_arg_callback(oc, arg_handler, 0);
- if(cfgfile && optcfg_parse_config_file(oc, cfgfile) == -1) {
- optcfg_destroy(oc);
- return false;
+ if(cfgfile) {
+ optcfg_parse_config_file(oc, cfgfile);
}
if(argv && optcfg_parse_args(oc, argc, argv) == -1) {
static int opt_handler(optcfg *oc, int optid, void *cls)
{
switch(optid) {
+ case OPT_SIZE:
+ {
+ char *valstr = optcfg_next_value(oc);
+ if(!valstr || sscanf(valstr, "%dx%d", &opt.width, &opt.height) != 2) {
+ fprintf(stderr, "size must be in the form: WIDTHxHEIGHT\n");
+ return -1;
+ }
+ }
+ break;
+
case OPT_VR:
opt.vr = is_enabled(oc);
break;
optcfg_print_options(oc);
exit(0);
}
- return true;
+ return 0;
+}
+
+static int arg_handler(optcfg *oc, const char *arg, void *cls)
+{
+ if(opt.path) {
+ fprintf(stderr, "unexpected argument: %s\n", arg);
+ return -1;
+ }
+ opt.path = arg;
+ return 0;
}