tools: switch the libinput tool to be an exec-ing tool

Chaining args together inside a single binary would be nice, but it gets nasty
quickly (as I found out adding 3, 4 extra commands). Switch over to using a
git-style exec-ing command where libinput merely changes argv[0] and then
executes whatever it assembled. And those binaries can hide in libexec so they
don't clutter up the global namespace.

This also makes it a lot easier to write man pages, adopt the same style as
git uses.

Compatibilty wrapper scripts are provided for libinput-list-devices and
libinput-debug events. These warn the user about the changed command, then
exec the new one. Expect these wrappers to be removed at some point in the
future.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2017-05-25 10:12:26 +10:00
parent 67000f1ae6
commit e9fc59efc8
15 changed files with 146 additions and 248 deletions

View file

@ -340,6 +340,8 @@ if doxygen.found()
endif endif
############ tools ############ ############ tools ############
libinput_tool_path = join_paths(get_option('prefix'), get_option('libexecdir'), 'libinput')
config_h.set_quoted('LIBINPUT_TOOL_PATH', libinput_tool_path)
tools_shared_sources = [ 'tools/shared.c', tools_shared_sources = [ 'tools/shared.c',
'tools/shared.h' ] 'tools/shared.h' ]
libinput_debug_events_sources = [ 'tools/libinput-debug-events.c' ] + tools_shared_sources libinput_debug_events_sources = [ 'tools/libinput-debug-events.c' ] + tools_shared_sources
@ -347,7 +349,7 @@ executable('libinput-debug-events',
libinput_debug_events_sources, libinput_debug_events_sources,
dependencies : dep_libinput, dependencies : dep_libinput,
include_directories : include_directories('src'), include_directories : include_directories('src'),
c_args : [ '-DTOOLS_BUILD_STANDALONE=1' ], install_dir : libinput_tool_path,
install : true install : true
) )
@ -356,11 +358,11 @@ executable('libinput-list-devices',
libinput_list_devices_sources, libinput_list_devices_sources,
dependencies : [ dep_libinput ], dependencies : [ dep_libinput ],
include_directories : include_directories('src'), include_directories : include_directories('src'),
c_args : [ '-DTOOLS_BUILD_STANDALONE=1' ], install_dir : libinput_tool_path,
install : true, install : true,
) )
libinput_sources = [ 'tools/libinput-tool.c' ] + libinput_list_devices_sources + libinput_debug_events_sources libinput_sources = [ 'tools/libinput-tool.c' ]
executable('libinput', executable('libinput',
libinput_sources, libinput_sources,
@ -402,6 +404,7 @@ endif
install_man('tools/libinput-list-devices.1', install_man('tools/libinput-list-devices.1',
'tools/libinput-debug-events.1') 'tools/libinput-debug-events.1')
meson.add_install_script('tools/install-compat-scripts.sh')
############ tests ############ ############ tests ############

2
tools/.gitignore vendored
View file

@ -1,4 +1,2 @@
event-gui event-gui
ptraccel-debug ptraccel-debug
libinput-list-devices
libinput-debug-events

View file

@ -1,5 +1,8 @@
noinst_PROGRAMS = ptraccel-debug noinst_PROGRAMS = ptraccel-debug
bin_PROGRAMS = libinput-list-devices libinput-debug-events libinput bin_PROGRAMS = libinput
toolsdir = $(libexecdir)/libinput
tools_PROGRAMS =
bin_SCRIPTS = libinput-list-devices.compat libinput-debug-events.compat
AM_CPPFLAGS = -I$(top_srcdir)/include \ AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_srcdir)/src \ -I$(top_srcdir)/src \
@ -15,27 +18,26 @@ ptraccel_debug_SOURCES = ptraccel-debug.c
ptraccel_debug_LDADD = ../src/libfilter.la ../src/libinput.la ptraccel_debug_LDADD = ../src/libfilter.la ../src/libinput.la
ptraccel_debug_LDFLAGS = -no-install ptraccel_debug_LDFLAGS = -no-install
libinput_list_devices_SOURCES = libinput-list-devices.c $(shared_sources)
libinput_list_devices_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
libinput_list_devices_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS) \
-DTOOLS_BUILD_STANDALONE=1
dist_man1_MANS = libinput-list-devices.1
libinput_debug_events_SOURCES = libinput-debug-events.c $(shared_sources)
libinput_debug_events_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
libinput_debug_events_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS) \
-DTOOLS_BUILD_STANDALONE=1
dist_man1_MANS += libinput-debug-events.1
libinput_SOURCES = \ libinput_SOURCES = \
libinput-tool.c \ libinput-tool.c \
libinput-tool.h \ libinput-tool.h \
libinput-debug-events.c \
libinput-list-devices.c \
$(shared_sources) $(shared_sources)
libinput_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS) libinput_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
libinput_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS) libinput_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS) \
dist_man1_MANS += libinput.1 -DLIBINPUT_TOOL_PATH="\"@libexecdir@/libinput\""
dist_man1_MANS = libinput.1
tools_PROGRAMS += libinput-list-devices
libinput_list_devices_SOURCES = libinput-list-devices.c $(shared_sources)
libinput_list_devices_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
libinput_list_devices_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS)
dist_man1_MANS += libinput-list-devices.1
tools_PROGRAMS += libinput-debug-events
libinput_debug_events_SOURCES = libinput-debug-events.c $(shared_sources)
libinput_debug_events_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
libinput_debug_events_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS)
dist_man1_MANS += libinput-debug-events.1
if BUILD_EVENTGUI if BUILD_EVENTGUI
noinst_PROGRAMS += event-gui noinst_PROGRAMS += event-gui
@ -48,4 +50,12 @@ event_gui_CFLAGS = $(CAIRO_CFLAGS) $(GTK_CFLAGS) \
event_gui_LDFLAGS = -no-install event_gui_LDFLAGS = -no-install
endif endif
EXTRA_DIST = make-ptraccel-graphs.sh EXTRA_DIST = make-ptraccel-graphs.sh $(bin_SCRIPTS)
install-data-hook:
(cd $(DESTDIR)$(bindir) && mv libinput-list-devices.compat libinput-list-devices)
(cd $(DESTDIR)$(bindir) && mv libinput-debug-events.compat libinput-debug-events)
uninstall-local:
rm -f $(DESTDIR)$(bindir)/libinput-list-devices
rm -f $(DESTDIR)$(bindir)/libinput-debug-events

