aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <mail@isaacfreund.com>2024-01-04 14:44:51 -0600
committerIsaac Freund <mail@isaacfreund.com>2024-01-04 14:44:51 -0600
commit913770975b6542788b09bf635dbeca19840c3fa3 (patch)
tree3e1eb38369b84c32c89f9fd92339061fed45ee48
parent9ce4525f082d3474667853b28deff5a44c56f552 (diff)
downloadriver-913770975b6542788b09bf635dbeca19840c3fa3.tar.gz
river-913770975b6542788b09bf635dbeca19840c3fa3.tar.xz
Cursor: clean up cursor theme loading
wlroots will now load xcursor themes at the correct scale automatically based on the scale of the outputs where ther cursors are displayed. Also make the error handling a bit more robust.
m---------deps/zig-wlroots0
-rw-r--r--river/Cursor.zig26
-rw-r--r--river/Output.zig9
3 files changed, 9 insertions, 26 deletions
diff --git a/deps/zig-wlroots b/deps/zig-wlroots
-Subproject 0ddfe81c5957fd36f8f8faf3d0870df97486066
+Subproject 68ce60769c6a8019c43de35197f4596eaac4df4
diff --git a/river/Cursor.zig b/river/Cursor.zig
index 99a0e3b..e74b300 100644
--- a/river/Cursor.zig
+++ b/river/Cursor.zig
@@ -237,20 +237,11 @@ pub fn deinit(self: *Self) void {
pub fn setTheme(self: *Self, theme: ?[*:0]const u8, _size: ?u32) !void {
const size = _size orelse default_size;
- self.xcursor_manager.destroy();
- self.xcursor_manager = try wlr.XcursorManager.create(theme, size);
-
- // For each output, ensure a theme of the proper scale is loaded
- var it = server.root.active_outputs.iterator(.forward);
- while (it.next()) |output| {
- const wlr_output = output.wlr_output;
- self.xcursor_manager.load(wlr_output.scale) catch
- log.err("failed to load xcursor theme '{?s}' at scale {}", .{ theme, wlr_output.scale });
- }
+ const xcursor_manager = try wlr.XcursorManager.create(theme, size);
+ errdefer xcursor_manager.destroy();
// If this cursor belongs to the default seat, set the xcursor environment
- // variables as well as the xwayland cursor theme and update the cursor
- // image if necessary.
+ // variables as well as the xwayland cursor theme.
if (self.seat == server.input_manager.defaultSeat()) {
const size_str = try std.fmt.allocPrintZ(util.gpa, "{}", .{size});
defer util.gpa.free(size_str);
@@ -258,11 +249,8 @@ pub fn setTheme(self: *Self, theme: ?[*:0]const u8, _size: ?u32) !void {
if (theme) |t| if (c.setenv("XCURSOR_THEME", t, 1) < 0) return error.OutOfMemory;
if (build_options.xwayland) {
- self.xcursor_manager.load(1) catch {
- log.err("failed to load xcursor theme '{?s}' at scale 1", .{theme});
- return;
- };
- const wlr_xcursor = self.xcursor_manager.getXcursor("left_ptr", 1).?;
+ try xcursor_manager.load(1);
+ const wlr_xcursor = xcursor_manager.getXcursor("left_ptr", 1).?;
const image = wlr_xcursor.images[0];
server.xwayland.setCursor(
image.buffer,
@@ -275,6 +263,10 @@ pub fn setTheme(self: *Self, theme: ?[*:0]const u8, _size: ?u32) !void {
}
}
+ // Everything fallible is now done so the the old xcursor_manager can be destroyed.
+ self.xcursor_manager.destroy();
+ self.xcursor_manager = xcursor_manager;
+
if (self.xcursor_name) |name| {
self.setXcursor(name);
}
diff --git a/river/Output.zig b/river/Output.zig
index 04d92ff..1c092ee 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -306,15 +306,6 @@ pub fn create(wlr_output: *wlr.Output) !void {
wlr_output.events.frame.add(&output.frame);
wlr_output.events.present.add(&output.present);
- // Ensure that a cursor image at the output's scale factor is loaded
- // for each seat.
- var it = server.input_manager.seats.first;
- while (it) |seat_node| : (it = seat_node.next) {
- const seat = &seat_node.data;
- seat.cursor.xcursor_manager.load(wlr_output.scale) catch
- log.err("failed to load xcursor theme at scale {}", .{wlr_output.scale});
- }
-
output.setTitle();
output.active_link.init();