diff --git a/src/api/emscripten/ffi.rs b/src/api/emscripten/ffi.rs deleted file mode 100644 index 34b6c17e..00000000 --- a/src/api/emscripten/ffi.rs +++ /dev/null @@ -1,82 +0,0 @@ -#![allow(dead_code)] -#![allow(non_snake_case)] -#![allow(non_camel_case_types)] - -use libc; - -pub type EM_BOOL = libc::c_int; -pub type EM_UTF8 = libc::c_char; -pub type EMSCRIPTEN_WEBGL_CONTEXT_HANDLE = libc::c_int; -pub type EMSCRIPTEN_RESULT = libc::c_int; - -pub type em_webgl_context_callback = extern fn(libc::c_int, *const libc::c_void, *mut libc::c_void) - -> EM_BOOL; - -#[repr(C)] -pub struct EmscriptenWebGLContextAttributes { - pub alpha: EM_BOOL, - pub depth: EM_BOOL, - pub stencil: EM_BOOL, - pub antialias: EM_BOOL, - pub premultipliedAlpha: EM_BOOL, - pub preserveDrawingBuffer: EM_BOOL, - pub preferLowPowerToHighPerformance: EM_BOOL, - pub failIfMajorPerformanceCaveat: EM_BOOL, - pub majorVersion: libc::c_int, - pub minorVersion: libc::c_int, - pub enableExtensionsByDefault: EM_BOOL, -} - -// values for EMSCRIPTEN_RESULT -pub const EMSCRIPTEN_RESULT_SUCCESS: libc::c_int = 0; -pub const EMSCRIPTEN_RESULT_DEFERRED: libc::c_int = 1; -pub const EMSCRIPTEN_RESULT_NOT_SUPPORTED: libc::c_int = -1; -pub const EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED: libc::c_int = -2; -pub const EMSCRIPTEN_RESULT_INVALID_TARGET: libc::c_int = -3; -pub const EMSCRIPTEN_RESULT_UNKNOWN_TARGET: libc::c_int = -4; -pub const EMSCRIPTEN_RESULT_INVALID_PARAM: libc::c_int = -5; -pub const EMSCRIPTEN_RESULT_FAILED: libc::c_int = -6; -pub const EMSCRIPTEN_RESULT_NO_DATA: libc::c_int = -7; - -extern { - pub fn emscripten_webgl_init_context_attributes(attributes: *mut EmscriptenWebGLContextAttributes); - pub fn emscripten_webgl_create_context(target: *const libc::c_char, - attributes: *const EmscriptenWebGLContextAttributes) -> EMSCRIPTEN_WEBGL_CONTEXT_HANDLE; - - pub fn emscripten_webgl_make_context_current(context: EMSCRIPTEN_WEBGL_CONTEXT_HANDLE) - -> EMSCRIPTEN_RESULT; - - pub fn emscripten_webgl_get_current_context() -> EMSCRIPTEN_WEBGL_CONTEXT_HANDLE; - - pub fn emscripten_webgl_destroy_context(context: EMSCRIPTEN_WEBGL_CONTEXT_HANDLE) - -> EMSCRIPTEN_RESULT; - - pub fn emscripten_webgl_enable_extension(context: EMSCRIPTEN_WEBGL_CONTEXT_HANDLE, - extension: *const libc::c_char) -> EM_BOOL; - - pub fn emscripten_set_webglcontextlost_callback(target: *const libc::c_char, - userData: *mut libc::c_void, useCapture: EM_BOOL, callback: em_webgl_context_callback) - -> EMSCRIPTEN_RESULT; - pub fn emscripten_set_webglcontextrestored_callback(target: *const libc::c_char, - userData: *mut libc::c_void, useCapture: EM_BOOL, callback: em_webgl_context_callback) - -> EMSCRIPTEN_RESULT; - - pub fn emscripten_is_webgl_context_lost(target: *const libc::c_char) -> EM_BOOL; - - // note: this function is not documented but is used by the ports of glfw, SDL and EGL - pub fn emscripten_GetProcAddress(name: *const libc::c_char) -> *const libc::c_void; - - - pub fn emscripten_request_fullscreen(target: *const libc::c_char, - deferUntilInEventHandler: EM_BOOL) -> EMSCRIPTEN_RESULT; - - pub fn emscripten_exit_fullscreen() -> EMSCRIPTEN_RESULT; - - pub fn emscripten_set_element_css_size(target: *const libc::c_char, width: libc::c_double, - height: libc::c_double) -> EMSCRIPTEN_RESULT; - - pub fn emscripten_get_element_css_size(target: *const libc::c_char, width: *mut libc::c_double, - height: *mut libc::c_double) -> EMSCRIPTEN_RESULT; - - pub fn emscripten_sleep(delay: libc::c_uint); -} diff --git a/src/api/emscripten/mod.rs b/src/api/emscripten/mod.rs deleted file mode 100644 index 67f57d11..00000000 --- a/src/api/emscripten/mod.rs +++ /dev/null @@ -1,297 +0,0 @@ -#![cfg(target_os = "emscripten")] - -use std::ffi::CString; -use libc; -use Api; -use Event; -use CreationError; -use ContextError; -use CursorState; -use GlAttributes; -use GlContext; -use MouseCursor; -use PixelFormat; -use PixelFormatRequirements; -use WindowAttributes; - -use std::collections::VecDeque; - -mod ffi; - -pub struct Window { - context: ffi::EMSCRIPTEN_WEBGL_CONTEXT_HANDLE, -} - -pub struct PollEventsIterator<'a> { - window: &'a Window, -} - -impl<'a> Iterator for PollEventsIterator<'a> { - type Item = Event; - - #[inline] - fn next(&mut self) -> Option { - None - } -} - -pub struct WaitEventsIterator<'a> { - window: &'a Window, -} - -impl<'a> Iterator for WaitEventsIterator<'a> { - type Item = Event; - - #[inline] - fn next(&mut self) -> Option { - None - } -} - -#[derive(Clone)] -pub struct WindowProxy; - -impl WindowProxy { - #[inline] - pub fn wakeup_event_loop(&self) { - unimplemented!() - } -} - -#[derive(Clone)] -pub struct MonitorId; - -#[inline] -pub fn get_available_monitors() -> VecDeque { - let mut list = VecDeque::new(); - list.push_back(MonitorId); - list -} - -#[inline] -pub fn get_primary_monitor() -> MonitorId { - MonitorId -} - -impl MonitorId { - #[inline] - pub fn get_name(&self) -> Option { - Some("Canvas".to_owned()) - } - - #[inline] - pub fn get_native_identifier(&self) -> ::native_monitor::NativeMonitorId { - ::native_monitor::NativeMonitorId::Unavailable - } - - #[inline] - pub fn get_dimensions(&self) -> (u32, u32) { - unimplemented!() - } -} - -impl Window { - pub fn new(window: &WindowAttributes, pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&Window>) -> Result - { - // getting the default values of attributes - let mut attributes = unsafe { - use std::mem; - let mut attributes: ffi::EmscriptenWebGLContextAttributes = mem::uninitialized(); - ffi::emscripten_webgl_init_context_attributes(&mut attributes); - attributes - }; - - // setting the attributes - // FIXME: - /*match builder.opengl.version { - Some((major, minor)) => { - attributes.majorVersion = major as libc::c_int; - attributes.minorVersion = minor as libc::c_int; - }, - None => () - };*/ - - // creating the context - let context = unsafe { - use std::{mem, ptr}; - let context = ffi::emscripten_webgl_create_context(ptr::null(), &attributes); - if context <= 0 { - return Err(CreationError::OsError(format!("Error while calling emscripten_webgl_create_context: {}", - error_to_str(mem::transmute(context))))); - } - context - }; - - // TODO: emscripten_set_webglcontextrestored_callback - - Ok(Window { - context: context - }) - } - - #[inline] - pub fn set_title(&self, _title: &str) { - } - - #[inline] - pub fn get_position(&self) -> Option<(i32, i32)> { - Some((0, 0)) - } - - #[inline] - pub fn set_position(&self, _: i32, _: i32) { - } - - pub fn get_inner_size(&self) -> Option<(u32, u32)> { - unsafe { - use std::{mem, ptr}; - let mut width = mem::uninitialized(); - let mut height = mem::uninitialized(); - - if ffi::emscripten_get_element_css_size(ptr::null(), &mut width, &mut height) - != ffi::EMSCRIPTEN_RESULT_SUCCESS - { - None - } else { - Some((width as u32, height as u32)) - } - } - } - - #[inline] - pub fn get_outer_size(&self) -> Option<(u32, u32)> { - self.get_inner_size() - } - - #[inline] - pub fn set_inner_size(&self, width: u32, height: u32) { - unsafe { - use std::ptr; - ffi::emscripten_set_element_css_size(ptr::null(), width as libc::c_double, height - as libc::c_double); - } - } - - #[inline] - pub fn poll_events(&self) -> PollEventsIterator { - PollEventsIterator { - window: self, - } - } - - #[inline] - pub fn wait_events(&self) -> WaitEventsIterator { - WaitEventsIterator { - window: self, - } - } - - #[inline] - pub fn create_window_proxy(&self) -> WindowProxy { - WindowProxy - } - - #[inline] - pub fn show(&self) {} - #[inline] - pub fn hide(&self) {} - - #[inline] - pub fn platform_display(&self) -> *mut libc::c_void { - unimplemented!() - } - - #[inline] - pub fn platform_window(&self) -> *mut libc::c_void { - unimplemented!() - } - - #[inline] - pub fn set_window_resize_callback(&mut self, _: Option) { - } - - #[inline] - pub fn set_cursor(&self, cursor: MouseCursor) { - } - - #[inline] - pub fn set_cursor_state(&self, state: CursorState) -> Result<(), String> { - Ok(()) - } - - #[inline] - pub fn hidpi_factor(&self) -> f32 { - 1.0 - } - - #[inline] - pub fn set_cursor_position(&self, x: i32, y: i32) -> Result<(), ()> { - Ok(()) - } -} - -impl GlContext for Window { - #[inline] - unsafe fn make_current(&self) -> Result<(), ContextError> { - // TOOD: check if == EMSCRIPTEN_RESULT - ffi::emscripten_webgl_make_context_current(self.context); - Ok(()) - } - - #[inline] - fn is_current(&self) -> bool { - true // FIXME: - } - - fn get_proc_address(&self, addr: &str) -> *const () { - let addr = CString::new(addr).unwrap(); - - unsafe { - // FIXME: if `as_ptr()` is used, then wrong data is passed to emscripten - ffi::emscripten_GetProcAddress(addr.into_raw() as *const _) as *const _ - } - } - - #[inline] - fn swap_buffers(&self) -> Result<(), ContextError> { - unsafe { ffi::emscripten_sleep(1); } // FIXME: - Ok(()) - } - - #[inline] - fn get_api(&self) -> Api { - Api::WebGl - } - - #[inline] - fn get_pixel_format(&self) -> PixelFormat { - unimplemented!(); - } -} - -impl Drop for Window { - fn drop(&mut self) { - unsafe { - ffi::emscripten_exit_fullscreen(); - ffi::emscripten_webgl_destroy_context(self.context); - } - } -} - -fn error_to_str(code: ffi::EMSCRIPTEN_RESULT) -> &'static str { - match code { - ffi::EMSCRIPTEN_RESULT_SUCCESS | ffi::EMSCRIPTEN_RESULT_DEFERRED - => "Internal error in the library (success detected as failure)", - - ffi::EMSCRIPTEN_RESULT_NOT_SUPPORTED => "Not supported", - ffi::EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED => "Failed not deferred", - ffi::EMSCRIPTEN_RESULT_INVALID_TARGET => "Invalid target", - ffi::EMSCRIPTEN_RESULT_UNKNOWN_TARGET => "Unknown target", - ffi::EMSCRIPTEN_RESULT_INVALID_PARAM => "Invalid parameter", - ffi::EMSCRIPTEN_RESULT_FAILED => "Failed", - ffi::EMSCRIPTEN_RESULT_NO_DATA => "No data", - - _ => "Undocumented error" - } -} diff --git a/src/api/mod.rs b/src/api/mod.rs index 3ac469fa..3eabaf66 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,7 +1,6 @@ // TODO: remove this module altogether and move all implementations to `platform` pub mod dlopen; -pub mod emscripten; pub mod wayland; pub mod x11; pub mod ios; diff --git a/src/platform/emscripten/mod.rs b/src/platform/emscripten/mod.rs deleted file mode 100644 index 22cb5653..00000000 --- a/src/platform/emscripten/mod.rs +++ /dev/null @@ -1,64 +0,0 @@ -#![cfg(target_os = "emscripten")] - -use Api; -use ContextError; -use CreationError; -use GlAttributes; -use GlContext; -use PixelFormat; -use PixelFormatRequirements; - -pub use api::emscripten::{Window, WindowProxy, MonitorId, get_available_monitors}; -pub use api::emscripten::{get_primary_monitor, WaitEventsIterator, PollEventsIterator}; - -pub struct HeadlessContext(Window); - -impl HeadlessContext { - /// See the docs in the crate root file. - #[inline] - pub fn new(_: (u32, u32), _: &PixelFormatRequirements, _: &GlAttributes<&HeadlessContext>) - -> Result - { - unimplemented!() - } -} - -impl GlContext for HeadlessContext { - #[inline] - unsafe fn make_current(&self) -> Result<(), ContextError> { - self.0.make_current() - } - - #[inline] - fn is_current(&self) -> bool { - self.0.is_current() - } - - #[inline] - fn get_proc_address(&self, addr: &str) -> *const () { - self.0.get_proc_address(addr) - } - - #[inline] - fn swap_buffers(&self) -> Result<(), ContextError> { - self.0.swap_buffers() - } - - #[inline] - fn get_api(&self) -> Api { - self.0.get_api() - } - - #[inline] - fn get_pixel_format(&self) -> PixelFormat { - self.0.get_pixel_format() - } -} - -unsafe impl Send for HeadlessContext {} -unsafe impl Sync for HeadlessContext {} - -#[derive(Clone, Default)] -pub struct PlatformSpecificWindowBuilderAttributes; -#[derive(Clone, Default)] -pub struct PlatformSpecificHeadlessBuilderAttributes; diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 975d4301..999a9f32 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -15,11 +15,8 @@ mod platform; #[cfg(target_os = "ios")] #[path="ios/mod.rs"] mod platform; -#[cfg(target_os = "emscripten")] -#[path="emscripten/mod.rs"] -mod platform; #[cfg(all(not(target_os = "ios"), not(target_os = "windows"), not(target_os = "linux"), not(target_os = "macos"), not(target_os = "android"), not(target_os = "dragonfly"), - not(target_os = "freebsd"), not(target_os = "openbsd"), not(target_os = "emscripten")))] + not(target_os = "freebsd"), not(target_os = "openbsd")))] use this_platform_is_not_supported;