aboutsummaryrefslogtreecommitdiff
path: root/src/Cursor.zig
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2020-05-14 19:01:17 +0200
committerIsaac Freund <ifreund@ifreund.xyz>2020-05-14 19:01:17 +0200
commit383260133381e2a9ad515601c2894beac8834945 (patch)
tree9c0091026c78776eff2b30224fd29722bb29c3c8 /src/Cursor.zig
parent0eb6c7c11339b8742048219d7bc1538d1e29bc45 (diff)
downloadriver-383260133381e2a9ad515601c2894beac8834945.tar.gz
river-383260133381e2a9ad515601c2894beac8834945.tar.xz
Fix cursor disappearing over xwayland views
Diffstat (limited to 'src/Cursor.zig')
-rw-r--r--src/Cursor.zig30
1 files 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,