summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/input/input.c25
-rw-r--r--core/input/input.h10
-rw-r--r--core/m_config.c126
-rw-r--r--core/m_config.h46
-rw-r--r--core/mplayer.c27
-rw-r--r--core/options.c31
-rw-r--r--core/options.h2
7 files changed, 121 insertions, 146 deletions
diff --git a/core/input/input.c b/core/input/input.c
index 7a016a0e4f..855e09887b 100644
--- a/core/input/input.c
+++ b/core/input/input.c
@@ -497,6 +497,9 @@ struct cmd_queue {
};
struct input_ctx {
+ bool using_ar;
+ bool using_cocoa_media_keys;
+
// Autorepeat stuff
short ar_state;
int64_t last_ar;
@@ -572,7 +575,7 @@ static const m_option_t input_config[] = {
{ NULL, NULL, 0, 0, 0, 0, NULL}
};
-static const m_option_t mp_input_opts[] = {
+const m_option_t mp_input_opts[] = {
{ "input", (void *)&input_config, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
OPT_INTRANGE("doubleclick-time", input.doubleclick_time, 0, 0, 1000),
OPT_FLAG("joystick", input.use_joystick, CONF_GLOBAL),
@@ -2069,9 +2072,10 @@ void mp_input_define_section(struct input_ctx *ictx, char *name, char *location,
}
}
-struct input_ctx *mp_input_init(struct input_conf *input_conf,
- bool load_default_conf)
+struct input_ctx *mp_input_init(struct MPOpts *opts)
{
+ struct input_conf *input_conf = &opts->input;
+
struct input_ctx *ictx = talloc_ptrtype(NULL, ictx);
*ictx = (struct input_ctx){
.key_fifo_size = input_conf->key_fifo_size,
@@ -2106,7 +2110,7 @@ struct input_ctx *mp_input_init(struct input_conf *input_conf,
bool config_ok = false;
if (input_conf->config_file)
config_ok = parse_config_file(ictx, input_conf->config_file, true);
- if (!config_ok && load_default_conf) {
+ if (!config_ok && opts->load_config) {
// Try global conf dir
char *file = mp_find_config_file("input.conf");
config_ok = file && parse_config_file(ictx, file, false);
@@ -2148,10 +2152,12 @@ struct input_ctx *mp_input_init(struct input_conf *input_conf,
#ifdef CONFIG_COCOA
if (input_conf->use_ar) {
cocoa_init_apple_remote();
+ ictx->using_ar = true;
}
if (input_conf->use_media_keys) {
cocoa_init_media_keys();
+ ictx->using_cocoa_media_keys = true;
}
#endif
@@ -2186,17 +2192,17 @@ static void clear_queue(struct cmd_queue *queue)
}
}
-void mp_input_uninit(struct input_ctx *ictx, struct input_conf *input_conf)
+void mp_input_uninit(struct input_ctx *ictx)
{
if (!ictx)
return;
#ifdef CONFIG_COCOA
- if (input_conf->use_ar) {
+ if (ictx->using_ar) {
cocoa_uninit_apple_remote();
}
- if (input_conf->use_media_keys) {
+ if (ictx->using_cocoa_media_keys) {
cocoa_uninit_media_keys();
}
#endif
@@ -2215,11 +2221,6 @@ void mp_input_uninit(struct input_ctx *ictx, struct input_conf *input_conf)
talloc_free(ictx);
}
-void mp_input_register_options(m_config_t *cfg)
-{
- m_config_register_options(cfg, mp_input_opts);
-}
-
static int print_key_list(m_option_t *cfg, char *optname, char *optparam)
{
int i;
diff --git a/core/input/input.h b/core/input/input.h
index f4f5621e9f..92e2a32c4f 100644
--- a/core/input/input.h
+++ b/core/input/input.h
@@ -257,14 +257,10 @@ bool mp_input_test_mouse_active(struct input_ctx *ictx, int x, int y);
bool mp_input_test_dragging(struct input_ctx *ictx, int x, int y);
// Initialize the input system
-struct input_conf;
-struct input_ctx *mp_input_init(struct input_conf *input_conf,
- bool load_default_conf);
+struct MPOpts;
+struct input_ctx *mp_input_init(struct MPOpts *opts);
-void mp_input_uninit(struct input_ctx *ictx, struct input_conf *input_conf);
-
-struct m_config;
-void mp_input_register_options(struct m_config *cfg);
+void mp_input_uninit(struct input_ctx *ictx);
// Wake up sleeping input loop from another thread.
void mp_input_wakeup(struct input_ctx *ictx);
diff --git a/core/m_config.c b/core/m_config.c
index b5d1c3fefd..148a6888a2 100644
--- a/core/m_config.c
+++ b/core/m_config.c
@@ -73,7 +73,7 @@ static int parse_profile(struct m_config *config, const struct m_option *opt,
if (!list || !list[0])
return M_OPT_INVALID;
for (int i = 0; list[i]; i++) {
- struct m_profile *p = m_config_get_profile(config, list[i]);
+ struct m_profile *p = m_config_get_profile0(config, list[i]);
if (!p) {
mp_tmsg(MSGT_CFGPARSER, MSGL_WARN, "Unknown profile '%s'.\n",
list[i]);
@@ -85,19 +85,19 @@ static int parse_profile(struct m_config *config, const struct m_option *opt,
return r;
}
-static int show_profile(struct m_option *opt, char *name, char *param)
+static int show_profile(struct m_config *config, bstr param)
{
- struct m_config *config = opt->priv;
struct m_profile *p;
int i, j;
- if (!param)
+ if (!param.len)
return M_OPT_MISSING_PARAM;
if (!(p = m_config_get_profile(config, param))) {
- mp_tmsg(MSGT_CFGPARSER, MSGL_ERR, "Unknown profile '%s'.\n", param);
+ mp_tmsg(MSGT_CFGPARSER, MSGL_ERR, "Unknown profile '%.*s'.\n",
+ BSTR_P(param));
return M_OPT_EXIT - 1;
}
if (!config->profile_depth)
- mp_tmsg(MSGT_CFGPARSER, MSGL_INFO, "Profile %s: %s\n", param,
+ mp_tmsg(MSGT_CFGPARSER, MSGL_INFO, "Profile %s: %s\n", p->name,
p->desc ? p->desc : "");
config->profile_depth++;
for (i = 0; i < p->num_opts; i++) {
@@ -119,11 +119,11 @@ static int show_profile(struct m_option *opt, char *name, char *param)
continue;
memcpy(tmp, list, l);
tmp[l] = '\0';
- show_profile(opt, name, tmp);
+ show_profile(config, bstr0(tmp));
list = e + 1;
}
if (list[0] != '\0')
- show_profile(opt, name, list);
+ show_profile(config, bstr0(list));
}
}
config->profile_depth--;
@@ -132,9 +132,8 @@ static int show_profile(struct m_option *opt, char *name, char *param)
return M_OPT_EXIT - 1;
}
-static int list_options(struct m_option *opt, char *name, char *param)
+static int list_options(struct m_config *config)
{
- struct m_config *config = opt->priv;
m_config_print_option_list(config);
return M_OPT_EXIT;
}
@@ -158,6 +157,10 @@ static void m_config_add_option(struct m_config *config,
struct m_config_option *parent,
const struct m_option *arg);
+static void add_options(struct m_config *config,
+ struct m_config_option *parent,
+ const struct m_option *defs);
+
static int config_destroy(void *p)
{
struct m_config *config = p;
@@ -173,27 +176,32 @@ static int config_destroy(void *p)
return 0;
}
-struct m_config *m_config_simple(void *optstruct)
+struct m_config *m_config_new(void *talloc_parent, size_t size,
+ const void *defaults,
+ const struct m_option *options)
{
- struct m_config *config = talloc_struct(NULL, struct m_config, {
- .optstruct = optstruct,
- });
+ struct m_config *config = talloc(talloc_parent, struct m_config);
talloc_set_destructor(config, config_destroy);
+ *config = (struct m_config) {
+ .optstruct_size = size,
+ .optstruct_defaults = defaults,
+ .options = options,
+ };
+ if (size) { // size==0 means a dummy object is created
+ config->optstruct = talloc_zero_size(config, size);
+ if (defaults)
+ memcpy(config->optstruct, defaults, size);
+ if (options)
+ add_options(config, NULL, options);
+ }
return config;
}
struct m_config *m_config_from_obj_desc(void *talloc_parent,
struct m_obj_desc *desc)
{
- struct m_config *config = m_config_simple(NULL);
- talloc_steal(talloc_parent, config);
- if (desc->priv_size) {
- config->optstruct = talloc_zero_size(config, desc->priv_size);
- if (desc->priv_defaults)
- memcpy(config->optstruct, desc->priv_defaults, desc->priv_size);
- m_config_register_options(config, desc->options);
- }
- return config;
+ return m_config_new(talloc_parent, desc->priv_size, desc->priv_defaults,
+ desc->options);
}
int m_config_set_obj_params(struct m_config *conf, char **args)
@@ -225,44 +233,6 @@ int m_config_initialize_obj(struct m_config *config, struct m_obj_desc *desc,
return 0;
}
-struct m_config *m_config_new(void *optstruct,
- int includefunc(struct m_config *conf,
- char *filename))
-{
- static const struct m_option ref_opts[] = {
- { "profile", NULL, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL },
- { "show-profile", show_profile, &m_option_type_print_func_param,
- CONF_NOCFG },
- { "list-options", list_options, CONF_TYPE_PRINT_FUNC, CONF_NOCFG },
- { NULL }
- };
-
- struct m_config *config = m_config_simple(optstruct);
-
- struct m_option *self_opts = talloc_memdup(config, ref_opts,
- sizeof(ref_opts));
- for (int i = 1; self_opts[i].name; i++)
- self_opts[i].priv = config;
- m_config_register_options(config, self_opts);
- if (includefunc) {
- struct m_option *p = talloc_ptrtype(config, p);
- *p = (struct m_option){
- "include", NULL, CONF_TYPE_STRING, 0,
- };
- m_config_add_option(config, "", NULL, p);
- config->includefunc = includefunc;
- }
-
- config->use_profiles = true;
-
- return config;
-}
-
-void m_config_free(struct m_config *config)
-{
- talloc_free(config);
-}
-
static void ensure_backup(struct m_config *config, struct m_config_option *co)
{
while (co->alias_owner)
@@ -472,15 +442,6 @@ static void m_config_add_option(struct m_config *config,
add_negation_option(config, parent, arg);
}
-int m_config_register_options(struct m_config *config,
- const struct m_option *args)
-{
- assert(config != NULL);
- if (args)
- add_options(config, NULL, args);
- return 1;
-}
-
struct m_config_option *m_config_get_co(const struct m_config *config,
struct bstr name)
{
@@ -542,10 +503,14 @@ static int m_config_parse_option(struct m_config *config, void *optstruct,
return M_OPT_INVALID;
}
- if (config->includefunc && !bstrcmp0(name, "include")) {
+ if (config->includefunc && bstr_equals0(name, "include"))
return parse_include(config, param, set);
- } else if (config->use_profiles && !bstrcmp0(name, "profile"))
+ if (config->use_profiles && bstr_equals0(name, "profile"))
return parse_profile(config, co->opt, name, param, set);
+ if (config->use_profiles && bstr_equals0(name, "show-profile"))
+ return show_profile(config, param);
+ if (bstr_equals0(name, "list-options"))
+ return list_options(config);
// Option with children are a bit different to parse
if (co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) {
@@ -692,19 +657,24 @@ void m_config_print_option_list(const struct m_config *config)
mp_tmsg(MSGT_CFGPARSER, MSGL_INFO, "\nTotal: %d options\n", count);
}
-struct m_profile *m_config_get_profile(const struct m_config *config,
- char *name)
+struct m_profile *m_config_get_profile(const struct m_config *config, bstr name)
{
- struct m_profile *p;
- for (p = config->profiles; p; p = p->next)
- if (!strcmp(p->name, name))
+ for (struct m_profile *p = config->profiles; p; p = p->next) {
+ if (bstr_equals0(name, p->name))
return p;
+ }
return NULL;
}
+struct m_profile *m_config_get_profile0(const struct m_config *config,
+ char *name)
+{
+ return m_config_get_profile(config, bstr0(name));
+}
+
struct m_profile *m_config_add_profile(struct m_config *config, char *name)
{
- struct m_profile *p = m_config_get_profile(config, name);
+ struct m_profile *p = m_config_get_profile0(config, name);
if (p)
return p;
p = talloc_zero(config, struct m_profile);
diff --git a/core/m_config.h b/core/m_config.h
index 35955cfa4b..b31d7f5406 100644
--- a/core/m_config.h
+++ b/core/m_config.h
@@ -19,6 +19,7 @@
#ifndef MPLAYER_M_CONFIG_H
#define MPLAYER_M_CONFIG_H
+#include <stddef.h>
#include <stdbool.h>
#include "core/bstr.h"
@@ -71,10 +72,9 @@ struct m_profile {
/** \ingroup Config */
typedef struct m_config {
// Registered options.
- /** This contains all options and suboptions.
- */
- struct m_config_option *opts;
+ struct m_config_option *opts; // all options, even suboptions
int num_pos_opts;
+
// When options are set (via m_config_set_option or m_config_set_profile),
// back up the old value (unless it's already backed up). Used for restoring
// global options when per-file options are set.
@@ -85,17 +85,27 @@ typedef struct m_config {
// Depth when recursively including profiles.
int profile_depth;
- void *optstruct; // struct mpopts or other
- int (*includefunc)(struct m_config *conf, char *filename);
bool use_profiles;
+ int (*includefunc)(struct m_config *conf, char *filename);
+
+ const void *optstruct_defaults;
+ size_t optstruct_size;
+ const struct m_option *options; // top-level options
+
+ void *optstruct; // struct mpopts or other
} m_config_t;
// Create a new config object.
-struct m_config *
-m_config_new(void *optstruct,
- int includefunc(struct m_config *conf, char *filename));
-
-struct m_config *m_config_simple(void *optstruct);
+// talloc_parent: talloc parent context for the m_config allocation
+// size: size of the optstruct (where option values are stored)
+// defaults: if not NULL, points to a struct of same type as optstruct, which
+// contains default values for all options
+// options: list of options. Each option defines a member of the optstruct
+// and a corresponding option switch or sub-option field.
+// Note that the m_config object will keep pointers to defaults and options.
+struct m_config *m_config_new(void *talloc_parent, size_t size,
+ const void *defaults,
+ const struct m_option *options);
struct m_config *m_config_from_obj_desc(void *talloc_parent,
struct m_obj_desc *desc);
@@ -107,22 +117,11 @@ int m_config_set_obj_params(struct m_config *conf, char **args);
int m_config_initialize_obj(struct m_config *config, struct m_obj_desc *desc,
void **ppriv, char ***pargs);
-// Free a config object.
-void m_config_free(struct m_config *config);
-
void m_config_enter_file_local(struct m_config *config);
void m_config_leave_file_local(struct m_config *config);
void m_config_mark_file_local(struct m_config *config, const char *opt);
void m_config_mark_all_file_local(struct m_config *config);
-/* Register some options to be used.
- * \param config The config object.
- * \param args An array of \ref m_option struct.
- * \return 1 on success, 0 on failure.
- */
-int m_config_register_options(struct m_config *config,
- const struct m_option *args);
-
enum {
M_SETOPT_PRE_PARSE_ONLY = 1, // Silently ignore non-M_OPT_PRE_PARSE opt.
M_SETOPT_CHECK_ONLY = 2, // Don't set, just check name/value
@@ -186,8 +185,9 @@ void m_config_print_option_list(const struct m_config *config);
* \param arg The profile's name.
* \return The profile object or NULL.
*/
-struct m_profile *m_config_get_profile(const struct m_config *config,
- char *name);
+struct m_profile *m_config_get_profile0(const struct m_config *config,
+ char *name);
+struct m_profile *m_config_get_profile(const struct m_config *config, bstr name);
/* Get the profile with the given name, creating it if necessary.
* \param config The config object.
diff --git a/core/mplayer.c b/core/mplayer.c
index e7fc84e645..44cc3f5540 100644
--- a/core/mplayer.c
+++ b/core/mplayer.c
@@ -563,7 +563,7 @@ static MP_NORETURN void exit_player(struct MPContext *mpctx,
timeEndPeriod(1);
#endif
- mp_input_uninit(mpctx->input, &mpctx->opts->input);
+ mp_input_uninit(mpctx->input);
osd_free(mpctx->osd);
@@ -585,10 +585,6 @@ static MP_NORETURN void exit_player(struct MPContext *mpctx,
// must be last since e.g. mp_msg uses option values
// that will be freed by this.
- if (mpctx->mconfig)
- m_config_free(mpctx->mconfig);
- mpctx->mconfig = NULL;
-
talloc_free(mpctx);
#ifdef CONFIG_COCOA
@@ -661,7 +657,7 @@ static void load_per_protocol_config(m_config_t *conf, const char * const file)
sprintf(protocol, "%s%s", PROFILE_CFG_PROTOCOL, file);
protocol[strlen(PROFILE_CFG_PROTOCOL) + strlen(file) - strlen(str)] = '\0';
- p = m_config_get_profile(conf, protocol);
+ p = m_config_get_profile0(conf, protocol);
if (p) {
mp_tmsg(MSGT_CPLAYER, MSGL_INFO,
"Loading protocol-related profile '%s'\n", protocol);
@@ -684,7 +680,7 @@ static void load_per_extension_config(m_config_t *conf, const char * const file)
sprintf(extension, PROFILE_CFG_EXTENSION);
strncat(extension, ++str, 7);
- p = m_config_get_profile(conf, extension);
+ p = m_config_get_profile0(conf, extension);
if (p) {
mp_tmsg(MSGT_CPLAYER, MSGL_INFO,
"Loading extension-related profile '%s'\n", extension);
@@ -704,7 +700,7 @@ static void load_per_output_config(m_config_t *conf, char *cfg, char *out)
return;
sprintf(profile, "%s%s", cfg, out);
- p = m_config_get_profile(conf, profile);
+ p = m_config_get_profile0(conf, profile);
if (p) {
mp_tmsg(MSGT_CPLAYER, MSGL_INFO,
"Loading extension-related profile '%s'\n", profile);
@@ -3872,7 +3868,7 @@ static int read_keys(void *ctx, int fd)
static void init_input(struct MPContext *mpctx)
{
- mpctx->input = mp_input_init(&mpctx->opts->input, mpctx->opts->load_config);
+ mpctx->input = mp_input_init(mpctx->opts);
if (mpctx->opts->slave_mode)
mp_input_add_cmd_fd(mpctx->input, 0, USE_FD0_CMD_SELECT, MP_INPUT_SLAVE_CMD_FUNC, NULL);
else if (mpctx->opts->consolecontrols)
@@ -4597,7 +4593,6 @@ static int mpv_main(int argc, char *argv[])
struct MPContext *mpctx = talloc(NULL, MPContext);
*mpctx = (struct MPContext){
- .opts = talloc(mpctx, struct MPOpts),
.last_dvb_step = 1,
.terminal_osd_text = talloc_strdup(mpctx, ""),
.playlist = talloc_struct(mpctx, struct playlist, {0}),
@@ -4607,12 +4602,14 @@ static int mpv_main(int argc, char *argv[])
init_libav();
screenshot_init(mpctx);
- struct MPOpts *opts = mpctx->opts;
// Create the config context and register the options
- *opts = mp_default_opts;
- mpctx->mconfig = m_config_new(opts, cfg_include);
- m_config_register_options(mpctx->mconfig, mp_opts);
- mp_input_register_options(mpctx->mconfig);
+ mpctx->mconfig = m_config_new(mpctx, sizeof(struct MPOpts),
+ &mp_default_opts, mp_opts);
+ mpctx->opts = mpctx->mconfig->optstruct;
+ mpctx->mconfig->includefunc = cfg_include;
+ mpctx->mconfig->use_profiles = true;
+
+ struct MPOpts *opts = mpctx->opts;
// Preparse the command line
m_config_preparse_command_line(mpctx->mconfig, argc, argv);
diff --git a/core/options.c b/core/options.c
index dd517dbb22..ee4f783b35 100644
--- a/core/options.c
+++ b/core/options.c
@@ -313,12 +313,30 @@ static const m_option_t screenshot_conf[] = {
extern const m_option_t lavc_decode_opts_conf[];
extern const m_option_t ad_lavc_decode_opts_conf[];
+extern const m_option_t mp_input_opts[];
+
const m_option_t mp_opts[] = {
+ // handled in command line pre-parser (parser-mpcmd.c)
+ {"v", NULL, CONF_TYPE_STORE, CONF_GLOBAL | CONF_NOCFG, 0, 0, NULL},
+
+ // handled in command line parser (parser-mpcmd.c)
+ {"playlist", NULL, CONF_TYPE_STRING, CONF_NOCFG | M_OPT_MIN, 1, 0, NULL},
+ {"shuffle", NULL, CONF_TYPE_FLAG, CONF_NOCFG, 0, 0, NULL},
+ {"{", NULL, CONF_TYPE_STORE, CONF_NOCFG, 0, 0, NULL},
+ {"}", NULL, CONF_TYPE_STORE, CONF_NOCFG, 0, 0, NULL},
+
+ // handled in m_config.c
+ { "include", NULL, CONF_TYPE_STRING },
+ { "profile", NULL, CONF_TYPE_STRING_LIST },
+ { "show-profile", NULL, CONF_TYPE_STRING, CONF_NOCFG },
+ { "list-options", NULL, CONF_TYPE_STORE, CONF_NOCFG },
+
+ // handled in mplayer.c (looks at the raw argv[])
+ {"leak-report", "", CONF_TYPE_STORE, CONF_GLOBAL | CONF_NOCFG },
+
// ------------------------- common options --------------------
OPT_FLAG("quiet", quiet, CONF_GLOBAL),
{"really-quiet", &verbose, CONF_TYPE_STORE, CONF_GLOBAL|CONF_PRE_PARSE, 0, -10, NULL},
- // -v is handled in command line preparser
- {"v", NULL, CONF_TYPE_STORE, CONF_GLOBAL | CONF_NOCFG, 0, 0, NULL},
{"msglevel", (void *) msgl_config, CONF_TYPE_SUBCONFIG, CONF_GLOBAL, 0, 0, NULL},
{"msgcolor", &mp_msg_color, CONF_TYPE_FLAG, CONF_GLOBAL | CONF_PRE_PARSE, 0, 1, NULL},
{"msgmodule", &mp_msg_module, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL},
@@ -630,17 +648,10 @@ const m_option_t mp_opts[] = {
{"lircconf", &lirc_configfile, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL},
#endif
- {"leak-report", "", CONF_TYPE_PRINT, 0, 0, 0, (void*)1},
-
OPT_CHOICE_OR_INT("loop", loop_times, M_OPT_GLOBAL, 1, 10000,
({"no", -1}, {"0", -1},
{"inf", 0})),
- {"playlist", NULL, CONF_TYPE_STRING, CONF_NOCFG | M_OPT_MIN, 1, 0, NULL},
- {"shuffle", NULL, CONF_TYPE_FLAG, CONF_NOCFG, 0, 0, NULL},
- {"{", NULL, CONF_TYPE_STORE, CONF_NOCFG, 0, 0, NULL},
- {"}", NULL, CONF_TYPE_STORE, CONF_NOCFG, 0, 0, NULL},
-
OPT_FLAG("resume-playback", position_resume, 0),
OPT_FLAG("save-position-on-quit", position_save_on_quit, 0),
@@ -682,6 +693,8 @@ const m_option_t mp_opts[] = {
{"screenshot", (void *) screenshot_conf, CONF_TYPE_SUBCONFIG},
+ {"", (void *) mp_input_opts, CONF_TYPE_SUBCONFIG},
+
OPT_FLAG("list-properties", list_properties, CONF_GLOBAL),
{"identify", &mp_msg_levels[MSGT_IDENTIFY], CONF_TYPE_FLAG, CONF_GLOBAL, 0, MSGL_V, NULL},
{"help", (void *) mp_help_text, CONF_TYPE_PRINT, CONF_NOCFG|CONF_GLOBAL, 0, 0, NULL},
diff --git a/core/options.h b/core/options.h
index 45f3e858bb..2037d6da4b 100644
--- a/core/options.h
+++ b/core/options.h
@@ -234,10 +234,8 @@ typedef struct MPOpts {
int use_joystick;
int use_lirc;
int use_lircc;
-#ifdef CONFIG_COCOA
int use_ar;
int use_media_keys;
-#endif
int default_bindings;
int test;
} input;