[PATCH libinput 3/4] tools: add a 'libinput' tool

Peter Hutterer peter.hutterer at who-t.net
Tue May 16 23:02:31 UTC 2017


This tool will eventually replace the different libinput tools we ship atm
with the various functionalities being commands to the single tool, rather
than multiple tools.

Right now, we still build both tools separately.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 meson.build                   |  10 +++
 tools/Makefile.am             |  14 +++-
 tools/libinput-list-devices.c |  56 +++++++++++-----
 tools/libinput-tool.c         | 153 ++++++++++++++++++++++++++++++++++++++++++
 tools/libinput-tool.h         |  39 +++++++++++
 tools/libinput.1              |  76 +++++++++++++++++++++
 6 files changed, 330 insertions(+), 18 deletions(-)
 create mode 100644 tools/libinput-tool.c
 create mode 100644 tools/libinput-tool.h
 create mode 100644 tools/libinput.1

diff --git a/meson.build b/meson.build
index 6cd48d6c..090536b5 100644
--- a/meson.build
+++ b/meson.build
@@ -360,8 +360,18 @@ 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
+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',
diff --git a/tools/Makefile.am b/tools/Makefile.am
index e4443ffc..94765ced 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,5 +1,5 @@
 noinst_PROGRAMS = event-debug ptraccel-debug
-bin_PROGRAMS = libinput-list-devices libinput-debug-events
+bin_PROGRAMS = libinput-list-devices libinput-debug-events libinput
 
 AM_CPPFLAGS = -I$(top_srcdir)/include \
               -I$(top_srcdir)/src \
@@ -22,7 +22,8 @@ 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)
+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)
@@ -30,6 +31,15 @@ libinput_debug_events_LDADD = $(event_debug_LDADD)
 libinput_debug_events_CFLAGS = $(AM_CFLAGS) $(event_debug_CFLAGS)
 dist_man1_MANS += libinput-debug-events.1
 
+libinput_SOURCES = \
+		   libinput-tool.c \
+		   libinput-tool.h \
+		   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
 
diff --git a/tools/libinput-list-devices.c b/tools/libinput-list-devices.c
index aad605a4..a0154d36 100644
--- a/tools/libinput-list-devices.c
+++ b/tools/libinput-list-devices.c
@@ -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 */
diff --git a/tools/libinput-tool.c b/tools/libinput-tool.c
new file mode 100644
index 00000000..b20ed0f3
--- /dev/null
+++ b/tools/libinput-tool.c
@@ -0,0 +1,153 @@
+/*
+ * 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");
+}
+
+enum command {
+	COMMAND_NONE,
+	COMMAND_LIST_DEVICES,
+};
+
+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);
+	}
+	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 {
+		fprintf(stderr, "Invalid command '%s'\n", command);
+		return EXIT_FAILURE;
+	}
+
+	return parse_args_cmd(cmd, &global_options, argc - optind, &argv[optind]);
+}
diff --git a/tools/libinput-tool.h b/tools/libinput-tool.h
new file mode 100644
index 00000000..7b3b8b69
--- /dev/null
+++ b/tools/libinput-tool.h
@@ -0,0 +1,39 @@
+/*
+ * 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);
+
+#endif
diff --git a/tools/libinput.1 b/tools/libinput.1
new file mode 100644
index 00000000..2f2476e4
--- /dev/null
+++ b/tools/libinput.1
@@ -0,0 +1,76 @@
+.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
+.TP 8
+.B list-devices
+List all devices recognized by libinput. See section
+.B list-devices
+
+.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)
-- 
2.12.2



More information about the wayland-devel mailing list