git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit9e83ff6140b2472c660aff88df1dc671cc97aa75
parent42edc2c1dc
authorLucas Galante <[email protected]>
date2026-05-28 21:14
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) {