Skip to content

Commit

Permalink
interactive-evdev: includes options
Browse files Browse the repository at this point in the history
Currently there is no interactive tool allowing to set the include
paths of the context, such as in "compile-keymap". Note that only
"interactive-evdev" makes sense, because it does not rely on a
compositor.

Add --include and --include-defaults to "interactive-evdev" tool.
The code is adapted from "compile-keymap".
  • Loading branch information
wismill committed Jun 26, 2023
1 parent 2c86216 commit de9d820
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
39 changes: 36 additions & 3 deletions tools/interactive-evdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -365,8 +366,9 @@ sigintr_handler(int signum)
static void
usage(FILE *fp, char *progname)
{
fprintf(fp, "Usage: %s [--rules=<rules>] [--model=<model>] "
"[--layout=<layout>] [--variant=<variant>] [--options=<options>]\n",
fprintf(fp, "Usage: %s [--include=<path>] [--include-defaults] "
"[--rules=<rules>] [--model=<model>] [--layout=<layout>] "
"[--variant=<variant>] [--options=<options>]\n",
progname);
fprintf(fp, " or: %s --keymap <path to keymap file>\n",
progname);
Expand All @@ -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;
Expand All @@ -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,
Expand All @@ -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},
Expand All @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
12 changes: 12 additions & 0 deletions tools/xkbcli-interactive-evdev.1
Original file line number Diff line number Diff line change
Expand Up @@ -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
.
Expand Down

0 comments on commit de9d820

Please sign in to comment.