Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unlocks platform-specific attributes #702

Merged
merged 1 commit into from
Feb 10, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions src/api/android/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ impl MonitorId {
}
}

#[derive(Default)]
pub struct PlatformSpecificWindowBuilderAttributes;
#[derive(Default)]
pub struct PlatformSpecificHeadlessBuilderAttributes;

pub struct PollEventsIterator<'a> {
window: &'a Window,
}
Expand Down Expand Up @@ -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};

Expand Down Expand Up @@ -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,
Expand Down
7 changes: 6 additions & 1 deletion src/api/cocoa/headless.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 {

Expand Down
10 changes: 7 additions & 3 deletions src/api/cocoa/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
#![cfg(target_os = "macos")]

pub use self::headless::HeadlessContext;

use {CreationError, Event, MouseCursor, CursorState};
use CreationError::OsError;
use libc;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -179,6 +179,9 @@ impl Drop for WindowDelegate {
}
}

#[derive(Default)]
pub struct PlatformSpecificWindowBuilderAttributes;

pub struct Window {
view: IdRef,
window: IdRef,
Expand Down Expand Up @@ -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!()
Expand Down
6 changes: 5 additions & 1 deletion src/api/ios/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
7 changes: 6 additions & 1 deletion src/headless.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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> {
Expand All @@ -30,6 +33,7 @@ impl<'a> HeadlessRendererBuilder<'a> {
dimensions: (width, height),
pf_reqs: Default::default(),
opengl: Default::default(),
platform_specific: Default::default(),
}
}

Expand Down Expand Up @@ -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 })
}

Expand Down
11 changes: 10 additions & 1 deletion src/os/unix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
///
Expand Down Expand Up @@ -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> {
}
11 changes: 10 additions & 1 deletion src/os/windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
///
Expand All @@ -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> {
}
5 changes: 5 additions & 0 deletions src/platform/emscripten/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,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;
9 changes: 7 additions & 2 deletions src/platform/ios/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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!()
}

Expand Down
6 changes: 5 additions & 1 deletion src/platform/linux/api_dispatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 => {
Expand Down
8 changes: 7 additions & 1 deletion src/platform/linux/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
11 changes: 9 additions & 2 deletions src/platform/windows/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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))
Expand Down Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion src/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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> {
Expand All @@ -41,6 +44,7 @@ impl<'a> WindowBuilder<'a> {
pf_reqs: Default::default(),
window: Default::default(),
opengl: Default::default(),
platform_specific: Default::default(),
}
}

Expand Down Expand Up @@ -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 })
}

Expand Down