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

commit42f712a9de5a55901063a4e28cbbadcaa3198eb9
parent68eb974308
authorLeon Henrik Plickat <[email protected]>
date2021-06-10 09:38
Add `list-inputs` command

 doc/riverctl.1.scd      |  3 +++
 river/command.zig       |  1 +
 river/command/input.zig | 31 +++++++++++++++++++++++++++++++
 3 files changed, 35 insertions(+)

diff --git a/doc/riverctl.1.scd b/doc/riverctl.1.scd
index 9e106c1..caad6f1 100644
--- a/doc/riverctl.1.scd
+++ b/doc/riverctl.1.scd
@@ -269,6 +269,9 @@ A complete list may be found in _/usr/include/linux/input-event-codes.h_
 
 ## INPUT CONFIGURATION
 
+*list-inputs*
+	List all input devices.
+
 The _input_ command can be used to create a configuration rule for an input
 device identified by its _name_.
 
diff --git a/river/command.zig b/river/command.zig
index 9cdface..5738366 100644
--- a/river/command.zig
+++ b/river/command.zig
@@ -58,6 +58,7 @@ const str_to_impl_fn = [_]struct {
     .{ .name = "focus-output",           .impl = @import("command/focus_output.zig").focusOutput },
     .{ .name = "focus-view",             .impl = @import("command/focus_view.zig").focusView },
     .{ .name = "input",                  .impl = @import("command/input.zig").input },
+    .{ .name = "list-inputs",            .impl = @import("command/input.zig").listInputs },
     .{ .name = "map",                    .impl = @import("command/map.zig").map },
     .{ .name = "map-pointer",            .impl = @import("command/map.zig").mapPointer },
     .{ .name = "mod-layout-value",       .impl = @import("command/layout.zig").modLayoutValue },
diff --git a/river/command/input.zig b/river/command/input.zig
index cbf3342..c2ba937 100644
--- a/river/command/input.zig
+++ b/river/command/input.zig
@@ -27,6 +27,37 @@ const Seat = @import("../Seat.zig");
 const InputConfig = @import("../InputConfig.zig");
 const InputManager = @import("../InputManager.zig");
 
+pub fn listInputs(
+    allocator: *mem.Allocator,
+    seat: *Seat,
+    args: []const []const u8,
+    out: *?[]const u8,
+) Error!void {
+    var input_list = std.ArrayList(u8).init(allocator);
+    const writer = input_list.writer();
+    var prev = false;
+
+    var it = server.input_manager.input_devices.first;
+    while (it) |node| : (it = node.next) {
+        const configured = for (server.input_manager.input_configs.items) |*input_config| {
+            if (mem.eql(u8, input_config.identifier, mem.sliceTo(node.data.identifier, 0))) {
+                break true;
+            }
+        } else false;
+
+        if (prev) try input_list.appendSlice("\n");
+        prev = true;
+
+        try writer.print("{s}\n\ttype: {s}\n\tconfigured: {s}\n", .{
+            node.data.identifier,
+            @tagName(node.data.device.type),
+            configured,
+        });
+    }
+
+    out.* = input_list.toOwnedSlice();
+}
+
 pub fn input(
     allocator: *mem.Allocator,
     seat: *Seat,