tools: libinput-record: drop the explicit --multiple argument
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 26 Nov 2019 00:07:51 +0000 (10:07 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 27 Nov 2019 00:34:18 +0000 (10:34 +1000)
If we want to record multiple events, let's just specify multiple event nodes.
No need for a specific extra argument here.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
tools/libinput-record.c
tools/libinput-record.man
tools/test-tool-option-parsing.py

index b21a881f3797db20f7416c4bf3ae070bbd3ecc9e..b4588323a6b168c2db777c94e56e0fadb088f93d 100644 (file)
@@ -2292,7 +2292,7 @@ init_libinput(struct record_context *ctx)
 static inline void
 usage(void)
 {
-       printf("Usage: %s [--help] [--multiple|--all] [--autorestart] [--output-file filename] [/dev/input/event0] [...]\n"
+       printf("Usage: %s [--help] [--all] [--autorestart] [--output-file filename] [/dev/input/event0] [...]\n"
               "Common use-cases:\n"
               "\n"
               " sudo %s -o recording.yml\n"
@@ -2303,7 +2303,7 @@ usage(void)
               "    As above, but restarts after 2s of inactivity on the device.\n"
               "    Note, the output file is only the prefix.\n"
               "\n"
-              " sudo %s --multiple -o recording.yml /dev/input/event3 /dev/input/event4\n"
+              " sudo %s -o recording.yml /dev/input/event3 /dev/input/event4\n"
               "    Records the two devices into the same recordings file.\n"
               "\n"
               "For more information, see the %s(1) man page\n",
@@ -2343,7 +2343,7 @@ main(int argc, char **argv)
        };
        struct record_device *d, *tmp;
        const char *output_arg = NULL;
-       bool multiple = false, all = false, with_libinput = false;
+       bool all = false, with_libinput = false;
        int ndevices;
        int rc = EXIT_FAILURE;
 
@@ -2379,8 +2379,7 @@ main(int argc, char **argv)
                case OPT_KEYCODES:
                        ctx.show_keycodes = true;
                        break;
-               case OPT_MULTIPLE:
-                       multiple = true;
+               case OPT_MULTIPLE: /* deprecated */
                        break;
                case OPT_ALL:
                        all = true;
@@ -2395,12 +2394,6 @@ main(int argc, char **argv)
                }
        }
 
-       if (all && multiple) {
-               fprintf(stderr,
-                       "Only one of --multiple and --all allowed.\n");
-               goto out;
-       }
-
        if (ctx.timeout > 0 && output_arg == NULL) {
                fprintf(stderr,
                        "Option --autorestart requires --output-file\n");
@@ -2411,32 +2404,14 @@ main(int argc, char **argv)
 
        ndevices = argc - optind;
 
-       if (multiple) {
-               if (output_arg == NULL) {
-                       fprintf(stderr,
-                               "Option --multiple requires --output-file\n");
-                       goto out;
-               }
-
-               if (ndevices <= 1) {
-                       fprintf(stderr,
-                               "Option --multiple requires all device nodes on the commandline\n");
-                       goto out;
-               }
-
-               for (int i = ndevices; i > 0; i -= 1) {
-                       char *devnode = safe_strdup(argv[optind + i - 1]);
-
-                       if (!init_device(&ctx, devnode))
-                               goto out;
-               }
-       } else if (all) {
+       if (all) {
                char **devices; /* NULL-terminated */
                char **d;
 
                if (output_arg == NULL) {
                        fprintf(stderr,
                                "Option --all requires --output-file\n");
+                       rc = EXIT_INVALID_USAGE;
                        goto out;
                }
 
@@ -2452,14 +2427,23 @@ main(int argc, char **argv)
                }
 
                strv_free(devices);
-       } else {
-               char *path;
-
-               if (ndevices > 1) {
-                       fprintf(stderr, "More than one device, do you want --multiple?\n");
+       } else if (ndevices > 1) {
+               if (ndevices > 1 && output_arg == NULL) {
+                       fprintf(stderr,
+                               "Recording multiple devices requires --output-file\n");
+                       rc = EXIT_INVALID_USAGE;
                        goto out;
                }
 
+               for (int i = ndevices; i > 0; i -= 1) {
+                       char *devnode = safe_strdup(argv[optind + i - 1]);
+
+                       if (!init_device(&ctx, devnode))
+                               goto out;
+               }
+       } else {
+               char *path;
+
                path = ndevices <= 0 ? select_device() : safe_strdup(argv[optind++]);
                if (path == NULL) {
                        goto out;
index bed3d16fc9b45f5775b2f5bb0e550e8d12e7ad0d..17cf5d3e6d877c80a8287aaae925ff31936f500e 100644 (file)
@@ -2,7 +2,7 @@
 .SH NAME
 libinput\-record \- record kernel events
 .SH SYNOPSIS
-.B libinput record [options] [\fI/dev/input/event0\fB]
+.B libinput record [options] [\fI/dev/input/event0\fB [\fI/dev/input/event1\fB ...]]
 .SH DESCRIPTION
 .PP
 The \fBlibinput record\fR tool records kernel events from a device and
@@ -15,9 +15,9 @@ By default it prints to stdout unless the \fB-o\fR option is given.
 The events recorded are independent of libinput itself, updating or
 removing libinput will not change the event stream.
 .SH OPTIONS
-If a device node is given, this tool opens that device node. Otherwise,
-a list of devices is presented and the user can select the device to record.
-If unsure, run without any arguments.
+If one or more device nodes are given, this tool opens those device nodes.
+Otherwise, a list of devices is presented and the user can select the device
+to record. If unsure, run without any arguments.
 .TP 8
 .B \-\-help
 Print help
@@ -25,10 +25,9 @@ Print help
 .B \-\-all
 Record all \fI/dev/input/event*\fR devices available on the system. This
 option should be used in exceptional cases only, the output file is almost
-always too noisy and replaying the recording may not be possible. Use
-\fB\-\-multiple\fR instead.
-This option requires that a \fB\-\-output-file\fR is specified and may not
-be used together with \fB\-\-multiple\fR.
+always too noisy and replaying the recording may not be possible.
+This option requires \fB\-\-output-file\fR and no device
+nodes may be provided on the commandline.
 .TP 8
 .B \-\-autorestart=s
 Terminate the current recording after
@@ -43,15 +42,8 @@ greater than 0.
 .TP 8
 .B \-\-output-file=filename.yml
 .PD 1
-Specifies the output file to use. If \fB\-\-autorestart\fR or
-\fB\-\-multiple\fR is given, the filename is used as prefix only.
-.TP 8
-.B \-\-multiple
-Record multiple devices at once, see section
-.B RECORDING MULTIPLE DEVICES
-This option requires that a
-\fB\-\-output-file\fR is specified and that all devices to be recorded are
-given on the commandline.
+Specifies the output file to use. If \fB\-\-autorestart\fR is given,
+the filename is used as prefix only.
 .TP 8
 .B \-\-show\-keycodes
 Show keycodes as-is in the recording. By default, common keys are obfuscated
@@ -67,16 +59,15 @@ for more details.
 .SH RECORDING MULTIPLE DEVICES
 Sometimes it is necessary to record the events from multiple devices
 simultaneously, e.g.  when an interaction between a touchpad and a keyboard
-causes a bug. The \fB\-\-multiple\fR option records multiple devices with
+causes a bug. \fBlibinput record\fR records multiple devices with
 an identical time offset, allowing for correct replay of the interaction.
 .PP
-The \fB\-\-multiple\fR option requires that an output filename is given.
-This filename is used as prefix, with the event node number appended.
+If multiple devices are recorded, an output filename must be provided.
 .PP
 All devices to be recorded must be provided on the commandline, an example
 invocation is:
 
-.B libinput record \-\-multiple \-o tap-bug /dev/input/event3 /dev/input/event7
+.B libinput record \-o tap-bug /dev/input/event3 /dev/input/event7
 
 Note that when recording multiple devices, only the first device is printed
 immediately, all other devices and their events are printed on exit.
index ad0f197ddd963673fef50709d59ec41fb59f8244..0484e55df0df6f9048b8cea4733c1dd10da5dc7a 100755 (executable)
@@ -29,7 +29,8 @@ import unittest
 import resource
 import sys
 import subprocess
-import time
+import tempfile
+from pathlib import Path
 
 
 def _disable_coredump():
@@ -242,6 +243,43 @@ class TestDebugGUI(TestToolWithOptions, TestLibinputTool):
         self.run_command_unrecognized_option(['--version'])
 
 
+class TestRecord(TestLibinputTool):
+    subtool = 'record'
+
+    def setUp(self):
+        self.tmpdir = tempfile.TemporaryDirectory()
+        self.outfile = Path(self.tmpdir.name, 'record.out')
+
+    def tearDown(self):
+        self.tmpdir.cleanup()
+
+    def test_args(self):
+        self.run_command_success(['--help'])
+        self.run_command_success(['--show-keycodes'])
+        self.run_command_success(['--with-libinput'])
+
+    def test_multiple_deprecated(self):
+        # this arg is deprecated and a noop
+        self.run_command_success(['--multiple'])
+
+    def test_all(self):
+        self.run_command_success(['--all', '-o', self.outfile])
+
+    def test_autorestart(self):
+        self.run_command_success(['--autorestart=2'])
+
+    def test_outfile(self):
+        self.run_command_success(['-o', self.outfile])
+        self.run_command_success(['--output-file', self.outfile])
+        self.run_command_success(['--output-file={}'.format(self.outfile)])
+
+    def test_device_single(self):
+        self.run_command_success(['/dev/input/event0'])
+
+    def test_device_multiple(self):
+        self.run_command_success(['-o', self.outfile, '/dev/input/event0', '/dev/input/event1'])
+
+
 if __name__ == '__main__':
     parser = argparse.ArgumentParser(description='Verify a libinput tool\'s option parsing')
     parser.add_argument('--tool-path', metavar='/path/to/builddir/libinput',