View file

@ -0,0 +1,9 @@
#!/bin/sh
#
# This does not honor $bindir properly, because we cannot get to it
# here. Does anyone build to something but prefix/bin?
#
bindir="${DESTDIR}/${MESON_INSTALL_PREFIX}/bin"
mkdir -p "$bindir"
cp "${MESON_SOURCE_ROOT}/tools/libinput-list-devices.compat" "${bindir}/libinput-list-devices"
cp "${MESON_SOURCE_ROOT}/tools/libinput-debug-events.compat" "${bindir}/libinput-debug-events"

View file

@ -2,11 +2,11 @@
.SH NAME .SH NAME
libinput-debug-events \- debug helper for libinput libinput-debug-events \- debug helper for libinput
.SH SYNOPSIS .SH SYNOPSIS
.B libinput-debug-events [--help] [--show-keycodes] .B libinput debug-events [--help] [--show-keycodes]
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
The The
.I libinput-debug-events .B "libinput debug-events"
tool creates a libinput context and prints all events from these devices. tool creates a libinput context and prints all events from these devices.
.PP .PP
This is a debugging tool only, its output may change at any time. Do not This is a debugging tool only, its output may change at any time. Do not
@ -31,3 +31,7 @@ removed at any time.
.PP .PP
Events shown by this tool may not correspond to the events seen by a Events shown by this tool may not correspond to the events seen by a
different user of libinput. This tool initializes a separate context. different user of libinput. This tool initializes a separate context.
.SH LIBINPUT
Part of the
.B libinput(1)
suite

View file

@ -897,7 +897,7 @@ mainloop(struct libinput *li)
} }
int int
libinput_debug_events(struct global_options *opts, int argc, char **argv) main(int argc, char **argv)
{ {
struct libinput *li; struct libinput *li;
struct timespec tp; struct timespec tp;
@ -910,7 +910,7 @@ libinput_debug_events(struct global_options *opts, int argc, char **argv)
if (tools_parse_args(argc, argv, &context)) if (tools_parse_args(argc, argv, &context))
return 1; return 1;
be_quiet = context.options.global_options.quiet; be_quiet = context.options.quiet;
li = tools_open_backend(&context); li = tools_open_backend(&context);
if (!li) if (!li)
@ -922,13 +922,3 @@ libinput_debug_events(struct global_options *opts, int argc, char **argv)
return 0; return 0;
} }
#if TOOLS_BUILD_STANDALONE
int
main(int argc, char **argv)
{
struct global_options opts = {0};
return libinput_debug_events(&opts, argc, argv);
}
#endif

