%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
%{_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*
'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',
'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',
--- /dev/null
+.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
--- /dev/null
+#!/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")