aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2020-08-21 19:08:52 +0200
committerIsaac Freund <ifreund@ifreund.xyz>2020-08-21 21:06:58 +0200
commit71a751f1ad405dbfcaa2abcac6edd0d2fdc94512 (patch)
tree33d430e636079c25634ec18b7b685fc9349d6407
parent37ea1bac367525712d26982201cff2e36ff310ab (diff)
downloadriver-71a751f1ad405dbfcaa2abcac6edd0d2fdc94512.tar.gz
river-71a751f1ad405dbfcaa2abcac6edd0d2fdc94512.tar.xz
seat: clean up initialization
-rw-r--r--river/Cursor.zig37
-rw-r--r--river/InputManager.zig40
-rw-r--r--river/Seat.zig41
3 files changed, 49 insertions, 69 deletions
diff --git a/river/Cursor.zig b/river/Cursor.zig
index 4e24b7e..1ca75d7 100644
--- a/river/Cursor.zig
+++ b/river/Cursor.zig
@@ -212,34 +212,35 @@ wlr_cursor: *c.wlr_cursor,
wlr_xcursor_manager: *c.wlr_xcursor_manager,
/// Number of distinct buttons currently pressed
-pressed_count: u32,
+pressed_count: u32 = 0,
/// Current cursor mode as well as any state needed to implement that mode
-mode: Mode,
+mode: Mode = .passthrough,
-listen_axis: c.wl_listener,
-listen_button: c.wl_listener,
-listen_frame: c.wl_listener,
-listen_motion_absolute: c.wl_listener,
-listen_motion: c.wl_listener,
-listen_request_set_cursor: c.wl_listener,
+listen_axis: c.wl_listener = undefined,
+listen_button: c.wl_listener = undefined,
+listen_frame: c.wl_listener = undefined,
+listen_motion_absolute: c.wl_listener = undefined,
+listen_motion: c.wl_listener = undefined,
+listen_request_set_cursor: c.wl_listener = undefined,
pub fn init(self: *Self, seat: *Seat) !void {
- self.seat = seat;
-
- // Creates a wlroots utility for tracking the cursor image shown on screen.
- self.wlr_cursor = c.wlr_cursor_create() orelse return error.OutOfMemory;
- c.wlr_cursor_attach_output_layout(self.wlr_cursor, seat.input_manager.server.root.wlr_output_layout);
+ const wlr_cursor = c.wlr_cursor_create() orelse return error.OutOfMemory;
+ errdefer c.wlr_cursor_destroy(wlr_cursor);
+ c.wlr_cursor_attach_output_layout(wlr_cursor, seat.input_manager.server.root.wlr_output_layout);
// This is here so that self.wlr_xcursor_manager doesn't need to be an
// optional pointer. This isn't optimal as it does a needless allocation,
// but this is not a hot path.
- self.wlr_xcursor_manager = c.wlr_xcursor_manager_create(null, default_size) orelse
- return error.OutOfMemory;
- try self.setTheme(null, null);
+ const wlr_xcursor_manager = c.wlr_xcursor_manager_create(null, default_size) orelse return error.OutOfMemory;
+ errdefer c.wlr_xcursor_manager_destroy(wlr_xcursor_manager);
- self.pressed_count = 0;
- self.mode = .passthrough;
+ self.* = .{
+ .seat = seat,
+ .wlr_cursor = wlr_cursor,
+ .wlr_xcursor_manager = wlr_xcursor_manager,
+ };
+ try self.setTheme(null, null);
// wlr_cursor *only* displays an image on screen. It does not move around
// when the pointer moves. However, we can attach input devices to it, and
diff --git a/river/InputManager.zig b/river/InputManager.zig
index a4e39ed..b6f5866 100644
--- a/river/InputManager.zig
+++ b/river/InputManager.zig
@@ -35,46 +35,38 @@ server: *Server,
wlr_idle: *c.wlr_idle,
wlr_input_inhibit_manager: *c.wlr_input_inhibit_manager,
-seats: std.TailQueue(Seat),
+seats: std.TailQueue(Seat) = std.TailQueue(Seat).init(),
default_seat: *Seat,
-exclusive_client: ?*c.wl_client,
+exclusive_client: ?*c.wl_client = null,
-listen_inhibit_activate: c.wl_listener,
-listen_inhibit_deactivate: c.wl_listener,
-listen_new_input: c.wl_listener,
+listen_inhibit_activate: c.wl_listener = undefined,
+listen_inhibit_deactivate: c.wl_listener = undefined,
+listen_new_input: c.wl_listener = undefined,
pub fn init(self: *Self, server: *Server) !void {
- self.server = server;
-
- // These are automatically freed when the display is destroyed
- self.wlr_idle = c.wlr_idle_create(server.wl_display) orelse return error.OutOfMemory;
- self.wlr_input_inhibit_manager = c.wlr_input_inhibit_manager_create(server.wl_display) orelse
- return error.OutOfMemory;
+ const seat_node = try util.gpa.create(std.TailQueue(Seat).Node);
- self.seats = std.TailQueue(Seat).init();
+ self.* = .{
+ .server = server,
+ // These are automatically freed when the display is destroyed
+ .wlr_idle = c.wlr_idle_create(server.wl_display) orelse return error.OutOfMemory,
+ .wlr_input_inhibit_manager = c.wlr_input_inhibit_manager_create(server.wl_display) orelse
+ return error.OutOfMemory,
+ .default_seat = &seat_node.data,
+ };
- const seat_node = try util.gpa.create(std.TailQueue(Seat).Node);
try seat_node.data.init(self, default_seat_name);
- self.default_seat = &seat_node.data;
self.seats.prepend(seat_node);
if (build_options.xwayland) c.wlr_xwayland_set_seat(server.wlr_xwayland, self.default_seat.wlr_seat);
- self.exclusive_client = null;
-
// Set up all listeners
self.listen_inhibit_activate.notify = handleInhibitActivate;
- c.wl_signal_add(
- &self.wlr_input_inhibit_manager.events.activate,
- &self.listen_inhibit_activate,
- );
+ c.wl_signal_add(&self.wlr_input_inhibit_manager.events.activate, &self.listen_inhibit_activate);
self.listen_inhibit_deactivate.notify = handleInhibitDeactivate;
- c.wl_signal_add(
- &self.wlr_input_inhibit_manager.events.deactivate,
- &self.listen_inhibit_deactivate,
- );
+ c.wl_signal_add(&self.wlr_input_inhibit_manager.events.deactivate, &self.listen_inhibit_deactivate);
self.listen_new_input.notify = handleNewInput;
c.wl_signal_add(&self.server.wlr_backend.events.new_input, &self.listen_new_input);
diff --git a/river/Seat.zig b/river/Seat.zig
index 8f03550..7ab0fb6 100644
--- a/river/Seat.zig
+++ b/river/Seat.zig
@@ -44,55 +44,42 @@ input_manager: *InputManager,
wlr_seat: *c.wlr_seat,
/// Multiple mice are handled by the same Cursor
-cursor: Cursor,
+cursor: Cursor = undefined,
/// Mulitple keyboards are handled separately
-keyboards: std.TailQueue(Keyboard),
+keyboards: std.TailQueue(Keyboard) = std.TailQueue(Keyboard).init(),
/// ID of the current keymap mode
-mode_id: usize,
+mode_id: usize = 0,
/// Currently focused output, may be the noop output if no
focused_output: *Output,
/// Currently focused view/layer surface if any
-focused: FocusTarget,
+focused: FocusTarget = .none,
/// Stack of views in most recently focused order
/// If there is a currently focused view, it is on top.
-focus_stack: ViewStack(*View),
+focus_stack: ViewStack(*View) = ViewStack(*View){},
/// List of status tracking objects relaying changes to this seat to clients.
-status_trackers: std.SinglyLinkedList(SeatStatus),
+status_trackers: std.SinglyLinkedList(SeatStatus) = std.SinglyLinkedList(SeatStatus).init(),
/// State of pointer modifier; Used for pointer operations such as move ans resize.
-pointer_modifier: bool,
+pointer_modifier: bool = false,
-listen_request_set_selection: c.wl_listener,
+listen_request_set_selection: c.wl_listener = undefined,
pub fn init(self: *Self, input_manager: *InputManager, name: [*:0]const u8) !void {
- self.input_manager = input_manager;
-
- // This will be automatically destroyed when the display is destroyed
- self.wlr_seat = c.wlr_seat_create(input_manager.server.wl_display, name) orelse return error.OutOfMemory;
+ self.* = .{
+ .input_manager = input_manager,
+ // This will be automatically destroyed when the display is destroyed
+ .wlr_seat = c.wlr_seat_create(input_manager.server.wl_display, name) orelse return error.OutOfMemory,
+ .focused_output = &self.input_manager.server.root.noop_output,
+ };
self.wlr_seat.data = self;
try self.cursor.init(self);
- errdefer self.cursor.deinit();
-
- self.keyboards = std.TailQueue(Keyboard).init();
-
- self.mode_id = 0;
-
- self.focused_output = &self.input_manager.server.root.noop_output;
-
- self.focused = .none;
-
- self.focus_stack = ViewStack(*View){};
-
- self.status_trackers = std.SinglyLinkedList(SeatStatus).init();
-
- self.pointer_modifier = false;
self.listen_request_set_selection.notify = handleRequestSetSelection;
c.wl_signal_add(&self.wlr_seat.events.request_set_selection, &self.listen_request_set_selection);