Merge branch 'wip/libinput-tool-v2'

This commit is contained in:
Peter Hutterer 2017-05-23 13:37:06 +10:00
commit a2a8db261a
9 changed files with 461 additions and 48 deletions

View file

@ -342,11 +342,12 @@ endif
############ tools ############
tools_shared_sources = [ 'tools/shared.c',
'tools/shared.h' ]
event_debug_sources = [ 'tools/event-debug.c' ] + tools_shared_sources
event_debug_sources = [ 'tools/libinput-debug-events.c' ] + tools_shared_sources
executable('event-debug',
event_debug_sources,
dependencies : dep_libinput,
include_directories : include_directories('src'),
c_args : [ '-DTOOLS_BUILD_STANDALONE=1' ],
install : false
)
@ -355,6 +356,7 @@ executable('libinput-debug-events',
libinput_debug_events_sources,
dependencies : dep_libinput,
include_directories : include_directories('src'),
c_args : [ '-DTOOLS_BUILD_STANDALONE=1' ],
install : true
)
@ -363,8 +365,19 @@ executable('libinput-list-devices',
libinput_list_devices_sources,
dependencies : [ dep_libinput ],
include_directories : include_directories('src'),
c_args : [ '-DTOOLS_BUILD_STANDALONE=1' ],
install : true,
)
libinput_sources = [ 'tools/libinput-tool.c' ] + libinput_list_devices_sources + libinput_debug_events_sources
executable('libinput',
libinput_sources,
dependencies : dep_libinput,
include_directories : include_directories ('src'),
install : true
)
install_man('tools/libinput.1')
ptraccel_debug_sources = [ 'tools/ptraccel-debug.c' ]
executable('ptraccel-debug',

View file

@ -1,6 +1,5 @@
noinst_PROGRAMS = event-debug ptraccel-debug
bin_PROGRAMS = libinput-list-devices libinput-debug-events
noinst_LTLIBRARIES = libshared.la
bin_PROGRAMS = libinput-list-devices libinput-debug-events libinput
AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_srcdir)/src \
@ -8,37 +7,51 @@ AM_CPPFLAGS = -I$(top_srcdir)/include \
AM_CFLAGS = $(GCC_CFLAGS)
AM_CXXFLAGS = $(GCC_CXXFLAGS)
libshared_la_SOURCES = \
shared.c \
shared.h
libshared_la_CFLAGS = $(AM_CFLAGS) $(LIBEVDEV_CFLAGS)
libshared_la_LIBADD = $(LIBEVDEV_LIBS)
shared_sources = \
shared.c \
shared.h
event_debug_SOURCES = event-debug.c
event_debug_LDADD = ../src/libinput.la libshared.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
event_debug_sources = libinput-debug-events.c $(shared_sources)
event_debug_SOURCES = libinput-debug-events.c $(shared_sources)
event_debug_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
event_debug_LDFLAGS = -no-install
event_debug_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS)
event_debug_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS) \
-DTOOLS_BUILD_STANDALONE=1
ptraccel_debug_SOURCES = ptraccel-debug.c
ptraccel_debug_LDADD = ../src/libfilter.la ../src/libinput.la
ptraccel_debug_LDFLAGS = -no-install
libinput_list_devices_SOURCES = libinput-list-devices.c
libinput_list_devices_LDADD = ../src/libinput.la libshared.la $(LIBUDEV_LIBS)
libinput_list_devices_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS)
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 = $(event_debug_SOURCES)
libinput_debug_events_LDADD = $(event_debug_LDADD)
libinput_debug_events_CFLAGS = $(AM_CFLAGS) $(event_debug_CFLAGS)
libinput_debug_events_CFLAGS = $(AM_CFLAGS) $(event_debug_CFLAGS) \
-DTOOLS_BUILD_STANDALONE=1
dist_man1_MANS += libinput-debug-events.1
libinput_SOURCES = \
libinput-tool.c \
libinput-tool.h \
libinput-debug-events.c \
libinput-list-devices.c \
$(shared_sources)
libinput_LDADD = ../src/libinput.la $(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
libinput_CFLAGS = $(AM_CFLAGS) $(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS)
dist_man1_MANS += libinput.1
if BUILD_EVENTGUI
noinst_PROGRAMS += event-gui
event_gui_SOURCES = event-gui.c
event_gui_LDADD = ../src/libinput.la libshared.la $(CAIRO_LIBS) $(GTK_LIBS) $(LIBUDEV_LIBS)
event_gui_CFLAGS = $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(LIBUDEV_CFLAGS) $(AM_CFLAGS)
event_gui_SOURCES = event-gui.c $(shared_sources)
event_gui_LDADD = ../src/libinput.la $(CAIRO_LIBS) $(GTK_LIBS) \
$(LIBUDEV_LIBS) $(LIBEVDEV_LIBS)
event_gui_CFLAGS = $(CAIRO_CFLAGS) $(GTK_CFLAGS) \
$(LIBUDEV_CFLAGS) $(LIBEVDEV_CFLAGS) $(AM_CFLAGS)
event_gui_LDFLAGS = -no-install
endif

View file

@ -39,6 +39,7 @@
#include <libinput.h>
#include <libevdev/libevdev.h>
#include "libinput-tool.h"
#include "shared.h"
uint32_t start_time;
@ -896,7 +897,7 @@ mainloop(struct libinput *li)
}
int
main(int argc, char **argv)
libinput_debug_events(struct global_options *opts, int argc, char **argv)
{
struct libinput *li;
struct timespec tp;
@ -909,7 +910,7 @@ main(int argc, char **argv)
if (tools_parse_args(argc, argv, &context))
return 1;
be_quiet = context.options.quiet;
be_quiet = context.options.global_options.quiet;
li = tools_open_backend(&context);
if (!li)
@ -921,3 +922,13 @@ main(int argc, char **argv)
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

@ -34,6 +34,7 @@
#include <libinput-util.h>
#include <libinput-version.h>
#include "libinput-tool.h"
#include "shared.h"
static const char *
@ -354,39 +355,38 @@ print_device_notify(struct libinput_event *ev)
static inline void
usage(void)
{
printf("Usage: %s [--help|--version]\n"
"\n"
#if TOOLS_BUILD_STANDALONE
printf("Usage: %s [--help|--version]\n", program_invocation_short_name);
#else
printf("Usage: libinput list-devices [--help]\n");
#endif
printf("\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"
"Where multiple options are possible, the default is prefixed with \"*\".\n"
"\n"
"Options:\n"
"--help ...... show this help\n"
#if TOOLS_BUILD_STANDALONE
"--version ... show version information\n"
#endif
"\n"
"This tool requires access to the /dev/input/eventX nodes.\n",
program_invocation_short_name);
"This tool requires access to the /dev/input/eventX nodes.\n");
}
int
main(int argc, char **argv)
libinput_list_devices(struct global_options *opts, int argc, char **argv)
{
struct libinput *li;
struct tools_context context;
struct libinput_event *ev;
#if !TOOLS_BUILD_STANDALONE
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;
}
usage();
return streq(argv[1], "--help") ? EXIT_SUCCESS : EXIT_FAILURE;
}
#endif
tools_init_context(&context);
@ -406,5 +406,29 @@ main(int argc, char **argv)
libinput_unref(li);
return 0;
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 */

