From e4719b69aa9f7698f70467da242057c32bb3bfc2 Mon Sep 17 00:00:00 2001 From: "aydin.kim" Date: Wed, 20 Nov 2013 15:56:15 +0900 Subject: [PATCH] update for language changes --- glut.rc | 4 ++ glut.rs | 139 ++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 89 insertions(+), 54 deletions(-) diff --git a/glut.rc b/glut.rc index 6ee15a6..507ad91 100644 --- a/glut.rc +++ b/glut.rc @@ -11,6 +11,10 @@ vers = "0.1")]; #[crate_type = "lib"]; +#[feature(globs)]; +#[feature(macro_rules)]; +#[feature(managed_boxes)]; + extern mod std; pub mod glut; diff --git a/glut.rs b/glut.rs index 3b388c7..7c590ef 100644 --- a/glut.rs +++ b/glut.rs @@ -64,22 +64,36 @@ 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 type DisplayFun = ~fn(); +pub type KeyboardFun = ~fn(key: c_uchar, x: c_int, y: c_int); +pub type MouseFun = ~fn(button: c_int, state: c_int, x: c_int, y: c_int); +pub type MotionFun = ~fn(x: c_int, y: c_int); +pub type PassiveMotionFun = ~fn(x: c_int, y: c_int); +pub type TimerFun = ~[~fn()]; +pub type ReshapeFun = ~fn(x: c_int, y: c_int); +pub type IdleFun = ~fn(); +#[cfg(target_os="linux")] +#[cfg(target_os="android")] +pub type MouseWheelFun = ~fn(wheel: c_int, direction: c_int, x: c_int, y: c_int); + + +local_data_key!(display_tls_key, DisplayFun) +local_data_key!(keyboard_tls_key, KeyboardFun) +local_data_key!(mouse_tls_key, MouseFun) +local_data_key!(motion_tls_key, MotionFun) +local_data_key!(passive_motion_tls_key, PassiveMotionFun) +local_data_key!(timer_tls_key, TimerFun) +local_data_key!(reshape_tls_key, ReshapeFun) +local_data_key!(idle_tls_key, IdleFun) +#[cfg(target_os="linux")] +#[cfg(target_os="android")] +local_data_key!(mouse_wheel_tls_key, MouseWheelFun) pub enum State { WindowWidth, @@ -144,14 +158,16 @@ pub fn reshape_window(window: Window, width: c_int, height: c_int) { #[fixed_stack_segment] #[inline(never)] pub extern "C" fn display_callback() { - do local_data::get(display_tls_key) |callback| { - (**callback.unwrap())(); + do local_data::get(display_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(); + }; } } #[fixed_stack_segment] #[inline(never)] -pub fn display_func(callback: @fn()) { - local_data::set(display_tls_key, @callback); +pub fn display_func(callback: DisplayFun) { + local_data::set(display_tls_key, callback); unsafe { glutDisplayFunc(display_callback); } @@ -159,14 +175,16 @@ pub fn display_func(callback: @fn()) { #[fixed_stack_segment] #[inline(never)] 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); + do local_data::get(keyboard_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(key, x, y); + }; } } #[fixed_stack_segment] #[inline(never)] -pub fn keyboard_func(callback: @fn(key: c_uchar, x: c_int, y: c_int)) { - local_data::set(keyboard_tls_key, @callback); +pub fn keyboard_func(callback: KeyboardFun) { + local_data::set(keyboard_tls_key, callback); unsafe { glutKeyboardFunc(keyboard_callback); } @@ -174,14 +192,16 @@ pub fn keyboard_func(callback: @fn(key: c_uchar, x: c_int, y: c_int)) { #[fixed_stack_segment] #[inline(never)] 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); + do local_data::get(mouse_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(button, state, x, y); + }; } } #[fixed_stack_segment] #[inline(never)] -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); +pub fn mouse_func(callback: MouseFun) { + local_data::set(mouse_tls_key, callback); unsafe { glutMouseFunc(mouse_callback); } @@ -189,14 +209,16 @@ pub fn mouse_func(callback: @fn(button: c_int, state: c_int, x: c_int, y: c_int) #[fixed_stack_segment] #[inline(never)] pub extern "C" fn motion_callback(x: c_int, y: c_int) { - do local_data::get(motion_tls_key) |callback| { - (**callback.unwrap())(x, y); + do local_data::get(motion_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(x, y); + }; } } #[fixed_stack_segment] #[inline(never)] -pub fn motion_func(callback: @fn(x: c_int, y: c_int)) { - local_data::set(motion_tls_key, @callback); +pub fn motion_func(callback: MotionFun) { + local_data::set(motion_tls_key, callback); unsafe { glutMotionFunc(motion_callback); } @@ -204,14 +226,16 @@ pub fn motion_func(callback: @fn(x: c_int, y: c_int)) { #[fixed_stack_segment] #[inline(never)] 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); + do local_data::get(passive_motion_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(x, y); + }; } } #[fixed_stack_segment] #[inline(never)] -pub fn passive_motion_func(callback: @fn(x: c_int, y: c_int)) { - local_data::set(passive_motion_tls_key, @callback); +pub fn passive_motion_func(callback: PassiveMotionFun) { + local_data::set(passive_motion_tls_key, callback); unsafe { glutPassiveMotionFunc(passive_motion_callback); } @@ -219,23 +243,24 @@ pub fn passive_motion_func(callback: @fn(x: c_int, y: c_int)) { #[fixed_stack_segment] #[inline(never)] pub extern "C" fn timer_callback(index: int) { - do local_data::get(timer_tls_key) |callback| { - ((**callback.unwrap())[index as uint])(); + do local_data::get(timer_tls_key) |data| { + do data.as_ref().map |&ref cb| { + ((**cb)[index as uint])(); + }; } } #[fixed_stack_segment] #[inline(never)] -pub fn timer_func(msecs: u32, callback: @fn()) { +//FIXME(aydin.kim): we need to get rid of @mut. This is just a workaround for pushing owned fn() to callback array. +pub fn timer_func(msecs: u32, callback: @mut ~fn()) { do local_data::get(timer_tls_key) |data| { let callbacks; - match data { - None => { - callbacks = @mut ~[]; - local_data::set(timer_tls_key, unsafe { cast::transmute(callbacks) }); - } - Some(existing_callbacks) => { - callbacks = unsafe { cast::transmute(existing_callbacks) }; - } + if data.is_none() { + callbacks = @mut ~[]; + local_data::set(timer_tls_key, unsafe { cast::transmute(callbacks) }); + } + else { + callbacks = unsafe { cast::transmute(data.unwrap())}; } callbacks.push(callback); let index = (callbacks.len() - 1) as c_int; @@ -247,14 +272,16 @@ pub fn timer_func(msecs: u32, callback: @fn()) { #[fixed_stack_segment] #[inline(never)] pub extern "C" fn reshape_callback(width: c_int, height: c_int) { - do local_data::get(reshape_tls_key) |callback| { - (**callback.unwrap())(width, height); + do local_data::get(reshape_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(width, height); + }; } } #[fixed_stack_segment] #[inline(never)] -pub fn reshape_func(_window: Window, callback: @fn(x: c_int, y: c_int)) { - local_data::set(reshape_tls_key, @callback); +pub fn reshape_func(_window: Window, callback: ReshapeFun) { + local_data::set(reshape_tls_key, callback); unsafe { glutReshapeFunc(reshape_callback); } @@ -262,14 +289,16 @@ pub fn reshape_func(_window: Window, callback: @fn(x: c_int, y: c_int)) { #[fixed_stack_segment] #[inline(never)] pub extern "C" fn idle_callback() { - do local_data::get(idle_tls_key) |callback| { - (**callback.unwrap())(); + do local_data::get(idle_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(); + }; } } #[fixed_stack_segment] #[inline(never)] -pub fn idle_func(callback: @fn()) { - local_data::set(idle_tls_key, @callback); +pub fn idle_func(callback: IdleFun) { + local_data::set(idle_tls_key, callback); unsafe { glutIdleFunc(idle_callback); } @@ -282,16 +311,18 @@ pub fn idle_func(callback: @fn()) { #[cfg(target_os="android")] #[fixed_stack_segment] #[inline(never)] 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); + do local_data::get(mouse_wheel_tls_key) |data| { + do data.as_ref().map |&ref cb| { + (**cb)(wheel, direction, x, y); + }; } } #[cfg(target_os="linux")] #[cfg(target_os="android")] #[fixed_stack_segment] #[inline(never)] -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); +pub fn mouse_wheel_func(callback: MouseWheelFun) { + local_data::set(mouse_wheel_tls_key, callback); unsafe { glutMouseWheelFunc(mouse_wheel_callback); } @@ -300,7 +331,7 @@ pub fn mouse_wheel_func(callback: @fn(wheel: c_int, direction: c_int, x: c_int, #[cfg(target_os="macos")] #[fixed_stack_segment] #[inline(never)] 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); + local_data::set(mouse_wheel_tls_key, callback); } #[cfg(target_os="macos")]