From 383260133381e2a9ad515601c2894beac8834945 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Thu, 14 May 2020 19:01:17 +0200 Subject: [PATCH] Fix cursor disappearing over xwayland views --- src/Cursor.zig | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Cursor.zig b/src/Cursor.zig index df5e4a4..9eede57 100644 --- a/src/Cursor.zig +++ b/src/Cursor.zig @@ -17,6 +17,7 @@ const Self = @This(); +const build_options = @import("build_options"); const std = @import("std"); const c = @import("c.zig"); @@ -57,8 +58,6 @@ pub fn init(self: *Self, seat: *Seat) !void { self.seat = seat; // Creates a wlroots utility for tracking the cursor image shown on screen. - // - // TODO: free this, it allocates! self.wlr_cursor = c.wlr_cursor_create() orelse return error.CantCreateWlrCursor; @@ -66,13 +65,31 @@ pub fn init(self: *Self, seat: *Seat) !void { // Xcursor themes to source cursor images from and makes sure that cursor // images are available at all scale factors on the screen (necessary for // HiDPI support). We add a cursor theme at scale factor 1 to begin with. - // - // TODO: free this, it allocates! self.wlr_xcursor_manager = c.wlr_xcursor_manager_create(null, 24) orelse return error.CantCreateWlrXCursorManager; - c.wlr_cursor_attach_output_layout(self.wlr_cursor, seat.input_manager.server.root.wlr_output_layout); - _ = c.wlr_xcursor_manager_load(self.wlr_xcursor_manager, 1); + if (c.wlr_xcursor_manager_load(self.wlr_xcursor_manager, 1) == 0) { + if (build_options.xwayland) { + if (c.wlr_xcursor_manager_get_xcursor( + self.wlr_xcursor_manager, + "left_ptr", + 1, + )) |wlr_xcursor| { + const image: *c.wlr_xcursor_image = wlr_xcursor.*.images[0]; + c.wlr_xwayland_set_cursor( + seat.input_manager.server.wlr_xwayland, + image.buffer, + image.width * 4, + image.width, + image.height, + @intCast(i32, image.hotspot_x), + @intCast(i32, image.hotspot_y), + ); + } + } + } else { + Log.Error.log("Failed to load an xcursor theme", .{}); + } self.mode = CursorMode.Passthrough; self.grabbed_view = null; @@ -235,6 +252,7 @@ fn handleRequestSetCursor(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C // provided surface as the cursor image. It will set the hardware cursor // on the output that it's currently on and continue to do so as the // cursor moves between outputs. + Log.Debug.log("Focused client set cursor", .{}); c.wlr_cursor_set_surface( self.wlr_cursor, event.surface,