diff --git a/.gitlab-ci/libinput.spec.in b/.gitlab-ci/libinput.spec.in index 0b3e98fd..e3872f9c 100644 --- a/.gitlab-ci/libinput.spec.in +++ b/.gitlab-ci/libinput.spec.in @@ -100,6 +100,7 @@ intended to be run by users. %files utils %{_libexecdir}/libinput/libinput-debug-gui %{_libexecdir}/libinput/libinput-debug-tablet +%{_libexecdir}/libinput/libinput-list-kernel-devices %{_libexecdir}/libinput/libinput-measure %{_libexecdir}/libinput/libinput-measure-fuzz %{_libexecdir}/libinput/libinput-measure-touchpad-tap @@ -115,6 +116,7 @@ intended to be run by users. %{_libexecdir}/libinput/libinput-analyze-touch-down-state %{_mandir}/man1/libinput-debug-gui.1* %{_mandir}/man1/libinput-debug-tablet.1* +%{_mandir}/man1/libinput-list-kernel-devices.1* %{_mandir}/man1/libinput-measure.1* %{_mandir}/man1/libinput-measure-fuzz.1* %{_mandir}/man1/libinput-measure-touchpad-tap.1* diff --git a/meson.build b/meson.build index d9e3eff7..fda3e7a8 100644 --- a/meson.build +++ b/meson.build @@ -507,6 +507,7 @@ src_python_tools = files( 'tools/libinput-analyze-per-slot-delta.py', 'tools/libinput-analyze-recording.py', 'tools/libinput-analyze-touch-down-state.py', + 'tools/libinput-list-kernel-devices.py', 'tools/libinput-measure-fuzz.py', 'tools/libinput-measure-touchpad-size.py', 'tools/libinput-measure-touchpad-tap.py', @@ -961,6 +962,7 @@ src_man += files( 'tools/libinput-debug-events.man', 'tools/libinput-debug-tablet.man', 'tools/libinput-list-devices.man', + 'tools/libinput-list-kernel-devices.man', 'tools/libinput-measure.man', 'tools/libinput-measure-fuzz.man', 'tools/libinput-measure-touchpad-size.man', diff --git a/tools/libinput-list-kernel-devices.man b/tools/libinput-list-kernel-devices.man new file mode 100644 index 00000000..b6dc685c --- /dev/null +++ b/tools/libinput-list-kernel-devices.man @@ -0,0 +1,25 @@ +.TH libinput-list-kernel-devices "1" "" "libinput @LIBINPUT_VERSION@" "libinput Manual" +.SH NAME +libinput\-list\-kernel\-devices \- list all kernel input devices +.SH SYNOPSIS +.B libinput list\-kernel\-devices [\-\-help] +.SH DESCRIPTION +.PP +The +.B "libinput list\-kernel\-devices" +tool iterates through the list of available kernel devices and prints +their device node and device name. +.SH OPTIONS +.TP 8 +.B \-\-help +Print help +.SH NOTES +.PP +A device may be available but not recognized by libinput. This may indicate +a bug with the udev configuration. See the +.B "libinput list\-devices" +tools for the devices recognized by libinput. +.SH LIBINPUT +Part of the +.B libinput(1) +suite diff --git a/tools/libinput-list-kernel-devices.py b/tools/libinput-list-kernel-devices.py new file mode 100755 index 00000000..95caa08b --- /dev/null +++ b/tools/libinput-list-kernel-devices.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +# vim: set expandtab shiftwidth=4: +# -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */ +# +# 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. + +import argparse +import sys + +try: + import pyudev +except ModuleNotFoundError as e: + print("Error: {}".format(str(e)), file=sys.stderr) + print( + "One or more python modules are missing. Please install those " + "modules and re-run this tool." + ) + sys.exit(1) + + +def list_devices(): + devices = {} + context = pyudev.Context() + for device in context.list_devices(subsystem="input"): + if (device.device_node or "").startswith("/dev/input/event"): + parent = device.parent + if parent is not None: + name = parent.properties["NAME"] or "" + # The udev name includes enclosing quotes + devices[device.device_node] = name[1:-1] + + def versionsort(key): + return int(key[len("/dev/input/event") :]) + + for k in sorted(devices, key=versionsort): + print(f"{k}:\t{devices[k]}") + + +def main(): + parser = argparse.ArgumentParser(description="List kernel devices") + args = parser.parse_args() + + list_devices() + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("Exited on user request") diff --git a/tools/libinput.man b/tools/libinput.man index effe763c..27ff12dc 100644 --- a/tools/libinput.man +++ b/tools/libinput.man @@ -45,6 +45,9 @@ A commandline tool to debug tablet axis values .B libinput\-list\-devices(1) List all devices recognized by libinput .TP 8 +.B libinput\-list\-kernel-devices(1) +List all kernel devices available on this system +.TP 8 .B libinput\-measure(1) Measure various properties of devices .TP 8