diff options
author | Daniel Stone <daniel@fooishbar.org> | 2013-02-28 10:48:40 -0800 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2013-03-19 10:53:37 +0000 |
commit | fbe5e6751e7ac806f8d55689e02966a1b995f3af (patch) | |
tree | e193e79801672c42d2264c187b5eaad9c753af50 | |
parent | d4c22ecc8a272da5d21f2b7991edf200b8873dea (diff) | |
download | xorg-lib-libxkbcommon-fbe5e6751e7ac806f8d55689e02966a1b995f3af.tar.gz |
Add environment overrides for default RMLVO
You can now set default values in the environment, as well as a context
option to ignore the environment, e.g. for tests.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r-- | configure.ac | 20 | ||||
-rw-r--r-- | src/context.c | 72 | ||||
-rw-r--r-- | src/context.h | 15 | ||||
-rw-r--r-- | src/keymap.c | 21 | ||||
-rw-r--r-- | test/rmlvo-to-kccgst.c | 7 | ||||
-rw-r--r-- | xkbcommon/xkbcommon.h | 4 |
6 files changed, 126 insertions, 13 deletions
diff --git a/configure.ac b/configure.ac index a0fcfe6..f795510 100644 --- a/configure.ac +++ b/configure.ac @@ -114,6 +114,26 @@ AC_ARG_WITH([default_layout], 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 diff --git a/src/context.c b/src/context.c index 2dd8ea9..8d56487 100644 --- a/src/context.c +++ b/src/context.c @@ -44,6 +44,8 @@ struct xkb_context { int log_verbosity; void *user_data; + struct xkb_rule_names names_dflt; + darray(char *) includes; darray(char *) failed_includes; @@ -52,6 +54,8 @@ struct xkb_context { /* Buffer for the *Text() functions. */ char text_buffer[2048]; size_t text_next; + + unsigned int use_environment_names : 1; }; /** @@ -271,6 +275,14 @@ log_verbosity(const char *verbosity) { 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. */ @@ -305,6 +317,8 @@ xkb_context_new(enum xkb_context_flags flags) 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); @@ -418,3 +432,61 @@ xkb_context_get_buffer(struct xkb_context *ctx, size_t size) 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; +} diff --git a/src/context.h b/src/context.h index 2f94988..7c061a0 100644 --- a/src/context.h +++ b/src/context.h @@ -77,6 +77,21 @@ xkb_log(struct xkb_context *ctx, enum xkb_log_level level, 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 diff --git a/src/keymap.c b/src/keymap.c index 8404c03..b468f94 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -153,13 +153,24 @@ xkb_keymap_new_from_names(struct xkb_context *ctx, 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) diff --git a/test/rmlvo-to-kccgst.c b/test/rmlvo-to-kccgst.c index bba2bde..bab725d 100644 --- a/test/rmlvo-to-kccgst.c +++ b/test/rmlvo-to-kccgst.c @@ -61,13 +61,6 @@ main(int argc, char *argv[]) } } - 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"); diff --git a/xkbcommon/xkbcommon.h b/xkbcommon/xkbcommon.h index 1756948..cdc021b 100644 --- a/xkbcommon/xkbcommon.h +++ b/xkbcommon/xkbcommon.h @@ -417,7 +417,9 @@ xkb_keysym_to_utf32(xkb_keysym_t keysym); /** 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), }; /** |