View file

@ -0,0 +1,4 @@
#!/bin/sh
echo "WARNING: This compatibility wrapper will be removed in the future. Please run 'libinput debug-events' instead" 1>&2
exec libinput debug-events $@

View file

@ -2,17 +2,17 @@
.SH NAME .SH NAME
libinput-list-devices \- list local devices as recognized by libinput libinput-list-devices \- list local devices as recognized by libinput
.SH SYNOPSIS .SH SYNOPSIS
.B libinput-list-devices [--help] .B libinput list-devices [--help]
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
The The
.I libinput-list-devices .B "libinput list-devices"
tool creates a libinput context on the default seat "seat0" and lists all tool creates a libinput context on the default seat "seat0" and lists all
devices recognized by libinput. Each device shows available configurations devices recognized by libinput. Each device shows available configurations
the respective default configuration setting. the respective default configuration setting.
.PP .PP
For configuration options that allow multiple different settings (e.g. For configuration options that allow multiple different settings
scrolling), all available settings are listed. The default setting is (e.g. scrolling), all available settings are listed. The default setting is
prefixed by an asterisk (*). prefixed by an asterisk (*).
.PP .PP
This tool usually needs to be run as root to have access to the This tool usually needs to be run as root to have access to the
@ -32,6 +32,10 @@ driver or the Wayland compositor.
.PP .PP
An xorg.conf(5) configuration entry or Wayland compositor setting may have An xorg.conf(5) configuration entry or Wayland compositor setting may have
changed configurations on a device. The changed configurations on a device. The
.I libinput-list-devices .B "libinput list-devices"
tool only shows the device's default configuration, not the current tool only shows the device's default configuration, not the current
configuration. configuration.
.SH LIBINPUT
Part of the
.B libinput(1)
suite

44
tools/libinput-list-devices.c Normal file → Executable file
View file

