Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
Implement handle_request_set_cursor_shape to support cursor-shape-v1 protocol
src/cursor.rs | 8 ++++++++
src/server.rs | 14 ++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/src/cursor.rs b/src/cursor.rs
index 6714ffa..32c8680 100644
--- a/src/cursor.rs
+++ b/src/cursor.rs
@@ -416,6 +416,14 @@ impl Cursor {
Ok(())
}
+ pub unsafe fn set_xcursor(&mut self, name: *const std::os::raw::c_char) {
+ ffi::wlr_cursor_set_xcursor(
+ self.wlr_cursor,
+ self.xcursor_manager,
+ name,
+ );
+ }
+
pub unsafe fn op_start_pointer(&mut self) {
if !self.constraint.is_null() {
if let crate::pointer_constraint::PointerConstraintState::Active { .. } = (*self.constraint).state {
diff --git a/src/server.rs b/src/server.rs
index e701698..e0e34b0 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -316,9 +316,19 @@ unsafe extern "C" fn handle_request_activate(listener: *mut ffi::wl_listener, _d
log::info!("xdg activation request");
}
-unsafe extern "C" fn handle_request_set_cursor_shape(listener: *mut ffi::wl_listener, _data: *mut std::ffi::c_void) {
+unsafe extern "C" fn handle_request_set_cursor_shape(listener: *mut ffi::wl_listener, data: *mut std::ffi::c_void) {
let _server = container_of!(listener, Server, request_set_cursor_shape);
- log::info!("request set cursor shape");
+ let event = data as *mut ffi::wlr_cursor_shape_manager_v1_request_set_shape_event;
+
+ let wlr_seat = (*(*event).seat_client).seat;
+ let focused_client = ffi::river_wlr_seat_get_pointer_focused_client(wlr_seat);
+ if focused_client == (*event).seat_client {
+ let seat = ffi::river_wlr_seat_get_data(wlr_seat) as *mut crate::seat::Seat;
+ if !seat.is_null() {
+ let shape_name = ffi::wlr_cursor_shape_v1_name((*event).shape);
+ (*seat).cursor.set_xcursor(shape_name);
+ }
+ }
}
unsafe extern "C" fn handle_toplevel_capture_request(listener: *mut ffi::wl_listener, _data: *mut std::ffi::c_void) {