Created
December 13, 2013 18:43
-
-
Save Blei/7949134 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
////////////////////////////////// | |
// 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