AC_DEFINE_UNQUOTED([DEFAULT_XKB_LAYOUT], ["$DEFAULT_XKB_LAYOUT"],
[Default XKB layout])
+AC_ARG_WITH([default_variant],
+ [AS_HELP_STRING([--with-default-variant=<path>],
+ [Default XKB variant (default: (none))])],
+ [DEFAULT_XKB_VARIANT="$withval"],
+ [DEFAULT_XKB_VARAINT=])
+if ! test "x$DEFAULT_XKB_VARIANT" = x; then
+ AC_DEFINE_UNQUOTED([DEFAULT_XKB_VARIANT], ["$DEFAULT_XKB_VARIANT"],
+ [Default XKB variant])
+fi
+
+AC_ARG_WITH([default_options],
+ [AS_HELP_STRING([--with-default-options=<path>],
+ [Default XKB options (default: (none))])],
+ [DEFAULT_XKB_OPTIONS="$withval"],
+ [DEFAULT_XKB_OPTIONS=])
+if ! test "x$DEFAULT_XKB_OPTIONS" = x; then
+ AC_DEFINE_UNQUOTED([DEFAULT_XKB_OPTIONS], ["$DEFAULT_XKB_OPTIONS"],
+ [Default XKB options])
+fi
+
AC_CONFIG_FILES([
Makefile
xkbcommon-uninstalled.pc
int log_verbosity;
void *user_data;
+ struct xkb_rule_names names_dflt;
+
darray(char *) includes;
darray(char *) failed_includes;
/* Buffer for the *Text() functions. */
char text_buffer[2048];
size_t text_next;
+
+ unsigned int use_environment_names : 1;
};
/**
return 0;
}
+#ifndef DEFAULT_XKB_VARIANT
+#define DEFAULT_XKB_VARIANT NULL
+#endif
+
+#ifndef DEFAULT_XKB_OPTIONS
+#define DEFAULT_XKB_OPTIONS NULL
+#endif
+
/**
* Create a new context.
*/
return NULL;
}
+ ctx->use_environment_names = !(flags & XKB_CONTEXT_NO_ENVIRONMENT_NAMES);
+
ctx->atom_table = atom_table_new();
if (!ctx->atom_table) {
xkb_context_unref(ctx);
return rtrn;
}
+
+const char *
+xkb_context_get_default_rules(struct xkb_context *ctx)
+{
+ const char *env = NULL;
+
+ if (ctx->use_environment_names)
+ env = getenv("XKB_DEFAULT_RULES");
+
+ return env ? env : DEFAULT_XKB_RULES;
+}
+
+const char *
+xkb_context_get_default_model(struct xkb_context *ctx)
+{
+ const char *env = NULL;
+
+ if (ctx->use_environment_names)
+ env = getenv("XKB_DEFAULT_MODEL");
+
+ return env ? env : DEFAULT_XKB_MODEL;
+}
+
+const char *
+xkb_context_get_default_layout(struct xkb_context *ctx)
+{
+ const char *env = NULL;
+
+ if (ctx->use_environment_names)
+ env = getenv("XKB_DEFAULT_LAYOUT");
+
+ return env ? env : DEFAULT_XKB_LAYOUT;
+}
+
+const char *
+xkb_context_get_default_variant(struct xkb_context *ctx)
+{
+ const char *env = NULL;
+ const char *layout = getenv("XKB_DEFAULT_VARIANT");
+
+ /* We don't want to inherit the variant if they haven't also set a
+ * layout, since they're so closely paired. */
+ if (layout && ctx->use_environment_names)
+ env = getenv("XKB_DEFAULT_VARIANT");
+
+ return env ? env : DEFAULT_XKB_VARIANT;
+}
+
+const char *
+xkb_context_get_default_options(struct xkb_context *ctx)
+{
+ const char *env = NULL;
+
+ if (ctx->use_environment_names)
+ env = getenv("XKB_DEFAULT_OPTIONS");
+
+ return env ? env : DEFAULT_XKB_OPTIONS;
+}
xkb_log_cond_level((ctx), (level), __VA_ARGS__); \
} while (0)
+const char *
+xkb_context_get_default_rules(struct xkb_context *ctx);
+
+const char *
+xkb_context_get_default_model(struct xkb_context *ctx);
+
+const char *
+xkb_context_get_default_layout(struct xkb_context *ctx);
+
+const char *
+xkb_context_get_default_variant(struct xkb_context *ctx);
+
+const char *
+xkb_context_get_default_options(struct xkb_context *ctx);
+
/*
* The format is not part of the argument list in order to avoid the
* "ISO C99 requires rest arguments to be used" warning when only the
return NULL;
}
- rmlvo = *rmlvo_in;
+ if (rmlvo_in)
+ rmlvo = *rmlvo_in;
+ else
+ memset(&rmlvo, 0, sizeof(rmlvo));
+
if (isempty(rmlvo.rules))
- rmlvo.rules = DEFAULT_XKB_RULES;
+ rmlvo.rules = xkb_context_get_default_rules(ctx);
if (isempty(rmlvo.model))
- rmlvo.model = DEFAULT_XKB_MODEL;
- if (isempty(rmlvo.layout))
- rmlvo.layout = DEFAULT_XKB_LAYOUT;
+ rmlvo.model = xkb_context_get_default_model(ctx);
+ /* Layout and variant are tied together, so don't try to use one from
+ * the caller and one from the environment. */
+ if (isempty(rmlvo.layout)) {
+ rmlvo.layout = xkb_context_get_default_layout(ctx);
+ rmlvo.variant = xkb_context_get_default_variant(ctx);
+ }
+ /* Options can be empty, so respect that if passed in. */
+ if (rmlvo.options == NULL)
+ rmlvo.options = xkb_context_get_default_options(ctx);
keymap = xkb_keymap_new(ctx, format, flags);
if (!keymap)
}
}
- if (isempty(rmlvo.rules))
- rmlvo.rules = DEFAULT_XKB_RULES;
- if (isempty(rmlvo.model))
- rmlvo.model = DEFAULT_XKB_MODEL;
- if (isempty(rmlvo.layout))
- rmlvo.layout = DEFAULT_XKB_LAYOUT;
-
ctx = test_get_context(0);
if (!ctx) {
fprintf(stderr, "Failed to get xkb context\n");
/** Flags for context creation. */
enum xkb_context_flags {
/** Create this context with an empty include path. */
- XKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0)
+ XKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0),
+ /** Don't take RMLVO names from the environment. */
+ XKB_CONTEXT_NO_ENVIRONMENT_NAMES = (1 << 1),
};
/**