tools: rename list-quirks to the more generic "quirks list"
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 26 Jun 2018 03:15:13 +0000 (13:15 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 3 Jul 2018 05:16:59 +0000 (15:16 +1000)
Enables us to easily add more tools where needed and it is
more consistent with the existing tools.

The commands are now:
   libinput quirks list
   libinput quirks validate

Fixes https://gitlab.freedesktop.org/libinput/libinput/issues/66

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
doc/device-quirks.dox
meson.build
tools/libinput-list-quirks.c [deleted file]
tools/libinput-list-quirks.man [deleted file]
tools/libinput-measure-touch-size
tools/libinput-measure-touchpad-pressure
tools/libinput-quirks.c [new file with mode: 0644]
tools/libinput-quirks.man [new file with mode: 0644]

index 35e782150a5ce153b9424765b8c9316d6d8ad5b9..d436866434f2cf2a93e51650b18dd8e060a3005e 100644 (file)
@@ -54,21 +54,23 @@ Once the required section has been added, use the information from section
 
 @section device-quirks-debugging Debugging device quirks
 
-libinput provides the `libinput list-quirks` tool to list and debug model
-quirks that apply to one or more local devices.
+libinput provides the `libinput quirks` tool to debug the quirks database.
+This tool takes an action as first argument, the most common invocation is
+`libinput quirks list` to list model quirks that apply to one or more local
+devices.
 
 @verbatim
-$ libinput list-quirks /dev/input/event19
+$ libinput quirks list /dev/input/event19
 Device has no quirks defined
-$ libinput list-quirks /dev/input/event0
+$ libinput quirks list /dev/input/event0
 AttrLidSwitchReliability
 @endverbatim
 
-When called with the `--verbose` argument, `libinput list-quirks` prints
+When called with the `--verbose` argument, `libinput quirks list` prints
 information about all files and its attempts to match the device:
 
 @verbatim
-$ libinput list-quirks --verbose /dev/input/event0
+$ libinput quirks list --verbose /dev/input/event0
 quirks debug: /usr/share/share/libinput is data root
 quirks debug: /usr/share/share/libinput/10-generic-keyboard.quirks
 quirks debug: /usr/share/share/libinput/10-generic-lid.quirks
index d01c4af907cd530592c2b721718dae3e7a5f21fb..58e909b6cf30634fd8f3216a4a8fdaeca01dcf10 100644 (file)
@@ -471,21 +471,34 @@ configure_file(input : 'tools/libinput-debug-events.man',
               install_dir : join_paths(get_option('mandir'), 'man1')
               )
 
-libinput_list_quirks_sources = [ 'tools/libinput-list-quirks.c' ]
-libinput_list_quirks = executable('libinput-list-quirks',
-                                 libinput_list_quirks_sources,
-                                 dependencies : [dep_libquirks, dep_tools_shared, dep_libinput],
-                                 include_directories : [includes_src, includes_include],
-                                 install_dir : libinput_tool_path,
-                                 install : true
-                                )
+libinput_quirks_sources = [ 'tools/libinput-quirks.c' ]
+libinput_quirks = executable('libinput-quirks',
+                            libinput_quirks_sources,
+                            dependencies : [dep_libquirks, dep_tools_shared, dep_libinput],
+                            include_directories : [includes_src, includes_include],
+                            install_dir : libinput_tool_path,
+                            install : true
+                           )
 test('validate-quirks',
-     libinput_list_quirks,
-     args: ['--validate-only', '--data-dir=@0@'.format(join_paths(meson.source_root(), 'data'))]
+     libinput_quirks,
+     args: ['validate', '--data-dir=@0@'.format(join_paths(meson.source_root(), 'data'))]
      )
 
-configure_file(input : 'tools/libinput-list-quirks.man',
-              output : 'libinput-list-quirks.1',
+configure_file(input : 'tools/libinput-quirks.man',
+              output : 'libinput-quirks.1',
+              configuration : man_config,
+              install : true,
+              install_dir : join_paths(get_option('mandir'), 'man1')
+              )
+# Same man page for the subtools to stay consistent with the other tools
+configure_file(input : 'tools/libinput-quirks.man',
+              output : 'libinput-quirks-list.1',
+              configuration : man_config,
+              install : true,
+              install_dir : join_paths(get_option('mandir'), 'man1')
+              )
+configure_file(input : 'tools/libinput-quirks.man',
+              output : 'libinput-quirks-validate.1',
               configuration : man_config,
               install : true,
               install_dir : join_paths(get_option('mandir'), 'man1')
@@ -544,7 +557,7 @@ configure_file(input : 'tools/libinput-measure-touchpad-tap.man',
 config_builddir = configuration_data()
 config_builddir.set('BUILDDIR', meson.build_root())
 # libinput-measure-touchpad-pressure gets built but we install_data the
-# source instead. The built file is the one that uses the local list-quirks
+# source instead. The built file is the one that uses the local quirks
 # and should be used for debugging.
 install_data('tools/libinput-measure-touchpad-pressure',
             install_dir : libinput_tool_path)
@@ -560,7 +573,7 @@ configure_file(input : 'tools/libinput-measure-touchpad-pressure.man',
               install_dir : join_paths(get_option('mandir'), 'man1')
               )
 # libinput-measure-touch-size gets built but we install_data the source
-# instead. The built file is the one that uses the local list-quirks and
+# instead. The built file is the one that uses the local quirks and
 # should be used for debugging.
 install_data('tools/libinput-measure-touch-size',
             install_dir : libinput_tool_path)
diff --git a/tools/libinput-list-quirks.c b/tools/libinput-list-quirks.c
deleted file mode 100644 (file)
index 050b505..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright © 2018 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 <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <getopt.h>
-#include <sys/stat.h>
-
-#include "libinput-util.h"
-#include "quirks.h"
-#include "shared.h"
-
-static bool verbose = false;
-
-static void
-log_handler(struct libinput *this_is_null,
-           enum libinput_log_priority priority,
-           const char *format,
-           va_list args)
-{
-       FILE *out = stdout;
-       enum quirks_log_priorities p = (enum quirks_log_priorities)priority;
-       char buf[256] = {0};
-       const char *prefix = "";
-
-       switch (p) {
-       case QLOG_NOISE:
-       case QLOG_DEBUG:
-               if (!verbose)
-                       return;
-               prefix = "quirks debug";
-               break;
-       case QLOG_INFO:
-               prefix = "quirks info";
-               break;
-       case QLOG_ERROR:
-               out = stderr;
-               prefix = "quirks error";
-               break;
-       case QLOG_PARSER_ERROR:
-               out = stderr;
-               prefix = "quirks parser error";
-               break;
-       }
-
-       snprintf(buf, sizeof(buf), "%s: %s", prefix, format);
-       vfprintf(out, buf, args);
-}
-
-static void
-usage(void)
-{
-       printf("Usage:\n"
-              "  libinput list-quirks [--data-dir /path/to/data/dir] /dev/input/event0\n"
-              "        Print the quirks for the given device\n"
-              "\n"
-              "  libinput list-quirks [--data-dir /path/to/data/dir] --validate-only\n"
-              "        Validate the database\n");
-}
-
-static void
-simple_printf(void *userdata, const char *val)
-{
-       printf("%s\n", val);
-}
-
-int
-main(int argc, char **argv)
-{
-       struct udev *udev = NULL;
-       struct udev_device *device = NULL;
-       const char *path;
-       const char *data_path = NULL,
-                  *override_file = NULL;
-       int rc = 1;
-       struct quirks_context *quirks;
-       bool validate = false;
-
-       while (1) {
-               int c;
-               int option_index = 0;
-               enum {
-                       OPT_VERBOSE,
-                       OPT_DATADIR,
-                       OPT_VALIDATE,
-               };
-               static struct option opts[] = {
-                       { "help",     no_argument,       0, 'h' },
-                       { "verbose",  no_argument,       0, OPT_VERBOSE },
-                       { "data-dir", required_argument, 0, OPT_DATADIR },
-                       { "validate-only", no_argument,  0, OPT_VALIDATE },
-                       { 0, 0, 0, 0}
-               };
-
-               c = getopt_long(argc, argv, "h", opts, &option_index);
-               if (c == -1)
-                       break;
-
-               switch(c) {
-               case '?':
-                       exit(1);
-                       break;
-               case 'h':
-                       usage();
-                       exit(0);
-                       break;
-               case OPT_VERBOSE:
-                       verbose = true;
-                       break;
-               case OPT_DATADIR:
-                       data_path = optarg;
-                       break;
-               case OPT_VALIDATE:
-                       validate = true;
-                       break;
-               default:
-                       usage();
-                       return 1;
-               }
-       }
-
-       if (optind >= argc && !validate) {
-               usage();
-               return 1;
-       }
-
-       /* Overriding the data dir means no custom override file */
-       if (!data_path) {
-               data_path = LIBINPUT_DATA_DIR;
-               override_file = LIBINPUT_DATA_OVERRIDE_FILE;
-       }
-
-       quirks = quirks_init_subsystem(data_path,
-                                     override_file,
-                                     log_handler,
-                                     NULL,
-                                     QLOG_CUSTOM_LOG_PRIORITIES);
-       if (!quirks) {
-               fprintf(stderr,
-                       "Failed to initialize the device quirks. "
-                       "Please see the above errors "
-                       "and/or re-run with --verbose for more details\n");
-               return 1;
-       }
-
-       if (validate) {
-               rc = 0;
-               goto out;
-       }
-
-       udev = udev_new();
-       path = argv[optind];
-       if (strneq(path, "/sys/", 5)) {
-               device = udev_device_new_from_syspath(udev, path);
-       } else {
-               struct stat st;
-               if (stat(path, &st) < 0) {
-                       fprintf(stderr, "Error: %s: %m\n", path);
-                       goto out;
-               }
-
-               device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
-       }
-       if (device) {
-               tools_list_device_quirks(quirks, device, simple_printf, NULL);
-               rc = 0;
-       } else {
-               usage();
-               rc = 1;
-       }
-
-       udev_device_unref(device);
-out:
-       udev_unref(udev);
-
-       quirks_context_unref(quirks);
-
-       return rc;
-}
diff --git a/tools/libinput-list-quirks.man b/tools/libinput-list-quirks.man
deleted file mode 100644 (file)
index e18495f..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-.TH libinput-list-quirks "1" "" "libinput @LIBINPUT_VERSION@" "libinput Manual"
-.SH NAME
-libinput\-list\-quirks \- quirk debug helper for libinput
-.SH SYNOPSIS
-.B libinput list\-quirks [\-\-data\-dir /path/to/dir] [\-\-verbose\fB] \fI/dev/input/event0\fB
-.br
-.B libinput list\-quirks [\-\-data\-dir /path/to/dir] [\-\-verbose\fB] \-\-validate\-only
-.br
-.B libinput list\-quirks [\-\-help]
-.SH DESCRIPTION
-.PP
-The
-.B "libinput list\-quirks"
-tool parses the quirks file in \fIdata\-dir\fR and prints all quirks applied
-to the given device.
-.PP
-This is a debugging tool only, its output and behavior may change at any
-time. Do not rely on the output.
-.SH OPTIONS
-.TP 8
-.B \-\-data\-dir \fI/path/to/dir\fR
-Use the given directory as data directory for quirks files.
-.TP 8
-.B \-\-help
-Print help
-.TP 8
-.B \-\-validate\-only
-Only validate that the quirks files can be parsed. When this option is
-given, no device file should be supplied.
-.TP 8
-.B \-\-verbose
-Use verbose output, useful for debugging.
-.SH LIBINPUT
-Part of the
-.B libinput(1)
-suite
index 990a72a787163f40788476c556468f25c84f20e6..a26243548ada15b10201e4496a9581f283079d2f 100755 (executable)
@@ -224,12 +224,12 @@ class Device(object):
     def _init_thresholds_from_quirks(self):
         # This is replaced for the version in builddir but left as-is for
         # the installed version. For the builddir one we need to run the
-        # builddir list-quirks
+        # builddir quirks list
         builddir = '@BUILDDIR@'
         if builddir != '@' + 'BUILDDIR' + '@':
-            command = [os.path.join(builddir, 'libinput-list-quirks')]
+            command = [os.path.join(builddir, 'libinput-quirks'), 'list']
         else:
-            command = ['libinput', 'list-quirks']
+            command = ['libinput', 'quirks', 'list']
         command.append(self.path)
         cmd = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         if cmd.returncode != 0:
index 23ec513b669166e868829a3672187701e0283ea5..b842cbd259a01689d59be0c67a8c6f751caa89d7 100755 (executable)
@@ -202,12 +202,12 @@ class Device(object):
     def _init_thresholds_from_quirks(self):
         # This is replaced for the version in builddir but left as-is for
         # the installed version. For the builddir one we need to run the
-        # builddir list-quirks
+        # builddir quirks list
         builddir = '@BUILDDIR@'
         if builddir != '@' + 'BUILDDIR' + '@':
-            command = [os.path.join(builddir, 'libinput-list-quirks')]
+            command = [os.path.join(builddir, 'libinput-quirks'), 'list']
         else:
-            command = ['libinput', 'list-quirks']
+            command = ['libinput', 'quirks', 'list']
         command.append(self.path)
         cmd = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         if cmd.returncode != 0:
diff --git a/tools/libinput-quirks.c b/tools/libinput-quirks.c
new file mode 100644 (file)
index 0000000..88c860e
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright © 2018 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 <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <getopt.h>
+#include <sys/stat.h>
+
+#include "libinput-util.h"
+#include "quirks.h"
+#include "shared.h"
+
+static bool verbose = false;
+
+static void
+log_handler(struct libinput *this_is_null,
+           enum libinput_log_priority priority,
+           const char *format,
+           va_list args)
+{
+       FILE *out = stdout;
+       enum quirks_log_priorities p = (enum quirks_log_priorities)priority;
+       char buf[256] = {0};
+       const char *prefix = "";
+
+       switch (p) {
+       case QLOG_NOISE:
+       case QLOG_DEBUG:
+               if (!verbose)
+                       return;
+               prefix = "quirks debug";
+               break;
+       case QLOG_INFO:
+               prefix = "quirks info";
+               break;
+       case QLOG_ERROR:
+               out = stderr;
+               prefix = "quirks error";
+               break;
+       case QLOG_PARSER_ERROR:
+               out = stderr;
+               prefix = "quirks parser error";
+               break;
+       }
+
+       snprintf(buf, sizeof(buf), "%s: %s", prefix, format);
+       vfprintf(out, buf, args);
+}
+
+static void
+usage(void)
+{
+       printf("Usage:\n"
+              "  libinput quirks list [--data-dir /path/to/data/dir] /dev/input/event0\n"
+              "        Print the quirks for the given device\n"
+              "\n"
+              "  libinput quirks validate [--data-dir /path/to/data/dir]\n"
+              "        Validate the database\n");
+}
+
+static void
+simple_printf(void *userdata, const char *val)
+{
+       printf("%s\n", val);
+}
+
+int
+main(int argc, char **argv)
+{
+       struct udev *udev = NULL;
+       struct udev_device *device = NULL;
+       const char *path;
+       const char *data_path = NULL,
+                  *override_file = NULL;
+       int rc = 1;
+       struct quirks_context *quirks;
+       bool validate = false;
+
+       while (1) {
+               int c;
+               int option_index = 0;
+               enum {
+                       OPT_VERBOSE,
+                       OPT_DATADIR,
+               };
+               static struct option opts[] = {
+                       { "help",     no_argument,       0, 'h' },
+                       { "verbose",  no_argument,       0, OPT_VERBOSE },
+                       { "data-dir", required_argument, 0, OPT_DATADIR },
+                       { 0, 0, 0, 0}
+               };
+
+               c = getopt_long(argc, argv, "h", opts, &option_index);
+               if (c == -1)
+                       break;
+
+               switch(c) {
+               case '?':
+                       exit(1);
+                       break;
+               case 'h':
+                       usage();
+                       exit(0);
+                       break;
+               case OPT_VERBOSE:
+                       verbose = true;
+                       break;
+               case OPT_DATADIR:
+                       data_path = optarg;
+                       break;
+               default:
+                       usage();
+                       return 1;
+               }
+       }
+
+       if (optind >= argc) {
+               usage();
+               return 1;
+       }
+
+       if (streq(argv[optind], "list")) {
+               optind++;
+               if (optind >= argc) {
+                       usage();
+                       return 1;
+               }
+       } else if (streq(argv[optind], "validate")) {
+               optind++;
+               if (optind < argc) {
+                       usage();
+                       return 1;
+               }
+               validate = true;
+       } else {
+               fprintf(stderr, "Unnkown action '%s'\n", argv[optind]);
+               return 1;
+       }
+
+       /* Overriding the data dir means no custom override file */
+       if (!data_path) {
+               data_path = LIBINPUT_DATA_DIR;
+               override_file = LIBINPUT_DATA_OVERRIDE_FILE;
+       }
+
+       quirks = quirks_init_subsystem(data_path,
+                                     override_file,
+                                     log_handler,
+                                     NULL,
+                                     QLOG_CUSTOM_LOG_PRIORITIES);
+       if (!quirks) {
+               fprintf(stderr,
+                       "Failed to initialize the device quirks. "
+                       "Please see the above errors "
+                       "and/or re-run with --verbose for more details\n");
+               return 1;
+       }
+
+       if (validate) {
+               rc = 0;
+               goto out;
+       }
+
+       udev = udev_new();
+       path = argv[optind];
+       if (strneq(path, "/sys/", 5)) {
+               device = udev_device_new_from_syspath(udev, path);
+       } else {
+               struct stat st;
+               if (stat(path, &st) < 0) {
+                       fprintf(stderr, "Error: %s: %m\n", path);
+                       goto out;
+               }
+
+               device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
+       }
+       if (device) {
+               tools_list_device_quirks(quirks, device, simple_printf, NULL);
+               rc = 0;
+       } else {
+               usage();
+               rc = 1;
+       }
+
+       udev_device_unref(device);
+out:
+       udev_unref(udev);
+
+       quirks_context_unref(quirks);
+
+       return rc;
+}
diff --git a/tools/libinput-quirks.man b/tools/libinput-quirks.man
new file mode 100644 (file)
index 0000000..097dabe
--- /dev/null
@@ -0,0 +1,43 @@
+.TH libinput-quirks "1" "" "libinput @LIBINPUT_VERSION@" "libinput Manual"
+.SH NAME
+libinput\-quirks \- quirk debug helper for libinput
+.SH SYNOPSIS
+.B libinput quirks list [\-\-data\-dir /path/to/dir] [\-\-verbose\fB] \fI/dev/input/event0\fB
+.br
+.sp
+.B libinput quirks validate [\-\-data\-dir /path/to/dir] [\-\-verbose\fB]
+.br
+.sp
+.B libinput quirks \-\-help
+.SH DESCRIPTION
+.PP
+The
+.B "libinput quirks"
+tool interacts with libinput's quirks database.
+.PP
+When invoked as
+.B libinput quirks list,
+the tool lists all quirks applied to the given device.
+.PP
+When invoked as
+.B libinput quirks validate,
+the tool checks for parsing errors in the quirks files and fails
+if a parsing error is encountered.
+.PP
+This is a debugging tool only, its output and behavior may change at any
+time. Do not rely on the output.
+.SH OPTIONS
+.TP 8
+.B \-\-data\-dir \fI/path/to/dir\fR
+Use the given directory as data directory for quirks files. When omitted,
+the default directories are used.
+.TP 8
+.B \-\-help
+Print help
+.TP 8
+.B \-\-verbose
+Use verbose output, useful for debugging.
+.SH LIBINPUT
+Part of the
+.B libinput(1)
+suite