mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-28 01:30:07 +01:00
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 <peter.hutterer@who-t.net>
This commit is contained in:
parent
5a275ef171
commit
eb16ce2520
3 changed files with 71 additions and 58 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue