From 08e25c55fbbafcd97cd4b8dc6a50129c95c88335 Mon Sep 17 00:00:00 2001 From: "aydin.kim" Date: Wed, 21 Aug 2013 15:10:16 +0900 Subject: [PATCH] update for language changes --- glut.rs | 183 ++++++++++++++++++++++---------------------------------- 1 file changed, 72 insertions(+), 111 deletions(-) diff --git a/glut.rs b/glut.rs index ea2bb68..54c5e86 100644 --- a/glut.rs +++ b/glut.rs @@ -10,12 +10,10 @@ /* automatically generated by rust-bindgen */ use std::libc::*; -use std::local_data::{local_data_get, local_data_set}; +use std::local_data; use std::ptr::{null, to_unsafe_ptr}; -use std::str::NullTerminatedStr; use std::cast; use std::cast::transmute; -use std::vec::raw::to_ptr; /* FIXME: global variable glutStrokeRoman */ @@ -66,34 +64,45 @@ pub static HAVE_PRECISE_MOUSE_WHEEL: bool = false; #[cfg(target_os="macos")] pub static HAVE_PRECISE_MOUSE_WHEEL: bool = true; +// FIXME: remove after rust upgrade. Current version of Rust(0a677b) does not have this. +macro_rules! local_data_key( + ($name:ident, $func:ty) => ( + static $name: local_data::Key<$func> = &local_data::Key; + ); +) + +local_data_key!(display_tls_key, @@fn()) +local_data_key!(keyboard_tls_key, @@fn(key: c_uchar, x: c_int, y: c_int)) +local_data_key!(mouse_tls_key, @@fn(button: c_int, state: c_int, x: c_int, y: c_int)) +local_data_key!(motion_tls_key, @@fn(x: c_int, y: c_int)) +local_data_key!(passive_motion_tls_key, @@fn(x: c_int, y: c_int)) +local_data_key!(timer_tls_key, @~[@fn()]) +local_data_key!(reshape_tls_key, @@fn(x: c_int, y: c_int)) +local_data_key!(idle_tls_key, @@fn()) +local_data_key!(mouse_wheel_tls_key, @@fn(wheel: c_int, direction: c_int, x: c_int, y: c_int)) + pub enum State { WindowWidth, WindowHeight } -// XXX This function looks nonsensical after some forward porting -pub fn destroy(_value: &[T]) { - // let it drop -} - pub fn init() { unsafe { let argc = 0 as c_int; let glut = ~"glut"; - let command = glut.as_bytes_with_null(); - let argv: (*u8, *u8) = (to_ptr(command), null()); - let argv_p = transmute(to_unsafe_ptr(&argv)); - - glutInit(to_unsafe_ptr(&argc), argv_p); - - destroy(command); + do glut.to_c_str().with_ref |command| { + let argv: (*u8, *u8) = (command as *u8, null()); + let argv_p = transmute(to_unsafe_ptr(&argv)); + glutInit(to_unsafe_ptr(&argc), argv_p); + } } } pub fn create_window(name: ~str) -> Window { unsafe { - let bytes = name.as_bytes_with_null(); - return Window(glutCreateWindow(to_ptr(bytes) as *c_char)); + do name.to_c_str().with_ref |bytes| { + Window(glutCreateWindow(bytes as *c_char)) + } } } @@ -112,8 +121,9 @@ pub fn set_window(window: Window) { pub fn set_window_title(_window: Window, title: &str) { unsafe { let title = title.to_owned(); - let bytes = title.as_bytes_with_null(); - glutSetWindowTitle(to_ptr(bytes) as *c_char); + do title.to_c_str().with_ref |bytes| { + glutSetWindowTitle(bytes as *c_char); + } } } @@ -126,158 +136,119 @@ pub fn reshape_window(window: Window, width: c_int, height: c_int) { } } -pub fn display_callback_tls_key(_callback: @@fn()) { - // Empty. -} - -pub extern fn display_callback() { - unsafe { - let callback = local_data_get(display_callback_tls_key).get(); - (*callback)(); +pub extern "C" fn display_callback() { + do local_data::get(display_tls_key) |callback| { + (**callback.unwrap())(); } } pub fn display_func(callback: @fn()) { + local_data::set(display_tls_key, @callback); unsafe { - local_data_set(display_callback_tls_key, @callback); glutDisplayFunc(display_callback); } } -pub fn keyboard_callback_tls_key(_: @@fn(key: c_uchar, x: c_int, y: c_int)) { - // Empty. -} - -pub extern fn keyboard_callback(key: c_uchar, x: c_int, y: c_int) { - unsafe { - let callback = local_data_get(keyboard_callback_tls_key).get(); - (*callback)(key, x, y) +pub extern "C" fn keyboard_callback(key: c_uchar, x: c_int, y: c_int) { + do local_data::get(keyboard_tls_key) |callback| { + (**callback.unwrap())(key, x, y); } } pub fn keyboard_func(callback: @fn(key: c_uchar, x: c_int, y: c_int)) { + local_data::set(keyboard_tls_key, @callback); unsafe { - local_data_set(keyboard_callback_tls_key, @callback); glutKeyboardFunc(keyboard_callback); } } -pub fn mouse_callback_tls_key(_callback: @@fn(button: c_int, state: c_int, x: c_int, y: c_int)) { - // Empty. -} - -pub extern fn mouse_callback(button: c_int, state: c_int, x: c_int, y: c_int) { - unsafe { - let callback = local_data_get(mouse_callback_tls_key).get(); - (*callback)(button, state, x, y); +pub extern "C" fn mouse_callback(button: c_int, state: c_int, x: c_int, y: c_int) { + do local_data::get(mouse_tls_key) |callback| { + (**callback.unwrap())(button, state, x, y); } } pub fn mouse_func(callback: @fn(button: c_int, state: c_int, x: c_int, y: c_int)) { + local_data::set(mouse_tls_key, @callback); unsafe { - local_data_set(mouse_callback_tls_key, @callback); glutMouseFunc(mouse_callback); } } -pub fn motion_callback_tls_key(_callback: @@fn(x: c_int, y: c_int)) { - // Empty. -} - -pub extern fn motion_callback(x: c_int, y: c_int) { - unsafe { - let callback = local_data_get(motion_callback_tls_key).get(); - (*callback)(x, y); +pub extern "C" fn motion_callback(x: c_int, y: c_int) { + do local_data::get(motion_tls_key) |callback| { + (**callback.unwrap())(x, y); } } pub fn motion_func(callback: @fn(x: c_int, y: c_int)) { + local_data::set(motion_tls_key, @callback); unsafe { - local_data_set(motion_callback_tls_key, @callback); glutMotionFunc(motion_callback); } } -pub fn passive_motion_callback_tls_key(_callback: @@fn(x: c_int, y: c_int)) { - // Empty. -} - -pub extern fn passive_motion_callback(x: c_int, y: c_int) { - unsafe { - let callback = local_data_get(passive_motion_callback_tls_key).get(); - (*callback)(x, y); +pub extern "C" fn passive_motion_callback(x: c_int, y: c_int) { + do local_data::get(passive_motion_tls_key) |callback| { + (**callback.unwrap())(x, y); } } pub fn passive_motion_func(callback: @fn(x: c_int, y: c_int)) { + local_data::set(passive_motion_tls_key, @callback); unsafe { - local_data_set(passive_motion_callback_tls_key, @callback); glutPassiveMotionFunc(passive_motion_callback); } } -pub fn timer_callback_tls_key(_callback: @~[@fn()]) { - // Empty. -} - -pub extern fn timer_callback(index: int) { - unsafe { - let callbacks = local_data_get(timer_callback_tls_key).get(); - ((*callbacks)[index as uint])(); +pub extern "C" fn timer_callback(index: int) { + do local_data::get(timer_tls_key) |callback| { + ((**callback.unwrap())[index as uint])(); } } pub fn timer_func(msecs: u32, callback: @fn()) { - unsafe { + do local_data::get(timer_tls_key) |data| { let callbacks; - match local_data_get(timer_callback_tls_key) { + match data { None => { callbacks = @mut ~[]; - local_data_set(timer_callback_tls_key, cast::transmute(callbacks)); + local_data::set(timer_tls_key, unsafe { cast::transmute(callbacks) }); } Some(existing_callbacks) => { - callbacks = cast::transmute(existing_callbacks); + callbacks = unsafe { cast::transmute(existing_callbacks) }; } } - callbacks.push(callback); let index = (callbacks.len() - 1) as c_int; - glutTimerFunc(msecs, timer_callback, index); + unsafe { + glutTimerFunc(msecs, timer_callback, index); + } } } -pub fn reshape_callback_tls_key(_callback: @@fn(x: c_int, y: c_int)) { - // Empty. -} - -pub extern fn reshape_callback(width: c_int, height: c_int) { - unsafe { - let callback = local_data_get(reshape_callback_tls_key).get(); - (*callback)(width, height); +pub extern "C" fn reshape_callback(width: c_int, height: c_int) { + do local_data::get(reshape_tls_key) |callback| { + (**callback.unwrap())(width, height); } } pub fn reshape_func(_window: Window, callback: @fn(x: c_int, y: c_int)) { + local_data::set(reshape_tls_key, @callback); unsafe { - local_data_set(reshape_callback_tls_key, @callback); glutReshapeFunc(reshape_callback); } } -pub fn idle_callback_tls_key(_callback: @@fn()) { - // Empty. -} - -pub extern fn idle_callback() { - unsafe { - let callback = local_data_get(idle_callback_tls_key).get(); - (*callback)(); +pub extern "C" fn idle_callback() { + do local_data::get(idle_tls_key) |callback| { + (**callback.unwrap())(); } } pub fn idle_func(callback: @fn()) { + local_data::set(idle_tls_key, @callback); unsafe { - local_data_set(idle_callback_tls_key, @callback); glutIdleFunc(idle_callback); } } @@ -285,36 +256,26 @@ pub fn idle_func(callback: @fn()) { // Mouse wheel handling. // // This is not part of the standard, but it's supported by freeglut and our Mac hack. -pub fn mouse_wheel_callback_tls_key(_callback: @@fn(wheel: c_int, - direction: c_int, - x: c_int, - y: c_int)) { - // Empty. -} - #[cfg(target_os="linux")] #[cfg(target_os="android")] -pub extern fn mouse_wheel_callback(wheel: c_int, direction: c_int, x: c_int, y: c_int) { - unsafe { - let callback = local_data_get(mouse_wheel_callback_tls_key).get(); - (*callback)(wheel, direction, x, y) +pub extern "C" fn mouse_wheel_callback(wheel: c_int, direction: c_int, x: c_int, y: c_int) { + do local_data::get(mouse_wheel_tls_key) |callback| { + (**callback.unwrap())(wheel, direction, x, y); } } #[cfg(target_os="linux")] #[cfg(target_os="android")] pub fn mouse_wheel_func(callback: @fn(wheel: c_int, direction: c_int, x: c_int, y: c_int)) { + local_data::set(mouse_wheel_tls_key, @callback); unsafe { - local_data_set(mouse_wheel_callback_tls_key, @callback); glutMouseWheelFunc(mouse_wheel_callback); } } #[cfg(target_os="macos")] pub fn mouse_wheel_func(callback: @fn(wheel: c_int, direction: c_int, x: c_int, y: c_int)) { - unsafe { - local_data_set(mouse_wheel_callback_tls_key, @callback); - } + local_data::set(mouse_wheel_tls_key, @callback); } #[cfg(target_os="macos")]