mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-24 22:31:30 +11:00
Merge branch 'master' of https://github.com/tomaka/gl-init-rs
This commit is contained in:
commit
76ebf39bcd
|
@ -1 +1,5 @@
|
||||||
language: rust
|
language: rust
|
||||||
|
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
|
|
@ -19,8 +19,6 @@ extern crate libc;
|
||||||
extern crate gl;
|
extern crate gl;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
use std::default::Default;
|
|
||||||
|
|
||||||
let window = init::Window::new().unwrap();
|
let window = init::Window::new().unwrap();
|
||||||
|
|
||||||
unsafe { window.make_current() };
|
unsafe { window.make_current() };
|
||||||
|
@ -29,7 +27,7 @@ fn main() {
|
||||||
|
|
||||||
gl::ClearColor(0.0, 1.0, 0.0, 1.0);
|
gl::ClearColor(0.0, 1.0, 0.0, 1.0);
|
||||||
|
|
||||||
while !window.should_close() {
|
while !window.is_closed() {
|
||||||
window.wait_events();
|
window.wait_events();
|
||||||
|
|
||||||
gl::Clear(gl::COLOR_BUFFER_BIT);
|
gl::Clear(gl::COLOR_BUFFER_BIT);
|
||||||
|
|
|
@ -38,13 +38,17 @@ fn main() {
|
||||||
|
|
||||||
println!("OpenGL version {}", version.as_str().unwrap());
|
println!("OpenGL version {}", version.as_str().unwrap());
|
||||||
|
|
||||||
|
{
|
||||||
|
let win_size = window.get_inner_size().unwrap();
|
||||||
|
gl::Viewport(0, 0, win_size.val0() as libc::c_int, win_size.val1() as libc::c_int);
|
||||||
|
}
|
||||||
|
|
||||||
gl::ClearColor(0.0, 1.0, 0.0, 1.0);
|
gl::ClearColor(0.0, 1.0, 0.0, 1.0);
|
||||||
|
|
||||||
while !window.is_closed() {
|
while !window.is_closed() {
|
||||||
println!("{}", window.wait_events().collect::<Vec<init::Event>>());
|
|
||||||
|
|
||||||
gl::Clear(gl::COLOR_BUFFER_BIT);
|
gl::Clear(gl::COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
window.swap_buffers();
|
window.swap_buffers();
|
||||||
|
|
||||||
|
println!("{}", window.wait_events().collect::<Vec<init::Event>>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
36
examples/multiwindow.rs
Normal file
36
examples/multiwindow.rs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
extern crate init = "gl-init-rs";
|
||||||
|
extern crate libc;
|
||||||
|
extern crate gl;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let window1 = init::Window::new().unwrap();
|
||||||
|
let window2 = init::Window::new().unwrap();
|
||||||
|
|
||||||
|
spawn(proc() {
|
||||||
|
run(window1, (0.0, 1.0, 0.0, 1.0));
|
||||||
|
});
|
||||||
|
|
||||||
|
spawn(proc() {
|
||||||
|
run(window2, (0.0, 0.0, 1.0, 1.0));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run(window: init::Window, color: (f32, f32, f32, f32)) {
|
||||||
|
unsafe { window.make_current() };
|
||||||
|
|
||||||
|
gl::load_with(|symbol| window.get_proc_address(symbol) as *const libc::c_void);
|
||||||
|
|
||||||
|
{
|
||||||
|
let win_size = window.get_inner_size().unwrap();
|
||||||
|
gl::Viewport(0, 0, win_size.val0() as libc::c_int, win_size.val1() as libc::c_int);
|
||||||
|
}
|
||||||
|
|
||||||
|
gl::ClearColor(color.val0(), color.val1(), color.val2(), color.val3());
|
||||||
|
|
||||||
|
while !window.is_closed() {
|
||||||
|
gl::Clear(gl::COLOR_BUFFER_BIT);
|
||||||
|
window.swap_buffers();
|
||||||
|
|
||||||
|
window.wait_events().collect::<Vec<init::Event>>();
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,13 +16,17 @@ fn main() {
|
||||||
|
|
||||||
println!("OpenGL version {}", version.as_str().unwrap());
|
println!("OpenGL version {}", version.as_str().unwrap());
|
||||||
|
|
||||||
|
{
|
||||||
|
let win_size = window.get_inner_size().unwrap();
|
||||||
|
gl::Viewport(0, 0, win_size.val0() as libc::c_int, win_size.val1() as libc::c_int);
|
||||||
|
}
|
||||||
|
|
||||||
gl::ClearColor(0.0, 1.0, 0.0, 1.0);
|
gl::ClearColor(0.0, 1.0, 0.0, 1.0);
|
||||||
|
|
||||||
while !window.is_closed() {
|
while !window.is_closed() {
|
||||||
println!("{}", window.wait_events().collect::<Vec<init::Event>>());
|
|
||||||
|
|
||||||
gl::Clear(gl::COLOR_BUFFER_BIT);
|
gl::Clear(gl::COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
window.swap_buffers();
|
window.swap_buffers();
|
||||||
|
|
||||||
|
println!("{}", window.wait_events().collect::<Vec<init::Event>>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
31
src/lib.rs
31
src/lib.rs
|
@ -2,25 +2,48 @@
|
||||||
#![feature(globs)]
|
#![feature(globs)]
|
||||||
#![unstable]
|
#![unstable]
|
||||||
|
|
||||||
|
//! The purpose of this library is to provide an OpenGL context on as many
|
||||||
|
//! platforms as possible.
|
||||||
|
//!
|
||||||
|
//! # Building a window
|
||||||
|
//!
|
||||||
|
//! There are two ways to create a window:
|
||||||
|
//!
|
||||||
|
//! - Calling `Window::new()`.
|
||||||
|
//! - Calling `let builder = WindowBuilder::new()` then `builder.build()`.
|
||||||
|
//!
|
||||||
|
//! The first way is the simpliest way and will give you default values.
|
||||||
|
//!
|
||||||
|
//! The second way allows you to customize the way your window and GL context
|
||||||
|
//! will look and behave.
|
||||||
|
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
|
||||||
pub use events::*;
|
pub use events::*;
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
use winimpl = win32;
|
use winimpl = win32;
|
||||||
#[cfg(unix)]
|
#[cfg(target_os = "linux")]
|
||||||
use winimpl = x11;
|
use winimpl = x11;
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
use winimpl = osx;
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(target_os = "win32")]
|
||||||
mod win32;
|
mod win32;
|
||||||
#[cfg(unix)]
|
#[cfg(target_os = "linux")]
|
||||||
mod x11;
|
mod x11;
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
mod osx;
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
//mod egl;
|
//mod egl;
|
||||||
|
|
||||||
mod events;
|
mod events;
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "win32"), not(target_os = "linux"), not(target_os = "macos"))]
|
||||||
|
#[static_assert]
|
||||||
|
static this_platform_is_not_supposed: bool = false;
|
||||||
|
|
||||||
/// Identifier for a monitor.
|
/// Identifier for a monitor.
|
||||||
pub struct MonitorID(winimpl::MonitorID);
|
pub struct MonitorID(winimpl::MonitorID);
|
||||||
|
|
||||||
|
@ -99,7 +122,7 @@ impl WindowBuilder {
|
||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```ignore
|
||||||
/// let window = Window::new().unwrap();
|
/// let window = Window::new().unwrap();
|
||||||
///
|
///
|
||||||
/// unsafe { window.make_current() };
|
/// unsafe { window.make_current() };
|
||||||
|
|
79
src/osx/mod.rs
Normal file
79
src/osx/mod.rs
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
//! Dummy implementation for OS/X to make gl-init-rs compile on this platform
|
||||||
|
|
||||||
|
use {Event, WindowBuilder};
|
||||||
|
|
||||||
|
pub struct Window;
|
||||||
|
|
||||||
|
pub struct MonitorID;
|
||||||
|
|
||||||
|
pub fn get_available_monitors() -> Vec<MonitorID> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_primary_monitor() -> MonitorID {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MonitorID {
|
||||||
|
pub fn get_name(&self) -> Option<String> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_dimensions(&self) -> (uint, uint) {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Window {
|
||||||
|
pub fn new(_builder: WindowBuilder) -> Result<Window, String> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_closed(&self) -> bool {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_title(&self, _title: &str) {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_position(&self) -> Option<(int, int)> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_position(&self, _x: uint, _y: uint) {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_inner_size(&self) -> Option<(uint, uint)> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_outer_size(&self) -> Option<(uint, uint)> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_inner_size(&self, _x: uint, _y: uint) {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn poll_events(&self) -> Vec<Event> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn wait_events(&self) -> Vec<Event> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub unsafe fn make_current(&self) {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_proc_address(&self, _addr: &str) -> *const () {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn swap_buffers(&self) {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
|
@ -133,6 +133,7 @@ impl Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if one of the received events is `Closed`, setting `is_closed` to true
|
||||||
if events.iter().find(|e| match e { &&::Closed => true, _ => false }).is_some() {
|
if events.iter().find(|e| match e { &&::Closed => true, _ => false }).is_some() {
|
||||||
use std::sync::atomics::Relaxed;
|
use std::sync::atomics::Relaxed;
|
||||||
self.is_closed.store(true, Relaxed);
|
self.is_closed.store(true, Relaxed);
|
||||||
|
@ -146,10 +147,21 @@ impl Window {
|
||||||
pub fn wait_events(&self) -> Vec<Event> {
|
pub fn wait_events(&self) -> Vec<Event> {
|
||||||
match self.events_receiver.recv_opt() {
|
match self.events_receiver.recv_opt() {
|
||||||
Ok(ev) => {
|
Ok(ev) => {
|
||||||
|
// if the received event is `Closed`, setting `is_closed` to true
|
||||||
|
match ev {
|
||||||
|
::Closed => {
|
||||||
|
use std::sync::atomics::Relaxed;
|
||||||
|
self.is_closed.store(true, Relaxed);
|
||||||
|
},
|
||||||
|
_ => ()
|
||||||
|
};
|
||||||
|
|
||||||
|
// looing for other possible events in the queue
|
||||||
let mut result = self.poll_events();
|
let mut result = self.poll_events();
|
||||||
result.insert(0, ev);
|
result.insert(0, ev);
|
||||||
result
|
result
|
||||||
},
|
},
|
||||||
|
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
use std::sync::atomics::Relaxed;
|
use std::sync::atomics::Relaxed;
|
||||||
self.is_closed.store(true, Relaxed);
|
self.is_closed.store(true, Relaxed);
|
||||||
|
@ -187,6 +199,9 @@ impl Window {
|
||||||
#[unsafe_destructor]
|
#[unsafe_destructor]
|
||||||
impl Drop for Window {
|
impl Drop for Window {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
|
use std::ptr;
|
||||||
|
unsafe { ffi::wglMakeCurrent(ptr::mut_null(), ptr::mut_null()); }
|
||||||
|
unsafe { ffi::wglDeleteContext(self.context); }
|
||||||
unsafe { ffi::DestroyWindow(self.window); }
|
unsafe { ffi::DestroyWindow(self.window); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue