Skip to content

Instantly share code, notes, and snippets.

@Blei
Created December 13, 2013 18:43
Show Gist options
  • Save Blei/7949134 to your computer and use it in GitHub Desktop.
Save Blei/7949134 to your computer and use it in GitHub Desktop.
//////////////////////////////////
// in rgtk
//////////////////////////////////
impl Window {
/* ... */
pub fn connect_destroy_signal(&self, handler: ~WidgetDestroyHandler) {
let data = unsafe { cast::transmute::<~~WidgetDestroyHandler, ffi::gpointer>(~handler) };
"destroy".with_c_str(|cstr| {
unsafe {
ffi::g_signal_connect_data(self.pointer as ffi::gpointer,
cstr,
Some(cast::transmute(widget_destroy_callback)),
data,
Some(drop_widget_destroy_handler),
0);
}
});
}
}
pub trait WidgetDestroyHandler {
fn callback(&mut self, window: &Window);
}
extern "C" fn widget_destroy_callback(object: *ffi::C_GtkWidget, user_data: ffi::gpointer) {
let mut handler = unsafe { cast::transmute::<ffi::gpointer, ~~WidgetDestroyHandler>(user_data) };
let mut window = check_pointer!(object, Window).unwrap();
window.can_drop = false;
handler.callback(&window);
unsafe {
cast::forget(handler);
}
}
extern "C" fn drop_widget_destroy_handler(data: ffi::gpointer, _closure: *ffi::C_GClosure) {
unsafe {
let handler = cast::transmute::<ffi::gpointer, ~~WidgetDestroyHandler>(data);
drop(handler);
}
}
//////////////////////////
// Usage
//////////////////////////
#[pkgid="window"];
#[feature(globs)];
extern mod rgtk;
use rgtk::gtk::Window;
use rgtk::gtk::window::WidgetDestroyHandler;
use rgtk::traits::*;
struct Quitter;
impl WidgetDestroyHandler for Quitter {
fn callback(&mut self, _window: &Window) {
rgtk::rt::_main_quit();
}
}
struct Printer;
impl WidgetDestroyHandler for Printer {
fn callback(&mut self, _window: &Window) {
println("hellooooo");
}
}
fn main() {
rgtk::rt::init();
let mut w = Window::new(rgtk::GtkWindowTopLevel).unwrap();
w.connect_destroy_signal(~Quitter as ~WidgetDestroyHandler);
for _ in range(0, 1000) {
w.connect_destroy_signal(~Printer as ~WidgetDestroyHandler);
}
w.show_all();
rgtk::rt::_main();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment