diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fffb2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..bfc5b20 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "glut" +version = "0.0.1" +authors = ["The Servo Project Developers"] + +build = "make -f makefile.cargo" + +[dependencies.opengles] +git = "https://github.com/servo/rust-opengles" diff --git a/machack.rs b/machack.rs deleted file mode 100644 index 5dab7e7..0000000 --- a/machack.rs +++ /dev/null @@ -1,101 +0,0 @@ -#![allow(non_uppercase_statics)] - -extern crate cocoa; - -use glut::{mouse_callback_tls_key, mouse_wheel_callback_tls_key}; - -use libc::{c_int, c_void}; -use std::cast::transmute; -use std::local_data::local_data_get; -use std::ptr::null; -use machack::cocoa::base::{SEL, class_addMethod, id, msg_send_double, msg_send_id, objc_getClass}; -use machack::cocoa::base::{sel_registerName}; - -#[link(name="Carbon", kind="framework")] -extern { - // Carbon API. - #[fast_ffi] - fn GetEventKind(eventRef: *const c_void) -> u32; -} - -// From CarbonEvents.h. -static kEventMouseScroll: u32 = 11; - -extern fn scrollWheelImpl(_this: id, _cmd: SEL, event: id) { - unsafe { - // Get the underlying Carbon event to figure out if deviceDelta{Y,X} are available. - let sel__eventRef = sel_registerName(transmute(&"_eventRef"[0])); - let eventRef: *const c_void = transmute(msg_send_id(event, sel__eventRef)); - let is_scroll = eventRef != null() && GetEventKind(eventRef) == kEventMouseScroll; - - // Use precise scrolling if available; otherwise, use coarse-grained scrolling. - let (delta_x, delta_y) = if is_scroll { - let sel_deviceDeltaY = sel_registerName(transmute(&"deviceDeltaY"[0])); - let delta_y = msg_send_double(event, sel_deviceDeltaY); - let sel_deviceDeltaX = sel_registerName(transmute(&"deviceDeltaX"[0])); - let delta_x = msg_send_double(event, sel_deviceDeltaX); - (delta_x, delta_y) - } else { - let sel_deltaY = sel_registerName(transmute(&"deltaY"[0])); - let delta_y = msg_send_double(event, sel_deltaY); - let sel_deltaX = sel_registerName(transmute(&"deltaX"[0])); - let delta_x = msg_send_double(event, sel_deltaX); - (delta_x * 30.0, delta_y * 30.0) - }; - - // First, try the wheel func. - match local_data_get(mouse_wheel_callback_tls_key) { - None => {} // Continue. - Some(callback) => { - (*callback)(0, (delta_y * 10000.0) as c_int, 0, 0); - (*callback)(1, (delta_x * 10000.0) as c_int, 0, 0); - return - } - } - - // Fall through to the mouse func. - let button = if delta_y == 0.0 { - return - } else if delta_y > 0.0 { - 3 - } else { - 4 - }; - - match local_data_get(mouse_callback_tls_key) { - None => {} // Ignore. - Some(callback) => (*callback)(button, 1, 0, 0), - } - } -} - -extern fn magnifyWithEvent(_this: id, _cmd: SEL, event: id) { - unsafe { - let sel_magnification = sel_registerName(transmute(&"magnification"[0])); - let magnification = msg_send_double(event, sel_magnification) + 1.0; - - match local_data_get(mouse_wheel_callback_tls_key) { - None => {} - Some(callback) => (*callback)(2, (magnification * 10000.0) as c_int, 0, 0), - } - } -} - -pub fn perform_scroll_wheel_hack() { - unsafe { - let class_GLUTView = objc_getClass(transmute(&"GLUTView"[0])); - - let sel_scrollWheel = sel_registerName(transmute(&"scrollWheel:"[0])); - class_addMethod(class_GLUTView, - sel_scrollWheel, - transmute(scrollWheelImpl), - transmute(&"v@:@"[0])); - - let sel_magnifyWithEvent = sel_registerName(transmute(&"magnifyWithEvent:"[0])); - class_addMethod(class_GLUTView, - sel_magnifyWithEvent, - transmute(magnifyWithEvent), - transmute(&"v@:@"[0])); - } -} - diff --git a/machackstub.rs b/machackstub.rs deleted file mode 100644 index 49b4e00..0000000 --- a/machackstub.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub fn perform_scroll_wheel_hack() { - // Just a stub. -} - diff --git a/makefile.cargo b/makefile.cargo new file mode 100644 index 0000000..43588df --- /dev/null +++ b/makefile.cargo @@ -0,0 +1,30 @@ +ifeq (androideabi,$(findstring androideabi,$(TARGET))) + +CC := $(TARGET)-g++ +AR := $(TARGET)-ar + +else + +CC ?= gcc +AR ?= ar + +endif + +CFLAGS ?= + +.PHONY: all +ifeq (androideabi,$(findstring androideabi,$(TARGET))) + +all: $(OUT_DIR)/libandroid-glue.a + +$(OUT_DIR)/libandroid-glue.a: $(OUT_DIR)/android-glue.o + $(AR) rcs $@ $^ + +$(OUT_DIR)/android-glue.o: src/android-glue.c + $(CC) $(CFLAGS) -o $@ -c $< + +else + +all: + +endif diff --git a/android-glue.c b/src/android-glue.c similarity index 100% rename from android-glue.c rename to src/android-glue.c diff --git a/glut.rs b/src/glut.rs similarity index 100% rename from glut.rs rename to src/glut.rs diff --git a/glut.rc b/src/lib.rs similarity index 74% rename from glut.rc rename to src/lib.rs index 8053bc3..5ce8bd7 100644 --- a/glut.rc +++ b/src/lib.rs @@ -7,22 +7,15 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#![crate_name = "glut"] -#![crate_type = "rlib"] - #![feature(macro_rules)] extern crate libc; extern crate std; +extern crate opengles; +#[cfg(target_os="android")] pub mod glut; -#[cfg(target_os="macos")] -pub mod machack; -#[cfg(not(target_os="macos"))] -#[path="machackstub.rs"] -pub mod machack; - -#[cfg(test)] +#[cfg(test,target_os="android")] pub mod test; diff --git a/test.rs b/src/test.rs similarity index 84% rename from test.rs rename to src/test.rs index 60e5177..688704c 100644 --- a/test.rs +++ b/src/test.rs @@ -7,19 +7,18 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -extern crate opengles = "rust-opengles"; // FIXME: Should only be for tests. use glut::{swap_buffers, GLint}; -use self::opengles::gl2::{ARRAY_BUFFER, COLOR_BUFFER_BIT, COMPILE_STATUS}; -use self::opengles::gl2::{FRAGMENT_SHADER, LINK_STATUS, NO_ERROR, STATIC_DRAW}; -use self::opengles::gl2::{TRIANGLE_STRIP, VERTEX_SHADER, GLenum}; -use self::opengles::gl2::{GLsizei, GLuint, attach_shader, bind_buffer}; -use self::opengles::gl2::{buffer_data, create_program, clear, clear_color}; -use self::opengles::gl2::{compile_shader, create_shader, draw_arrays}; -use self::opengles::gl2::{enable_vertex_attrib_array, gen_buffers}; -use self::opengles::gl2::{get_attrib_location, get_error, get_program_iv}; -use self::opengles::gl2::{get_shader_info_log, get_shader_iv}; -use self::opengles::gl2::{link_program, shader_source}; -use self::opengles::gl2::{use_program, vertex_attrib_pointer_f32}; +use opengles::gl2::{ARRAY_BUFFER, COLOR_BUFFER_BIT, COMPILE_STATUS}; +use opengles::gl2::{FRAGMENT_SHADER, LINK_STATUS, NO_ERROR, STATIC_DRAW}; +use opengles::gl2::{TRIANGLE_STRIP, VERTEX_SHADER, GLenum}; +use opengles::gl2::{GLsizei, GLuint, attach_shader, bind_buffer}; +use opengles::gl2::{buffer_data, create_program, clear, clear_color}; +use opengles::gl2::{compile_shader, create_shader, draw_arrays}; +use opengles::gl2::{enable_vertex_attrib_array, gen_buffers}; +use opengles::gl2::{get_attrib_location, get_error, get_program_iv}; +use opengles::gl2::{get_shader_info_log, get_shader_iv}; +use opengles::gl2::{link_program, shader_source}; +use opengles::gl2::{use_program, vertex_attrib_pointer_f32}; use libc::c_int; use std::comm;