1use crate::{Cursor, Texture, ffi};
4use glib::translate::*;
5use std::boxed::Box as Box_;
6
7impl Cursor {
8 #[cfg(feature = "v4_16")]
9 #[cfg_attr(docsrs, doc(cfg(feature = "v4_16")))]
10 #[doc(alias = "gdk_cursor_new_from_callback")]
11 #[doc(alias = "new_from_callback")]
12 pub fn from_callback<
13 P: Fn(&Cursor, i32, f64, &mut i32, &mut i32, &mut i32, &mut i32) -> Texture + 'static,
14 >(
15 callback: P,
16 fallback: Option<&Cursor>,
17 ) -> Option<Cursor> {
18 assert_initialized_main_thread!();
19 let callback_data: Box_<P> = Box_::new(callback);
20 unsafe extern "C" fn callback_func<
21 P: Fn(&Cursor, i32, f64, &mut i32, &mut i32, &mut i32, &mut i32) -> Texture + 'static,
22 >(
23 cursor: *mut ffi::GdkCursor,
24 cursor_size: libc::c_int,
25 scale: libc::c_double,
26 width: *mut libc::c_int,
27 height: *mut libc::c_int,
28 hotspot_x: *mut libc::c_int,
29 hotspot_y: *mut libc::c_int,
30 data: glib::ffi::gpointer,
31 ) -> *mut ffi::GdkTexture {
32 unsafe {
33 let cursor = from_glib_borrow(cursor);
34 let callback = &*(data as *mut P);
35 (*callback)(
36 &cursor,
37 cursor_size,
38 scale,
39 &mut *width,
40 &mut *height,
41 &mut *hotspot_x,
42 &mut *hotspot_y,
43 )
44 .to_glib_none()
46 .0
47 }
48 }
49 let callback = Some(callback_func::<P> as _);
50 unsafe extern "C" fn destroy_func<
51 P: Fn(&Cursor, i32, f64, &mut i32, &mut i32, &mut i32, &mut i32) -> Texture + 'static,
52 >(
53 data: glib::ffi::gpointer,
54 ) {
55 unsafe {
56 let _callback = Box_::from_raw(data as *mut P);
57 }
58 }
59 let destroy_call2 = Some(destroy_func::<P> as _);
60 let super_callback0: Box_<P> = callback_data;
61 unsafe {
62 from_glib_full(ffi::gdk_cursor_new_from_callback(
63 callback,
64 Box_::into_raw(super_callback0) as *mut _,
65 destroy_call2,
66 fallback.to_glib_none().0,
67 ))
68 }
69 }
70}