From eb16ce2520b687a309a2236b64f72e45ebbf060a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 26 Nov 2019 10:07:51 +1000 Subject: [PATCH] tools: libinput-record: drop the explicit --multiple argument 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 --- tools/libinput-record.c | 56 +++++++++++-------------------- tools/libinput-record.man | 33 +++++++----------- tools/test-tool-option-parsing.py | 40 +++++++++++++++++++++- 3 files changed, 71 insertions(+), 58 deletions(-) diff --git a/tools/libinput-record.c b/tools/libinput-record.c index b21a881f3..b4588323a 100644 --- a/tools/libinput-record.c +++ b/tools/libinput-record.c @@ -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; diff --git a/tools/libinput-record.man b/tools/libinput-record.man index bed3d16fc..17cf5d3e6 100644 --- a/tools/libinput-record.man +++ b/tools/libinput-record.man @@ -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. diff --git a/tools/test-tool-option-parsing.py b/tools/test-tool-option-parsing.py index ad0f197dd..0484e55df 100755 --- a/tools/test-tool-option-parsing.py +++ b/tools/test-tool-option-parsing.py @@ -29,7 +29,8 @@ import resource import sys import subprocess -import time +import tempfile +from pathlib import Path def _disable_coredump(): @@ -242,6 +243,43 @@ def test_invalid_arguments(self): 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',