git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit2d9009360f0193c1678668519cdaf9ed2e0b5b77
parent281cbd50d5
authorLeon Henrik Plickat <[email protected]>
date2022-02-03 11:39
input: Improve input device name format

The name now includes the type, for the case of a physical device
advertising more than one logical device.

 doc/riverctl.1.scd     |  2 ++
 river/InputManager.zig | 10 +++++++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/doc/riverctl.1.scd b/doc/riverctl.1.scd
index c1d86f1..32be2a1 100644
--- a/doc/riverctl.1.scd
+++ b/doc/riverctl.1.scd
@@ -293,6 +293,8 @@ A complete list may be found in _/usr/include/linux/input-event-codes.h_
 
 The _input_ command can be used to create a configuration rule for an input
 device identified by its _name_.
+The _name_ of an input device consists of its type, its numerical vendor id,
+its numerical product id and finally its self-advertised name, separated by -.
 
 A list of all device properties that can be configured maybe found below.
 However note that not every input device supports every property.
diff --git a/river/InputManager.zig b/river/InputManager.zig
index e08b02d..5df6448 100644
--- a/river/InputManager.zig
+++ b/river/InputManager.zig
@@ -46,11 +46,15 @@ pub const InputDevice = struct {
     identifier: []const u8,
 
     pub fn init(self: *InputDevice, device: *wlr.InputDevice) !void {
-        // The identifier is formatted exactly as in Sway
         const identifier = try std.fmt.allocPrint(
             util.gpa,
-            "{}:{}:{s}",
-            .{ device.vendor, device.product, mem.trim(u8, mem.span(device.name), &ascii.spaces) },
+            "{s}-{}-{}-{s}",
+            .{
+                @tagName(device.type),
+                device.vendor,
+                device.product,
+                mem.trim(u8, mem.span(device.name), &ascii.spaces),
+            },
         );
         for (identifier) |*char| {
             if (char.* == ' ' or !std.ascii.isPrint(char.*)) {