@@ -47,7 +47,7 @@ use i_slint_core::{self as corelib};
4747use std:: cell:: OnceCell ;
4848#[ cfg( any( enable_accesskit, muda) ) ]
4949use winit:: event_loop:: EventLoopProxy ;
50- use winit:: window:: { WindowAttributes , WindowButtons } ;
50+ use winit:: window:: { CustomCursor , CustomCursorSource , WindowAttributes , WindowButtons } ;
5151
5252pub ( crate ) fn position_to_winit ( pos : & corelib:: api:: WindowPosition ) -> winit:: dpi:: Position {
5353 match pos {
@@ -368,6 +368,8 @@ pub struct WinitWindowAdapter {
368368 window_icon_cache_key : RefCell < Option < ImageCacheKey > > ,
369369
370370 frame_throttle : Box < dyn crate :: frame_throttle:: FrameThrottle > ,
371+
372+ pub ( crate ) custom_cursor_source : Cell < Option < CustomCursorSource > > ,
371373}
372374
373375impl WinitWindowAdapter {
@@ -416,6 +418,7 @@ impl WinitWindowAdapter {
416418 self_weak. clone ( ) ,
417419 shared_backend_data. is_wayland ,
418420 ) ,
421+ custom_cursor_source : Cell :: new ( None ) ,
419422 } ) ;
420423
421424 self_rc. shared_backend_data . register_inactive_window ( ( self_rc. clone ( ) ) as _ ) ;
@@ -1324,41 +1327,66 @@ impl WindowAdapter for WinitWindowAdapter {
13241327
13251328impl WindowAdapterInternal for WinitWindowAdapter {
13261329 fn set_mouse_cursor ( & self , cursor : MouseCursor ) {
1327- let winit_cursor = match cursor {
1328- MouseCursor :: Default => winit:: window:: CursorIcon :: Default ,
1329- MouseCursor :: None => winit:: window:: CursorIcon :: Default ,
1330- MouseCursor :: Help => winit:: window:: CursorIcon :: Help ,
1331- MouseCursor :: Pointer => winit:: window:: CursorIcon :: Pointer ,
1332- MouseCursor :: Progress => winit:: window:: CursorIcon :: Progress ,
1333- MouseCursor :: Wait => winit:: window:: CursorIcon :: Wait ,
1334- MouseCursor :: Crosshair => winit:: window:: CursorIcon :: Crosshair ,
1335- MouseCursor :: Text => winit:: window:: CursorIcon :: Text ,
1336- MouseCursor :: Alias => winit:: window:: CursorIcon :: Alias ,
1337- MouseCursor :: Copy => winit:: window:: CursorIcon :: Copy ,
1338- MouseCursor :: Move => winit:: window:: CursorIcon :: Move ,
1339- MouseCursor :: NoDrop => winit:: window:: CursorIcon :: NoDrop ,
1340- MouseCursor :: NotAllowed => winit:: window:: CursorIcon :: NotAllowed ,
1341- MouseCursor :: Grab => winit:: window:: CursorIcon :: Grab ,
1342- MouseCursor :: Grabbing => winit:: window:: CursorIcon :: Grabbing ,
1343- MouseCursor :: ColResize => winit:: window:: CursorIcon :: ColResize ,
1344- MouseCursor :: RowResize => winit:: window:: CursorIcon :: RowResize ,
1345- MouseCursor :: NResize => winit:: window:: CursorIcon :: NResize ,
1346- MouseCursor :: EResize => winit:: window:: CursorIcon :: EResize ,
1347- MouseCursor :: SResize => winit:: window:: CursorIcon :: SResize ,
1348- MouseCursor :: WResize => winit:: window:: CursorIcon :: WResize ,
1349- MouseCursor :: NeResize => winit:: window:: CursorIcon :: NeResize ,
1350- MouseCursor :: NwResize => winit:: window:: CursorIcon :: NwResize ,
1351- MouseCursor :: SeResize => winit:: window:: CursorIcon :: SeResize ,
1352- MouseCursor :: SwResize => winit:: window:: CursorIcon :: SwResize ,
1353- MouseCursor :: EwResize => winit:: window:: CursorIcon :: EwResize ,
1354- MouseCursor :: NsResize => winit:: window:: CursorIcon :: NsResize ,
1355- MouseCursor :: NeswResize => winit:: window:: CursorIcon :: NeswResize ,
1356- MouseCursor :: NwseResize => winit:: window:: CursorIcon :: NwseResize ,
1357- _ => winit:: window:: CursorIcon :: Default ,
1330+ let winit_cursor = match & cursor {
1331+ MouseCursor :: Default => Some ( winit:: window:: CursorIcon :: Default ) ,
1332+ MouseCursor :: None => Some ( winit:: window:: CursorIcon :: Default ) ,
1333+ MouseCursor :: Help => Some ( winit:: window:: CursorIcon :: Help ) ,
1334+ MouseCursor :: Pointer => Some ( winit:: window:: CursorIcon :: Pointer ) ,
1335+ MouseCursor :: Progress => Some ( winit:: window:: CursorIcon :: Progress ) ,
1336+ MouseCursor :: Wait => Some ( winit:: window:: CursorIcon :: Wait ) ,
1337+ MouseCursor :: Crosshair => Some ( winit:: window:: CursorIcon :: Crosshair ) ,
1338+ MouseCursor :: Text => Some ( winit:: window:: CursorIcon :: Text ) ,
1339+ MouseCursor :: Alias => Some ( winit:: window:: CursorIcon :: Alias ) ,
1340+ MouseCursor :: Copy => Some ( winit:: window:: CursorIcon :: Copy ) ,
1341+ MouseCursor :: Move => Some ( winit:: window:: CursorIcon :: Move ) ,
1342+ MouseCursor :: NoDrop => Some ( winit:: window:: CursorIcon :: NoDrop ) ,
1343+ MouseCursor :: NotAllowed => Some ( winit:: window:: CursorIcon :: NotAllowed ) ,
1344+ MouseCursor :: Grab => Some ( winit:: window:: CursorIcon :: Grab ) ,
1345+ MouseCursor :: Grabbing => Some ( winit:: window:: CursorIcon :: Grabbing ) ,
1346+ MouseCursor :: ColResize => Some ( winit:: window:: CursorIcon :: ColResize ) ,
1347+ MouseCursor :: RowResize => Some ( winit:: window:: CursorIcon :: RowResize ) ,
1348+ MouseCursor :: NResize => Some ( winit:: window:: CursorIcon :: NResize ) ,
1349+ MouseCursor :: EResize => Some ( winit:: window:: CursorIcon :: EResize ) ,
1350+ MouseCursor :: SResize => Some ( winit:: window:: CursorIcon :: SResize ) ,
1351+ MouseCursor :: WResize => Some ( winit:: window:: CursorIcon :: WResize ) ,
1352+ MouseCursor :: NeResize => Some ( winit:: window:: CursorIcon :: NeResize ) ,
1353+ MouseCursor :: NwResize => Some ( winit:: window:: CursorIcon :: NwResize ) ,
1354+ MouseCursor :: SeResize => Some ( winit:: window:: CursorIcon :: SeResize ) ,
1355+ MouseCursor :: SwResize => Some ( winit:: window:: CursorIcon :: SwResize ) ,
1356+ MouseCursor :: EwResize => Some ( winit:: window:: CursorIcon :: EwResize ) ,
1357+ MouseCursor :: NsResize => Some ( winit:: window:: CursorIcon :: NsResize ) ,
1358+ MouseCursor :: NeswResize => Some ( winit:: window:: CursorIcon :: NeswResize ) ,
1359+ MouseCursor :: NwseResize => Some ( winit:: window:: CursorIcon :: NwseResize ) ,
1360+ MouseCursor :: CustomCursor { image, hotspot_x, hotspot_y } => {
1361+ if let Some ( rgba8) = image. to_rgba8 ( ) {
1362+ let rgba_vec = rgba8. as_slice ( ) . to_vec ( ) ;
1363+ let rgba = rgba_vec
1364+ . iter ( )
1365+ . map ( |c| vec ! [ c. r, c. g, c. b, c. a] )
1366+ . flatten ( )
1367+ . collect :: < Vec < u8 > > ( ) ;
1368+ let size = image. size ( ) ;
1369+ let source = CustomCursor :: from_rgba (
1370+ rgba,
1371+ size. width as u16 ,
1372+ size. height as u16 ,
1373+ * hotspot_x as u16 ,
1374+ * hotspot_y as u16 ,
1375+ ) ;
1376+
1377+ // Custom cursors have to be set during the event loop
1378+ self . custom_cursor_source . set ( source. ok ( ) ) ;
1379+ }
1380+ None
1381+ }
1382+ _ => None ,
13581383 } ;
13591384 if let Some ( winit_window) = self . winit_window_or_none . borrow ( ) . as_window ( ) {
13601385 winit_window. set_cursor_visible ( cursor != MouseCursor :: None ) ;
1361- winit_window. set_cursor ( winit_cursor) ;
1386+
1387+ if let Some ( cursor) = winit_cursor {
1388+ winit_window. set_cursor ( cursor) ;
1389+ }
13621390 }
13631391 }
13641392
0 commit comments