diff --git a/tools/interactive-evdev.c b/tools/interactive-evdev.c index 8b0bce0..6cacae6 100644 --- a/tools/interactive-evdev.c +++ b/tools/interactive-evdev.c @@ -59,6 +59,7 @@ static bool report_state_changes; static bool with_compose; static enum xkb_consumed_mode consumed_mode = XKB_CONSUMED_MODE_XKB; +#define DEFAULT_INCLUDE_PATH_PLACEHOLDER "__defaults__" #define NLONGS(n) (((n) + LONG_BIT - 1) / LONG_BIT) static bool @@ -365,8 +366,9 @@ sigintr_handler(int signum) static void usage(FILE *fp, char *progname) { - fprintf(fp, "Usage: %s [--rules=] [--model=] " - "[--layout=] [--variant=] [--options=]\n", + fprintf(fp, "Usage: %s [--include=] [--include-defaults] " + "[--rules=] [--model=] [--layout=] " + "[--variant=] [--options=]\n", progname); fprintf(fp, " or: %s --keymap \n", progname); @@ -386,6 +388,8 @@ main(int argc, char *argv[]) struct xkb_context *ctx = NULL; struct xkb_keymap *keymap = NULL; struct xkb_compose_table *compose_table = NULL; + const char *includes[64]; + size_t num_includes = 0; const char *rules = NULL; const char *model = NULL; const char *layout = NULL; @@ -395,6 +399,8 @@ main(int argc, char *argv[]) const char *locale; struct sigaction act; enum options { + OPT_INCLUDE, + OPT_INCLUDE_DEFAULTS, OPT_RULES, OPT_MODEL, OPT_LAYOUT, @@ -408,6 +414,8 @@ main(int argc, char *argv[]) }; static struct option opts[] = { {"help", no_argument, 0, 'h'}, + {"include", required_argument, 0, OPT_INCLUDE}, + {"include-defaults", no_argument, 0, OPT_INCLUDE_DEFAULTS}, {"rules", required_argument, 0, OPT_RULES}, {"model", required_argument, 0, OPT_MODEL}, {"layout", required_argument, 0, OPT_LAYOUT}, @@ -432,6 +440,20 @@ main(int argc, char *argv[]) break; switch (opt) { + case OPT_INCLUDE: + if (num_includes >= ARRAY_SIZE(includes)) { + fprintf(stderr, "error: too many includes\n"); + exit(EXIT_INVALID_USAGE); + } + includes[num_includes++] = optarg; + break; + case OPT_INCLUDE_DEFAULTS: + if (num_includes >= ARRAY_SIZE(includes)) { + fprintf(stderr, "error: too many includes\n"); + exit(EXIT_INVALID_USAGE); + } + includes[num_includes++] = DEFAULT_INCLUDE_PATH_PLACEHOLDER; + break; case OPT_RULES: rules = optarg; break; @@ -479,12 +501,23 @@ main(int argc, char *argv[]) } } - ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + ctx = xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES); if (!ctx) { fprintf(stderr, "Couldn't create xkb context\n"); goto out; } + if (num_includes == 0) + includes[num_includes++] = DEFAULT_INCLUDE_PATH_PLACEHOLDER; + + for (size_t i = 0; i < num_includes; i++) { + const char *include = includes[i]; + if (strcmp(include, DEFAULT_INCLUDE_PATH_PLACEHOLDER) == 0) + xkb_context_include_path_append_default(ctx); + else + xkb_context_include_path_append(ctx, include); + } + if (keymap_path) { FILE *file = fopen(keymap_path, "rb"); if (!file) { diff --git a/tools/xkbcli-interactive-evdev.1 b/tools/xkbcli-interactive-evdev.1 index 58be555..13c7b2c 100644 --- a/tools/xkbcli-interactive-evdev.1 +++ b/tools/xkbcli-interactive-evdev.1 @@ -37,6 +37,18 @@ This is a debugging tool, its behavior or output is not guaranteed to be stable. .It Fl \-help Print help and exit . +.It Fl \-include Ar PATH +Add the given path to the include path list. +This option is order\-dependent, include paths given first are searched first. +If an include path is given, the default include path list is not used. +Use +.Fl -\-include\-defaults +to add the default include paths. +. +.It Fl \-include\-defaults +Add the default set of include directories. +This option is order-dependent, include paths given first are searched first. +. .It Fl \-rules Ar rules The XKB ruleset .