Skip to main content

gdk4/
cursor.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use 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                /*Not checked*/
45                .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}