diff options
| author | Isaac Freund <ifreund@ifreund.xyz> | 2020-04-12 22:19:48 +0200 |
|---|---|---|
| committer | Isaac Freund <ifreund@ifreund.xyz> | 2020-04-12 22:19:48 +0200 |
| commit | 0f52f664f22c81e3971cfbf62d0f2f6da90c98f1 (patch) | |
| tree | c17fae327f85713197803517be79470daba2da3e /src/input_manager.zig | |
| parent | d92c7a5a7125602951849800b0054681e3ea6631 (diff) | |
| download | river-0f52f664f22c81e3971cfbf62d0f2f6da90c98f1.tar.gz river-0f52f664f22c81e3971cfbf62d0f2f6da90c98f1.tar.xz | |
Introduce InputManager for eventual multi-seat
Diffstat (limited to 'src/input_manager.zig')
| -rw-r--r-- | src/input_manager.zig | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/input_manager.zig b/src/input_manager.zig new file mode 100644 index 0000000..885680c --- /dev/null +++ b/src/input_manager.zig @@ -0,0 +1,43 @@ +const std = @import("std"); +const c = @import("c.zig"); + +const Seat = @import("seat.zig").Seat; +const Server = @import("server.zig").Server; + +pub const InputManager = struct { + const Self = @This(); + + const default_seat = "seat0"; + + server: *Server, + + seats: std.TailQueue(Seat), + + listen_new_input: c.wl_listener, + + pub fn init(self: *Self, server: *Server) !void { + self.server = server; + + self.seats = std.TailQueue(Seat).init(); + + const seat_node = try server.allocator.create(std.TailQueue(Seat).Node); + try seat_node.data.init(self, default_seat); + self.seats.prepend(seat_node); + + // Set up handler for all new input devices made available. This + // includes keyboards, pointers, touch, etc. + self.listen_new_input.notify = handleNewInput; + c.wl_signal_add(&self.server.wlr_backend.events.new_input, &self.listen_new_input); + } + + /// This event is raised by the backend when a new input device becomes available. + fn handleNewInput(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void { + const input_manager = @fieldParentPtr(InputManager, "listen_new_input", listener.?); + const device = @ptrCast(*c.wlr_input_device, @alignCast(@alignOf(*c.wlr_input_device), data)); + + // TODO: suport multiple seats + if (input_manager.seats.first) |seat_node| { + seat_node.data.addDevice(device) catch unreachable; + } + } +}; |
