diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/api/android/mod.rs | 12 | ||||
-rw-r--r-- | src/api/caca/mod.rs | 2 | ||||
-rw-r--r-- | src/api/cocoa/headless.rs | 7 | ||||
-rw-r--r-- | src/api/cocoa/mod.rs | 21 | ||||
-rw-r--r-- | src/api/emscripten/mod.rs | 39 | ||||
-rw-r--r-- | src/api/ios/mod.rs | 6 | ||||
-rw-r--r-- | src/api/osmesa/mod.rs | 2 | ||||
-rw-r--r-- | src/api/x11/window.rs | 27 | ||||
-rw-r--r-- | src/headless.rs | 7 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/os/unix.rs | 11 | ||||
-rw-r--r-- | src/os/windows.rs | 11 | ||||
-rw-r--r-- | src/platform/emscripten/mod.rs | 16 | ||||
-rw-r--r-- | src/platform/ios/mod.rs | 9 | ||||
-rw-r--r-- | src/platform/linux/api_dispatch.rs | 6 | ||||
-rw-r--r-- | src/platform/linux/mod.rs | 8 | ||||
-rw-r--r-- | src/platform/mod.rs | 5 | ||||
-rw-r--r-- | src/platform/windows/mod.rs | 11 | ||||
-rw-r--r-- | src/window.rs | 6 |
19 files changed, 165 insertions, 43 deletions
diff --git a/src/api/android/mod.rs b/src/api/android/mod.rs index f42caeb..433472c 100644 --- a/src/api/android/mod.rs +++ b/src/api/android/mod.rs @@ -65,6 +65,11 @@ impl MonitorId { } } +#[derive(Default)] +pub struct PlatformSpecificWindowBuilderAttributes; +#[derive(Default)] +pub struct PlatformSpecificHeadlessBuilderAttributes; + pub struct PollEventsIterator<'a> { window: &'a Window, } @@ -116,7 +121,8 @@ impl<'a> Iterator for WaitEventsIterator<'a> { impl Window { pub fn new(win_attribs: &WindowAttributes, pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&Window>) -> Result<Window, CreationError> + opengl: &GlAttributes<&Window>, _: &PlatformSpecificWindowBuilderAttributes) + -> Result<Window, CreationError> { use std::{mem, ptr}; @@ -302,7 +308,9 @@ pub struct HeadlessContext(EglContext); impl HeadlessContext { /// See the docs in the crate root file. pub fn new(dimensions: (u32, u32), pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&HeadlessContext>) -> Result<HeadlessContext, CreationError> + opengl: &GlAttributes<&HeadlessContext>, + _: &PlatformSpecificHeadlessBuilderAttributes) + -> Result<HeadlessContext, CreationError> { let opengl = opengl.clone().map_sharing(|c| &c.0); let context = try!(EglContext::new(egl::ffi::egl::Egl, pf_reqs, &opengl, diff --git a/src/api/caca/mod.rs b/src/api/caca/mod.rs index 687c66f..e73fa6c 100644 --- a/src/api/caca/mod.rs +++ b/src/api/caca/mod.rs @@ -1,4 +1,4 @@ -#![cfg(any(target_os = "linux", target_os = "freebsd"))] +#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))] #![allow(unused_variables, dead_code)] use libc; diff --git a/src/api/cocoa/headless.rs b/src/api/cocoa/headless.rs index 7fe2046..ac6c4e0 100644 --- a/src/api/cocoa/headless.rs +++ b/src/api/cocoa/headless.rs @@ -13,6 +13,9 @@ use cocoa::appkit::*; use PixelFormat; use api::cocoa::helpers; +#[derive(Default)] +pub struct PlatformSpecificHeadlessBuilderAttributes; + pub struct HeadlessContext { width: u32, height: u32, @@ -21,7 +24,9 @@ pub struct HeadlessContext { impl HeadlessContext { pub fn new((width, height): (u32, u32), pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&HeadlessContext>) -> Result<HeadlessContext, CreationError> + opengl: &GlAttributes<&HeadlessContext>, + _: &PlatformSpecificHeadlessBuilderAttributes) + -> Result<HeadlessContext, CreationError> { let context = unsafe { diff --git a/src/api/cocoa/mod.rs b/src/api/cocoa/mod.rs index 138a448..4502405 100644 --- a/src/api/cocoa/mod.rs +++ b/src/api/cocoa/mod.rs @@ -1,7 +1,5 @@ #![cfg(target_os = "macos")] -pub use self::headless::HeadlessContext; - use {CreationError, Event, MouseCursor, CursorState}; use CreationError::OsError; use libc; @@ -50,6 +48,8 @@ use events::MouseButton; use events; pub use self::monitor::{MonitorId, get_available_monitors, get_primary_monitor}; +pub use self::headless::HeadlessContext; +pub use self::headless::PlatformSpecificHeadlessBuilderAttributes; mod monitor; mod event; @@ -179,6 +179,9 @@ impl Drop for WindowDelegate { } } +#[derive(Default)] +pub struct PlatformSpecificWindowBuilderAttributes; + pub struct Window { view: IdRef, window: IdRef, @@ -264,7 +267,8 @@ impl<'a> Iterator for WaitEventsIterator<'a> { impl Window { pub fn new(win_attribs: &WindowAttributes, pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&Window>) -> Result<Window, CreationError> + opengl: &GlAttributes<&Window>, _: &PlatformSpecificWindowBuilderAttributes) + -> Result<Window, CreationError> { if opengl.sharing.is_some() { unimplemented!() @@ -837,9 +841,7 @@ unsafe fn NSEventToEvent(window: &Window, nsevent: id) -> Option<Event> { let received_c_str = nsevent.characters().UTF8String(); let received_str = CStr::from_ptr(received_c_str); for received_char in from_utf8(received_str.to_bytes()).unwrap().chars() { - if received_char.is_ascii() { - events.push_back(ReceivedCharacter(received_char)); - } + events.push_back(ReceivedCharacter(received_char)); } let vkey = event::vkeycode_to_element(NSEvent::keyCode(nsevent)); @@ -881,10 +883,13 @@ unsafe fn NSEventToEvent(window: &Window, nsevent: id) -> Option<Event> { }, NSScrollWheel => { use events::MouseScrollDelta::{LineDelta, PixelDelta}; + let scale_factor = window.hidpi_factor(); let delta = if nsevent.hasPreciseScrollingDeltas() == YES { - PixelDelta(nsevent.scrollingDeltaX() as f32, nsevent.scrollingDeltaY() as f32) + PixelDelta(scale_factor * nsevent.scrollingDeltaX() as f32, + scale_factor * nsevent.scrollingDeltaY() as f32) } else { - LineDelta(nsevent.scrollingDeltaX() as f32, nsevent.scrollingDeltaY() as f32) + LineDelta(scale_factor * nsevent.scrollingDeltaX() as f32, + scale_factor * nsevent.scrollingDeltaY() as f32) }; Some(MouseWheel(delta)) }, diff --git a/src/api/emscripten/mod.rs b/src/api/emscripten/mod.rs index 61d8c8c..67f57d1 100644 --- a/src/api/emscripten/mod.rs +++ b/src/api/emscripten/mod.rs @@ -2,11 +2,17 @@ use std::ffi::CString; use libc; -use {Event, BuilderAttribs, CreationError, MouseCursor}; use Api; -use PixelFormat; +use Event; +use CreationError; use ContextError; +use CursorState; +use GlAttributes; use GlContext; +use MouseCursor; +use PixelFormat; +use PixelFormatRequirements; +use WindowAttributes; use std::collections::VecDeque; @@ -52,6 +58,7 @@ impl WindowProxy { } } +#[derive(Clone)] pub struct MonitorId; #[inline] @@ -73,13 +80,20 @@ impl MonitorId { } #[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(builder: BuilderAttribs) -> Result<Window, CreationError> { + pub fn new(window: &WindowAttributes, pf_reqs: &PixelFormatRequirements, + opengl: &GlAttributes<&Window>) -> Result<Window, CreationError> + { // getting the default values of attributes let mut attributes = unsafe { use std::mem; @@ -198,14 +212,23 @@ impl Window { } #[inline] - pub fn set_cursor(&self, _cursor: MouseCursor) { - unimplemented!() + 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 { @@ -222,11 +245,11 @@ impl GlContext for Window { } fn get_proc_address(&self, addr: &str) -> *const () { - let addr = CString::new(addr.as_bytes()).unwrap(); - let addr = addr.as_ptr(); + let addr = CString::new(addr).unwrap(); unsafe { - ffi::emscripten_GetProcAddress(addr) as *const _ + // FIXME: if `as_ptr()` is used, then wrong data is passed to emscripten + ffi::emscripten_GetProcAddress(addr.into_raw() as *const _) as *const _ } } diff --git a/src/api/ios/mod.rs b/src/api/ios/mod.rs index 852d97c..afcc6f4 100644 --- a/src/api/ios/mod.rs +++ b/src/api/ios/mod.rs @@ -177,10 +177,14 @@ impl MonitorId { } } +#[derive(Default)] +pub struct PlatformSpecificWindowBuilderAttributes; impl Window { - pub fn new(builder: &WindowAttributes, _: &PixelFormatRequirements, _: &GlAttributes<&Window>) -> Result<Window, CreationError> { + pub fn new(builder: &WindowAttributes, _: &PixelFormatRequirements, _: &GlAttributes<&Window>, + _: &PlatformSpecificWindowBuilderAttributes) -> Result<Window, CreationError> + { unsafe { if setjmp(mem::transmute(&mut jmpbuf)) != 0 { let app: id = msg_send![Class::get("UIApplication").unwrap(), sharedApplication]; diff --git a/src/api/osmesa/mod.rs b/src/api/osmesa/mod.rs index 02c43a1..7ef243a 100644 --- a/src/api/osmesa/mod.rs +++ b/src/api/osmesa/mod.rs @@ -1,4 +1,4 @@ -#![cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly"))] +#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))] extern crate osmesa_sys; diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index 4b78c4a..8cae2be 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -469,10 +469,6 @@ impl Window { display.check_errors().expect("Failed to call XInternAtom"); (display.xlib.XSetWMProtocols)(display.display, window, &mut wm_delete_window, 1); display.check_errors().expect("Failed to call XSetWMProtocols"); - with_c_str(&*window_attrs.title, |title| {; - (display.xlib.XStoreName)(display.display, window, title); - }); - display.check_errors().expect("Failed to call XStoreName"); (display.xlib.XFlush)(display.display); display.check_errors().expect("Failed to call XFlush"); @@ -636,6 +632,8 @@ impl Window { input_handler: Mutex::new(XInputEventHandler::new(display, window, ic, window_attrs)) }; + window.set_title(&window_attrs.title); + if window_attrs.visible { unsafe { let ref x_window: &XWindow = window.x.borrow(); @@ -669,12 +667,27 @@ impl Window { } pub fn set_title(&self, title: &str) { - with_c_str(title, |title| unsafe { - (self.x.display.xlib.XStoreName)(self.x.display.display, self.x.window, title); + let wm_name = unsafe { + (self.x.display.xlib.XInternAtom)(self.x.display.display, b"_NET_WM_NAME\0".as_ptr() as *const _, 0) + }; + self.x.display.check_errors().expect("Failed to call XInternAtom"); + + let wm_utf8_string = unsafe { + (self.x.display.xlib.XInternAtom)(self.x.display.display, b"UTF8_STRING\0".as_ptr() as *const _, 0) + }; + self.x.display.check_errors().expect("Failed to call XInternAtom"); + + with_c_str(title, |c_title| unsafe { + (self.x.display.xlib.XStoreName)(self.x.display.display, self.x.window, c_title); + + let len = title.as_bytes().len(); + (self.x.display.xlib.XChangeProperty)(self.x.display.display, self.x.window, + wm_name, wm_utf8_string, 8, ffi::PropModeReplace, + c_title as *const u8, len as libc::c_int); (self.x.display.xlib.XFlush)(self.x.display.display); }); + self.x.display.check_errors().expect("Failed to set window title"); - self.x.display.check_errors().expect("Failed to call XStoreName"); } pub fn show(&self) { diff --git a/src/headless.rs b/src/headless.rs index 67ea8da..8ea4141 100644 --- a/src/headless.rs +++ b/src/headless.rs @@ -20,6 +20,9 @@ pub struct HeadlessRendererBuilder<'a> { // Should be made public once it's stabilized. pf_reqs: PixelFormatRequirements, + + /// Platform-specific configuration. + platform_specific: platform::PlatformSpecificHeadlessBuilderAttributes, } impl<'a> HeadlessRendererBuilder<'a> { @@ -30,6 +33,7 @@ impl<'a> HeadlessRendererBuilder<'a> { dimensions: (width, height), pf_reqs: Default::default(), opengl: Default::default(), + platform_specific: Default::default(), } } @@ -63,7 +67,8 @@ impl<'a> HeadlessRendererBuilder<'a> { /// out of memory, etc. #[inline] pub fn build(self) -> Result<HeadlessContext, CreationError> { - platform::HeadlessContext::new(self.dimensions, &self.pf_reqs, &self.opengl) + platform::HeadlessContext::new(self.dimensions, &self.pf_reqs, &self.opengl, + &self.platform_specific) .map(|w| HeadlessContext { context: w }) } @@ -54,7 +54,7 @@ extern crate cocoa; extern crate core_foundation; #[cfg(target_os = "macos")] extern crate core_graphics; -#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly"))] +#[cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))] extern crate x11_dl; #[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly"))] #[macro_use(wayland_env)] diff --git a/src/os/unix.rs b/src/os/unix.rs index d206351..f42b3c6 100644 --- a/src/os/unix.rs +++ b/src/os/unix.rs @@ -3,8 +3,9 @@ use libc; use Window; use platform::Window as LinuxWindow; +use WindowBuilder; -/// Additional methods on `Window` that are specific to unix. +/// Additional methods on `Window` that are specific to Unix. pub trait WindowExt { /// Returns a pointer to the `Window` object of xlib that is used by this window. /// @@ -38,3 +39,11 @@ impl WindowExt for Window { } } } + +/// Additional methods on `WindowBuilder` that are specific to Unix. +pub trait WindowBuilderExt { + +} + +impl<'a> WindowBuilderExt for WindowBuilder<'a> { +} diff --git a/src/os/windows.rs b/src/os/windows.rs index e9ab056..02a76e2 100644 --- a/src/os/windows.rs +++ b/src/os/windows.rs @@ -2,8 +2,9 @@ use libc; use Window; +use WindowBuilder; -/// Additional methods on `Window` that are specific to unix. +/// Additional methods on `Window` that are specific to Windows. pub trait WindowExt { /// Returns a pointer to the `Window` object of xlib that is used by this window. /// @@ -19,3 +20,11 @@ impl WindowExt for Window { self.window.platform_window() } } + +/// Additional methods on `WindowBuilder` that are specific to Windows. +pub trait WindowBuilderExt { + +} + +impl<'a> WindowBuilderExt for WindowBuilder<'a> { +} diff --git a/src/platform/emscripten/mod.rs b/src/platform/emscripten/mod.rs index 270cdaf..ce8d201 100644 --- a/src/platform/emscripten/mod.rs +++ b/src/platform/emscripten/mod.rs @@ -1,7 +1,12 @@ #![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}; @@ -11,8 +16,10 @@ pub struct HeadlessContext(Window); impl HeadlessContext { /// See the docs in the crate root file. #[inline] - pub fn new(builder: BuilderAttribs) -> Result<HeadlessContext, CreationError> { - Window::new(builder).map(|w| HeadlessContext(w)) + pub fn new(_: (u32, u32), _: &PixelFormatRequirements, _: &GlAttributes<&HeadlessContext>) + -> Result<HeadlessContext, CreationError> + { + unimplemented!() } } @@ -50,3 +57,8 @@ impl GlContext for HeadlessContext { unsafe impl Send for HeadlessContext {} unsafe impl Sync for HeadlessContext {} + +#[derive(Default)] +pub struct PlatformSpecificWindowBuilderAttributes; +#[derive(Default)] +pub struct PlatformSpecificHeadlessBuilderAttributes; diff --git a/src/platform/ios/mod.rs b/src/platform/ios/mod.rs index aeaebc3..2e6fbec 100644 --- a/src/platform/ios/mod.rs +++ b/src/platform/ios/mod.rs @@ -8,12 +8,17 @@ use ContextError; pub use api::ios::*; +#[derive(Default)] +pub struct PlatformSpecificHeadlessBuilderAttributes; + pub struct HeadlessContext(i32); impl HeadlessContext { /// See the docs in the crate root file. - pub fn new(_: (u32, u32), _: &PixelFormatRequirements, _: &GlAttributes<&HeadlessContext>) - -> Result<HeadlessContext, CreationError> { + pub fn new(_: (u32, u32), _: &PixelFormatRequirements, _: &GlAttributes<&HeadlessContext>, + _: &PlatformSpecificHeadlessBuilderAttributes) + -> Result<HeadlessContext, CreationError> + { unimplemented!() } diff --git a/src/platform/linux/api_dispatch.rs b/src/platform/linux/api_dispatch.rs index 2373770..2e135e2 100644 --- a/src/platform/linux/api_dispatch.rs +++ b/src/platform/linux/api_dispatch.rs @@ -22,6 +22,9 @@ use api::x11::XConnection; use api::x11::XError; use api::x11::XNotSupported; +#[derive(Default)] +pub struct PlatformSpecificWindowBuilderAttributes; + enum Backend { X(Arc<XConnection>), Wayland, @@ -172,7 +175,8 @@ impl<'a> Iterator for WaitEventsIterator<'a> { impl Window { #[inline] pub fn new(window: &WindowAttributes, pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&Window>) -> Result<Window, CreationError> + opengl: &GlAttributes<&Window>, _: &PlatformSpecificWindowBuilderAttributes) + -> Result<Window, CreationError> { match *BACKEND { Backend::Wayland => { diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index d010a89..9a9eb3f 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -12,13 +12,19 @@ use api::osmesa::{self, OsMesaContext}; pub use self::api_dispatch::{Window, WindowProxy, MonitorId, get_available_monitors, get_primary_monitor}; pub use self::api_dispatch::{WaitEventsIterator, PollEventsIterator}; +pub use self::api_dispatch::PlatformSpecificWindowBuilderAttributes; mod api_dispatch; +#[derive(Default)] +pub struct PlatformSpecificHeadlessBuilderAttributes; + pub struct HeadlessContext(OsMesaContext); impl HeadlessContext { pub fn new(dimensions: (u32, u32), pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&HeadlessContext>) -> Result<HeadlessContext, CreationError> + opengl: &GlAttributes<&HeadlessContext>, + _: &PlatformSpecificHeadlessBuilderAttributes) + -> Result<HeadlessContext, CreationError> { let opengl = opengl.clone().map_sharing(|c| &c.0); diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 4855765..8527da2 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -15,8 +15,11 @@ 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 = "freebsd"), not(target_os = "emscripten")))] use this_platform_is_not_supported; diff --git a/src/platform/windows/mod.rs b/src/platform/windows/mod.rs index 246ca51..0c78322 100644 --- a/src/platform/windows/mod.rs +++ b/src/platform/windows/mod.rs @@ -51,6 +51,10 @@ lazy_static! { }; } +#[derive(Default)] +pub struct PlatformSpecificWindowBuilderAttributes; +#[derive(Default)] +pub struct PlatformSpecificHeadlessBuilderAttributes; /// The Win32 implementation of the main `Window` object. pub struct Window(win32::Window); @@ -59,7 +63,8 @@ impl Window { /// See the docs in the crate root file. #[inline] pub fn new(window: &WindowAttributes, pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&Window>) -> Result<Window, CreationError> + opengl: &GlAttributes<&Window>, _: &PlatformSpecificWindowBuilderAttributes) + -> Result<Window, CreationError> { win32::Window::new(window, pf_reqs, &opengl.clone().map_sharing(|w| &w.0), EGL.as_ref().map(|w| &w.0)).map(|w| Window(w)) @@ -92,7 +97,9 @@ pub enum HeadlessContext { impl HeadlessContext { pub fn new(dimensions: (u32, u32), pf_reqs: &PixelFormatRequirements, - opengl: &GlAttributes<&HeadlessContext>) -> Result<HeadlessContext, CreationError> + opengl: &GlAttributes<&HeadlessContext>, + _: &PlatformSpecificHeadlessBuilderAttributes) + -> Result<HeadlessContext, CreationError> { // if EGL is available, we try using EGL first // if EGL returns an error, we try the hidden window method diff --git a/src/window.rs b/src/window.rs index f672ed5..6d2f0d3 100644 --- a/src/window.rs +++ b/src/window.rs @@ -31,6 +31,9 @@ pub struct WindowBuilder<'a> { // Should be made public once it's stabilized. pf_reqs: PixelFormatRequirements, + + /// Platform-specific configuration. + platform_specific: platform::PlatformSpecificWindowBuilderAttributes, } impl<'a> WindowBuilder<'a> { @@ -41,6 +44,7 @@ impl<'a> WindowBuilder<'a> { pf_reqs: Default::default(), window: Default::default(), opengl: Default::default(), + platform_specific: Default::default(), } } @@ -227,7 +231,7 @@ impl<'a> WindowBuilder<'a> { } // building - platform::Window::new(&self.window, &self.pf_reqs, &self.opengl) + platform::Window::new(&self.window, &self.pf_reqs, &self.opengl, &self.platform_specific) .map(|w| Window { window: w }) } |