161
tools/libinput-tool.c Normal file
View file

@ -0,0 +1,161 @@
/*
* Copyright © 2017 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include "config.h"
#include <errno.h>
#include <getopt.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <libudev.h>
#include <libinput.h>
#include <libinput-util.h>
#include <libinput-version.h>
#include "libinput-tool.h"
void
libinput_tool_usage(void)
{
printf("Usage: libinput [GLOBAL OPTIONS] [COMMAND] [ARGS]\n"
"\n"
"This tool creates a libinput context and interacts with that context.\n"
"For detailed information about the options below, see the"
"libinput(1) man page.\n"
"\n"
"This tool usually requires access to the /dev/input/eventX nodes.\n"
"\n"
"Global options:\n"
" --help ...... show this help\n"
" --version ... show version information\n"
" --verbose ... enable verbose output for debugging\n"
" --quiet ..... reduce output (may be used with --verbose)\n"
"\n"
"Commands:\n"
" list-devices\n"
" List all devices with their default configuration options\n"
"\n"
" debug-events\n"
" Print events to stdout\n"
"\n");
}
enum command {
COMMAND_NONE,
COMMAND_LIST_DEVICES,
COMMAND_DEBUG_EVENTS,
};
enum global_opts {
GOPT_HELP = 1,
GOPT_VERSION,
GOPT_QUIET,
GOPT_VERBOSE,
};
static bool
parse_args_cmd(enum command cmd,
struct global_options *global_options,
int argc, char *argv[])
{
optind = 0;
switch (cmd) {
case COMMAND_NONE:
break;
case COMMAND_LIST_DEVICES:
return libinput_list_devices(global_options, argc, argv);
case COMMAND_DEBUG_EVENTS:
return libinput_debug_events(global_options, argc, argv);
}
return true;
}
int
main(int argc, char **argv)
{
enum command cmd = COMMAND_NONE;
const char *command;
int option_index = 0;
struct global_options global_options = {0};
if (argc == 1) {
libinput_tool_usage();
return false;
}
while (1) {
int c;
static struct option opts[] = {
{ "help", no_argument, 0, GOPT_HELP },
{ "version", no_argument, 0, GOPT_VERSION },
{ "quiet", no_argument, 0, GOPT_QUIET },
{ "verbose", no_argument, 0, GOPT_VERBOSE },
{ 0, 0, 0, 0}
};
c = getopt_long(argc, argv, "+h", opts, &option_index);
if (c == -1)
break;
switch(c) {
case 'h':
case GOPT_HELP:
libinput_tool_usage();
exit(0);
case GOPT_VERSION:
printf("%s\n", LIBINPUT_VERSION);
exit(0);
case GOPT_VERBOSE:
global_options.verbose = true;
break;
case GOPT_QUIET:
global_options.quiet = true;
break;
default:
libinput_tool_usage();
return false;
}
}
if (optind > argc) {
libinput_tool_usage();
return false;
}
command = argv[optind];
if (streq(command, "list-devices")) {
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 parse_args_cmd(cmd, &global_options, argc - optind, &argv[optind]);
}

40
tools/libinput-tool.h Normal file
View file

@ -0,0 +1,40 @@
/*
* Copyright © 2017 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef LIBINPUT_TOOL_H
#define LIBINPUT_TOOL_H 1
#include "config.h"
#include <stdbool.h>
struct global_options {
bool verbose;
bool quiet;
};
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

134
tools/libinput.1 Normal file
View file

@ -0,0 +1,134 @@
.TH LIBINPUT "1"
.SH NAME
libinput \- tool to interface with libinput
.SH SYNOPSIS
.B libinput [GLOBAL OPTIONS] [COMMAND] [ARGS]
.SH DESCRIPTION
.PP
The
.I libinput
tool creates a libinput context on the default seat "seat0" and interacts
with that libinput context.
.PP
This tool usually needs to be run as root to have access to the
/dev/input/eventX nodes.
.PP
The context created by this tool is a new libinput context and independent
of that created by the X.Org libinput driver, the Wayland compositor or any
other process that utilizes libinput (henceforth called "the caller").
Configuration options set in this context do not affect any other libinput
contexts.
.SH GLOBAL OPTIONS
These options are independent of any
.B COMMAND
.TP 8
.B --help
Print help and exit
.TP 8
.B --version
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
All commands support a
.B --help
argument that prints command-specific usage
information (e.g.
.B libinput debug-events --help)
.TP 8
.B debug-events [ARGS]
Print all events as seen by libinput. See section
.B debug-events
.TP 8
.B list-devices
List all devices recognized by libinput. See section
.B list-devices
.SS debug-events [...]
Print all events from these devices.
.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
.SH SEE ALSO
.PP
libinput(4)

View file

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

View file

@ -28,20 +28,21 @@
#include <libinput.h>
#include "libinput-tool.h"
enum tools_backend {
BACKEND_DEVICE,
BACKEND_UDEV
};
struct tools_options {
struct global_options global_options;
enum tools_backend backend;
const char *device; /* if backend is BACKEND_DEVICE */
const char *seat; /* if backend is BACKEND_UDEV */
int grab; /* EVIOCGRAB */
bool show_keycodes; /* show keycodes */
bool quiet; /* only print libinput messages */
int verbose;
int tapping;
int drag;
int drag_lock;