diff options
author | Tomaka17 <pierre.krieger1708@gmail.com> | 2014-07-31 09:56:53 +0200 |
---|---|---|
committer | Tomaka17 <pierre.krieger1708@gmail.com> | 2014-07-31 10:02:01 +0200 |
commit | db8955a9d85d7e44e63dd3fd7634230bc1aed635 (patch) | |
tree | 43c376d6b61fc824a2b8f678e7137f245bda16e3 | |
parent | 8911e162ce526dd8025b7740fd643041d5624a54 (diff) | |
download | glutin-db8955a9d85d7e44e63dd3fd7634230bc1aed635.tar.gz glutin-db8955a9d85d7e44e63dd3fd7634230bc1aed635.zip |
Add API for monitors
-rw-r--r-- | examples/fullscreen.rs | 48 | ||||
-rw-r--r-- | src/lib.rs | 31 | ||||
-rw-r--r-- | src/win32/mod.rs | 8 | ||||
-rw-r--r-- | src/x11/mod.rs | 8 |
4 files changed, 95 insertions, 0 deletions
diff --git a/examples/fullscreen.rs b/examples/fullscreen.rs new file mode 100644 index 0000000..cfbc35c --- /dev/null +++ b/examples/fullscreen.rs @@ -0,0 +1,48 @@ +extern crate init = "gl-init-rs"; +extern crate libc; +extern crate gl; + +use std::io::stdio::stdin; + +fn main() { + use std::default::Default; + + // enumerating monitors + let monitor = { + for (num, monitor) in init::get_available_monitors().enumerate() { + println!("Monitor #{}: {}", num, monitor.get_name()); + } + + print!("Please write the number of the monitor to use: "); + let num = from_str(stdin().read_line().unwrap().as_slice()).unwrap(); + let monitor = init::get_available_monitors().nth(num).unwrap(); + + println!("Using {}", monitor.get_name()); + + monitor + }; + + let window = init::Window::new(None, "Hello world!", &Default::default(), + Some(monitor)).unwrap(); + + unsafe { window.make_current() }; + + gl::load_with(|symbol| window.get_proc_address(symbol) as *const libc::c_void); + + let version = { + use std::c_str::CString; + unsafe { CString::new(gl::GetString(gl::VERSION) as *const i8, false) } + }; + + println!("OpenGL version {}", version.as_str().unwrap()); + + gl::ClearColor(0.0, 1.0, 0.0, 1.0); + + while !window.is_closed() { + println!("{}", window.wait_events()); + + gl::Clear(gl::COLOR_BUFFER_BIT); + + window.swap_buffers(); + } +} @@ -230,3 +230,34 @@ impl Window { self.window.swap_buffers() } } + +/// An iterator for the list of available monitors. +// Implementation note: we retreive the list once, then serve each element by one by one. +// This may change in the future. +pub struct AvailableMonitorsIter { + data: Vec<winimpl::MonitorID>, +} + +impl Iterator<MonitorID> for AvailableMonitorsIter { + fn next(&mut self) -> Option<MonitorID> { + self.data.remove(0).map(|id| MonitorID(id)) + } +} + +/// Returns the list of all available monitors. +pub fn get_available_monitors() -> AvailableMonitorsIter { + let data = winimpl::get_available_monitors(); + AvailableMonitorsIter{ data: data } +} + +/// Returns the primary monitor of the system. +pub fn get_primary_monitor() -> MonitorID { + MonitorID(winimpl::get_primary_monitor()) +} + +impl MonitorID { + /// Returns a human-readable name of the monitor. + pub fn get_name(&self) -> Option<String> { + Some("<Unknown>".to_string()) + } +} diff --git a/src/win32/mod.rs b/src/win32/mod.rs index a5df94c..232f0e5 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -19,6 +19,14 @@ pub struct Window { pub struct MonitorID(uint); +pub fn get_available_monitors() -> Vec<MonitorID> { + unimplemented!() +} + +pub fn get_primary_monitor() -> MonitorID { + unimplemented!() +} + /// Stores the list of all the windows. /// Only available on callback thread. local_data_key!(pub WINDOWS_LIST: Mutex<Vec<(ffi::HWND, Sender<Event>)>>) diff --git a/src/x11/mod.rs b/src/x11/mod.rs index e00dc50..9d08d4a 100644 --- a/src/x11/mod.rs +++ b/src/x11/mod.rs @@ -16,6 +16,14 @@ pub struct Window { pub struct MonitorID(uint); +pub fn get_available_monitors() -> Vec<MonitorID> { + unimplemented!() +} + +pub fn get_primary_monitor() -> MonitorID { + unimplemented!() +} + impl Window { pub fn new(dimensions: Option<(uint, uint)>, title: &str, hints: &Hints, _: Option<MonitorID>) -> Result<Window, String> |