@ -355,11 +355,7 @@ print_device_notify(struct libinput_event *ev)
static inline void static inline void
usage(void) usage(void)
{ {
#if TOOLS_BUILD_STANDALONE
printf("Usage: %s [--help|--version]\n", program_invocation_short_name);
#else
printf("Usage: libinput list-devices [--help]\n"); printf("Usage: libinput list-devices [--help]\n");
#endif
printf("\n" printf("\n"
"This tool creates a libinput context on the default seat \"seat0\"\n" "This tool creates a libinput context on the default seat \"seat0\"\n"
"and lists all devices recognized by libinput and the configuration options.\n" "and lists all devices recognized by libinput and the configuration options.\n"
@ -367,26 +363,30 @@ usage(void)
"\n" "\n"
"Options:\n" "Options:\n"
"--help ...... show this help\n" "--help ...... show this help\n"
#if TOOLS_BUILD_STANDALONE
"--version ... show version information\n" "--version ... show version information\n"
#endif
"\n" "\n"
"This tool requires access to the /dev/input/eventX nodes.\n"); "This tool requires access to the /dev/input/eventX nodes.\n");
} }
int int
libinput_list_devices(struct global_options *opts, int argc, char **argv) main(int argc, char **argv)
{ {
struct libinput *li; struct libinput *li;
struct tools_context context; struct tools_context context;
struct libinput_event *ev; struct libinput_event *ev;
#if !TOOLS_BUILD_STANDALONE
if (argc > 1) { if (argc > 1) {
if (streq(argv[1], "--help")) {
usage(); usage();
return streq(argv[1], "--help") ? EXIT_SUCCESS : EXIT_FAILURE; return 0;
} else if (streq(argv[1], "--version")) {
printf("%s\n", LIBINPUT_VERSION);
return 0;
} else {
usage();
return 1;
}
} }
#endif
tools_init_context(&context); tools_init_context(&context);
@ -408,27 +408,3 @@ libinput_list_devices(struct global_options *opts, int argc, char **argv)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
#if TOOLS_BUILD_STANDALONE
int
main(int argc, char **argv)
{
struct global_options options = {0};
if (argc > 1) {
if (streq(argv[1], "--help")) {
usage();
return 0;
} else if (streq(argv[1], "--version")) {
printf("%s\n", LIBINPUT_VERSION);
return 0;
} else {
usage();
return 1;
}
}
return libinput_list_devices(&options, argc - optind, &argv[optind]);
}
#endif /* TOOLS_BUILD_STANDALONE */

View file

@ -0,0 +1,4 @@
#!/bin/sh
echo "WARNING: This compatibility wrapper will be removed in the future. Please run 'libinput list-devices' instead" 1>&2
exec libinput list-devices $@

View file

@ -63,58 +63,67 @@ libinput_tool_usage(void)
"\n"); "\n");
} }
enum command {
COMMAND_NONE,
COMMAND_LIST_DEVICES,
COMMAND_DEBUG_EVENTS,
};
enum global_opts { enum global_opts {
GOPT_HELP = 1, GOPT_HELP = 1,
GOPT_VERSION, GOPT_VERSION,
GOPT_QUIET,
GOPT_VERBOSE,
}; };
static int static inline void
run_args_cmd(enum command cmd, setup_path(void)
struct global_options *global_options,
int argc, char *argv[])
{ {
optind = 0; const char *path = getenv("PATH");
char new_path[PATH_MAX];
switch (cmd) { snprintf(new_path,
case COMMAND_NONE: sizeof(new_path),
break; "%s:%s",
case COMMAND_LIST_DEVICES: LIBINPUT_TOOL_PATH,
return libinput_list_devices(global_options, argc, argv); path ? path : "");
case COMMAND_DEBUG_EVENTS: setenv("PATH", new_path, 1);
return libinput_debug_events(global_options, argc, argv); }
static int
exec_command(int real_argc, char **real_argv)
{
char *argv[64] = {NULL};
char executable[128];
const char *command;
int rc;
assert((size_t)real_argc < ARRAY_LENGTH(argv));
command = real_argv[0];
rc = snprintf(executable, sizeof(executable), "libinput-%s", command);
if (rc >= (int)sizeof(executable)) {
libinput_tool_usage();
return EXIT_FAILURE;
} }
argv[0] = executable;
for (int i = 1; i < real_argc; i++)
argv[i] = real_argv[i];
setup_path();
rc = execvp(executable, argv);
fprintf(stderr,
"Failed to execute '%s' (%s)\n",
command,
strerror(errno));
return EXIT_FAILURE; return EXIT_FAILURE;
} }
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
enum command cmd = COMMAND_NONE;
const char *command;
int option_index = 0; int option_index = 0;
struct global_options global_options = {0};
if (argc == 1) {
libinput_tool_usage();
return EXIT_FAILURE;
}
while (1) { while (1) {
int c; int c;
static struct option opts[] = { static struct option opts[] = {
{ "help", no_argument, 0, GOPT_HELP }, { "help", no_argument, 0, GOPT_HELP },
{ "version", no_argument, 0, GOPT_VERSION }, { "version", no_argument, 0, GOPT_VERSION },
{ "quiet", no_argument, 0, GOPT_QUIET },
{ "verbose", no_argument, 0, GOPT_VERBOSE },
{ 0, 0, 0, 0} { 0, 0, 0, 0}
}; };
@ -130,33 +139,19 @@ main(int argc, char **argv)
case GOPT_VERSION: case GOPT_VERSION:
printf("%s\n", LIBINPUT_VERSION); printf("%s\n", LIBINPUT_VERSION);
return EXIT_SUCCESS; return EXIT_SUCCESS;
case GOPT_VERBOSE:
global_options.verbose = true;
break;
case GOPT_QUIET:
global_options.quiet = true;
break;
default: default:
libinput_tool_usage(); libinput_tool_usage();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
if (optind > argc) { if (optind >= argc) {
libinput_tool_usage(); libinput_tool_usage();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
command = argv[optind]; argv += optind;
argc -= optind;
if (streq(command, "list-devices")) { return exec_command(argc, argv);
cmd = COMMAND_LIST_DEVICES;
} else if (streq(command, "debug-events")) {
cmd = COMMAND_DEBUG_EVENTS;
} else {
fprintf(stderr, "Invalid command '%s'\n", command);
return EXIT_FAILURE;
}
return run_args_cmd(cmd, &global_options, argc - optind, &argv[optind]);
} }

View file

@ -28,13 +28,6 @@
#include <stdbool.h> #include <stdbool.h>
struct global_options {
bool verbose;
bool quiet;
};
void libinput_tool_usage(void); void libinput_tool_usage(void);
int libinput_list_devices(struct global_options *opts, int argc, char **argv);
int libinput_debug_events(struct global_options *opts, int argc, char **argv);
#endif #endif

View file

@ -2,11 +2,11 @@
.SH NAME .SH NAME
libinput \- tool to interface with libinput libinput \- tool to interface with libinput
.SH SYNOPSIS .SH SYNOPSIS
.B libinput [GLOBAL OPTIONS] [COMMAND] [ARGS] .B libinput [--help] [--version] <command> [<args>]
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
The The
.I libinput .B "libinput"
tool creates a libinput context on the default seat "seat0" and interacts tool creates a libinput context on the default seat "seat0" and interacts
with that libinput context. with that libinput context.
.PP .PP
@ -18,116 +18,33 @@ of that created by the X.Org libinput driver, the Wayland compositor or any
other process that utilizes libinput (henceforth called "the caller"). other process that utilizes libinput (henceforth called "the caller").
Configuration options set in this context do not affect any other libinput Configuration options set in this context do not affect any other libinput
contexts. contexts.
.SH GLOBAL OPTIONS .PP
These options are independent of any Note that a device may be recognized by this tool but not handled by the
.B COMMAND X.Org libinput driver or the Wayland compositor.
.SH OPTIONS
.TP 8 .TP 8
.B --help .B --help
Print help and exit Print help and exit
.TP 8 .TP 8
.B --version .B --version
Print the version and exit Print the version and exit
.TP 8
.B --verbose
Enable verbose mode. In verbose mode, libinput will print a number of
debug messages to stdout. The exact behavior of verbose mode depends on the
.B COMMAND.
.TP 8
.B --quiet
Enable quiet mode. In quiet mode, most messages normally printed to stdout
will be omitted. The exact behavior of quiet mode depends on the
.B COMMAND.
.SH COMMANDS .SH COMMANDS
All commands support a All commands support a
.B --help .B --help
argument that prints command-specific usage argument that prints command-specific usage
information (e.g. information, e.g.
.B libinput debug-events --help) .B "libinput debug-events --help".
.TP 8 .TP 8
.B debug-events [ARGS] .B libinput-debug-events(1)
Print all events as seen by libinput. See section Print all events as seen by libinput.
.B debug-events
.TP 8 .TP 8
.B list-devices .B libinput-list-devices(1)
List all devices recognized by libinput. See section List all devices recognized by libinput.
.B list-devices .SH LIBINPUT
Part of the
.SS debug-events [...] .B libinput(1)
Print all events from these devices. suite
.PP
This is a debugging tool only, its output may change at any time. Do not
rely on the output.
.PP
.B --device /path/to/device
.IP
Use a path backend for the device for the given path. This option is
mutually exclusive with the
.B --udev
option.
.PP
.B --grab
.IP
Exclusively grab all devices. This will prevent events from being sent to
any other caller. It is recommended this option is only used together with
the
.B --device
option, otherwise a user may not be able to terminate this tool.
.PP
.B --udev <name>
.IP
Use a udev backend for this context with the given seat name. This option is
mutually exclusive with the
.B --device
option.
.PP
.B --show-keycodes
.IP
Print all keycodes as-is. Without this argument, most key events shown by
this tool are obfuscated to avoid passwords and other sensitive
information showing up in the output.
.PP
.B --enable-<feature>
or
.B --disable-<feature>
.IP
Enable or disable the given feature. For a full list of features, see the
.B --help
output. Requests to enable or disable a feature on a device that does
not provide that feature, or where that feature is already enabled or
disabled will be silently ignored.
.PP
.B --set-<feature>=<value>
.IP
Set the given feature to the given value. For a full list of features, see
the
.B --help
output. Requests to set a feature on a device that does not provide that
feature, or where that feature is already set to that value, or where the
value is not available on that device will be silently ignored
.SS list-devices
List all devices recognized by libinput. Each device shows available
configurations the respective
.B default
configuration setting.
.PP
For configuration options that allow multiple different settings (e.g.
scrolling), all available settings are listed. The default setting is
prefixed by an asterisk (*).
.PP
Note that some specific feature may still be available on a device even when
no configuration is exposed, a lack of a configuration option does not
necessarily mean that this feature does not work.
.PP
Note that this command only lists
.B default
configuration settings, settings modified in other contextx by the caller
are not reflected in this tool.
.SH NOTES
.PP
A device may be recognized by this libinput context but not handled by the
X.Org libinput driver or the Wayland compositor.
.PP .PP
.SH SEE ALSO .SH SEE ALSO
.PP .PP

View file

@ -95,12 +95,7 @@ log_handler(struct libinput *li,
void void
tools_usage(void) tools_usage(void)
{ {
#if TOOLS_BUILD_STANDALONE
printf("Usage: %s [options] [--udev [<seat>]|--device /dev/input/event0]\n",
program_invocation_short_name);
#else
printf("Usage: libinput debug-events [options] [--udev [<seat>]|--device /dev/input/event0]\n"); printf("Usage: libinput debug-events [options] [--udev [<seat>]|--device /dev/input/event0]\n");
#endif
printf("--udev <seat>.... Use udev device discovery (default).\n" printf("--udev <seat>.... Use udev device discovery (default).\n"
" Specifying a seat ID is optional.\n" " Specifying a seat ID is optional.\n"
"--device /path/to/device .... open the given device only\n" "--device /path/to/device .... open the given device only\n"
@ -134,11 +129,8 @@ tools_usage(void)
"Other options:\n" "Other options:\n"
"--grab .......... Exclusively grab all openend devices\n" "--grab .......... Exclusively grab all openend devices\n"
"--help .......... Print this help.\n" "--help .......... Print this help.\n"
); "--verbose ....... Print debugging output.\n"
#if TOOLS_BUILD_STANDALONE
printf("--verbose ....... Print debugging output.\n"
"--quiet ......... Only print libinput messages, useful in combination with --verbose.\n"); "--quiet ......... Only print libinput messages, useful in combination with --verbose.\n");
#endif
} }
void void
@ -180,10 +172,8 @@ tools_parse_args(int argc, char **argv, struct tools_context *context)
{ "udev", no_argument, 0, OPT_UDEV }, { "udev", no_argument, 0, OPT_UDEV },
{ "grab", no_argument, 0, OPT_GRAB }, { "grab", no_argument, 0, OPT_GRAB },
{ "help", no_argument, 0, OPT_HELP }, { "help", no_argument, 0, OPT_HELP },
#if TOOLS_BUILD_STANDALONE
{ "verbose", no_argument, 0, OPT_VERBOSE }, { "verbose", no_argument, 0, OPT_VERBOSE },
{ "quiet", no_argument, 0, OPT_QUIET }, { "quiet", no_argument, 0, OPT_QUIET },
#endif
{ "enable-tap", no_argument, 0, OPT_TAP_ENABLE }, { "enable-tap", no_argument, 0, OPT_TAP_ENABLE },
{ "disable-tap", no_argument, 0, OPT_TAP_DISABLE }, { "disable-tap", no_argument, 0, OPT_TAP_DISABLE },
{ "enable-drag", no_argument, 0, OPT_DRAG_ENABLE }, { "enable-drag", no_argument, 0, OPT_DRAG_ENABLE },
@ -234,7 +224,7 @@ tools_parse_args(int argc, char **argv, struct tools_context *context)
options->grab = 1; options->grab = 1;
break; break;
case OPT_VERBOSE: case OPT_VERBOSE:
options->global_options.verbose = 1; options->verbose = 1;
break; break;
case OPT_TAP_ENABLE: case OPT_TAP_ENABLE:
options->tapping = 1; options->tapping = 1;
@ -373,7 +363,7 @@ tools_parse_args(int argc, char **argv, struct tools_context *context)
options->show_keycodes = true; options->show_keycodes = true;
break; break;
case OPT_QUIET: case OPT_QUIET:
options->global_options.quiet = true; options->quiet = true;
break; break;
default: default:
tools_usage(); tools_usage();
@ -495,12 +485,12 @@ tools_open_backend(struct tools_context *context)
li = open_udev(&interface, li = open_udev(&interface,
context, context,
options->seat, options->seat,
options->global_options.verbose); options->verbose);
} else if (options->backend == BACKEND_DEVICE) { } else if (options->backend == BACKEND_DEVICE) {
li = open_device(&interface, li = open_device(&interface,
context, context,
options->device, options->device,
options->global_options.verbose); options->verbose);
} else { } else {
abort(); abort();
} }

View file

@ -36,7 +36,8 @@ enum tools_backend {
}; };
struct tools_options { struct tools_options {
struct global_options global_options; bool verbose;
bool quiet;
enum tools_backend backend; enum tools_backend backend;
const char *device; /* if backend is BACKEND_DEVICE */ const char *device; /* if backend is BACKEND_DEVICE */
const char *seat; /* if backend is BACKEND_UDEV */ const char *seat; /* if backend is BACKEND_UDEV */