forked from gtk-rs/gtk
/
assistant.rs
30 lines (25 loc) · 950 Bytes
/
assistant.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use std::mem::transmute;
use std::boxed::Box as Box_;
use Assistant;
use ffi;
use glib::object::IsA;
use glib_ffi;
pub trait AssistantExtManual {
fn set_forward_page_func<F: Fn(i32) -> i32 + 'static>(&self, f: F);
}
impl<O: IsA<Assistant>> AssistantExtManual for O {
fn set_forward_page_func<F: Fn(i32) -> i32 + 'static>(&self, f: F) {
unsafe {
let f: Box_<Box_<Fn(i32) -> i32 + 'static>> = Box_::new(Box_::new(f));
ffi::gtk_assistant_set_forward_page_func(self.to_glib_none().0,
Some(forward_page_trampoline), Box_::into_raw(f) as *mut _, Some(destroy_closure))
}
}
}
unsafe extern "C" fn forward_page_trampoline(current_page: i32, f: glib_ffi::gpointer) -> i32 {
let f: &&(Fn(i32) -> i32 + 'static) = transmute(f);
f(current_page)
}
unsafe extern "C" fn destroy_closure(ptr: glib_ffi::gpointer) {
Box_::<Box_<Fn(i32) -> i32 + 'static>>::from_raw(ptr as *mut _);
}