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.
This commit is contained in:
Isaac Freund
2024-01-04 14:44:51 -06:00
parent 9ce4525f08
commit 913770975b
3 changed files with 10 additions and 27 deletions

View File

@ -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);
}

View File

@ -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();