diff --git a/CHANGELOG.md b/CHANGELOG.md index 561e24cb17..66b609513e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Unreleased` header. # Unreleased +- On X11, check common alternative cursor names when loading cursor. - On Windows, fix so `drag_window` and `drag_resize_window` can be called from another thread. # 0.29.3 diff --git a/Cargo.toml b/Cargo.toml index 078967adc1..64c1f6e3b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,7 +54,7 @@ cfg_aliases = "0.1.1" [dependencies] bitflags = "2" -cursor-icon = "1.0.0" +cursor-icon = "1.1.0" log = "0.4" mint = { version = "0.5.6", optional = true } once_cell = "1.12" diff --git a/src/platform_impl/linux/x11/util/cursor.rs b/src/platform_impl/linux/x11/util/cursor.rs index 5845511d07..8d62cfa7f0 100644 --- a/src/platform_impl/linux/x11/util/cursor.rs +++ b/src/platform_impl/linux/x11/util/cursor.rs @@ -1,4 +1,5 @@ use std::ffi::CString; +use std::iter; use x11rb::connection::Connection; @@ -56,10 +57,22 @@ impl XConnection { None => return self.create_empty_cursor(), }; - let name = CString::new(cursor.name()).unwrap(); - unsafe { - (self.xcursor.XcursorLibraryLoadCursor)(self.display, name.as_ptr() as *const c_char) + let mut xcursor = 0; + for &name in iter::once(&cursor.name()).chain(cursor.alt_names().iter()) { + let name = CString::new(name).unwrap(); + xcursor = unsafe { + (self.xcursor.XcursorLibraryLoadCursor)( + self.display, + name.as_ptr() as *const c_char, + ) + }; + + if xcursor != 0 { + break; + } } + + xcursor } fn update_cursor(&self, window: xproto::Window, cursor: ffi::Cursor) -> Result<(), X11Error> {