diff --git a/src/events.rs b/src/events.rs new file mode 100644 index 00000000..f66e6a27 --- /dev/null +++ b/src/events.rs @@ -0,0 +1,33 @@ + +#[deriving(Clone,Show)] +pub enum Event { + /// The position of the window has changed. + PositionChanged(uint, uint), + + /// The size of the window has changed. + SizeChanged(uint, uint), + + /// The window has been closed. + Closed, + + /// The cursor has moved on the window. + /// + /// The parameter are the (x,y) coords in pixels relative to the top-left corner of the window. + CursorPositionChanged(uint, uint), + + /// The window gained or lost focus. + /// + /// The parameter is true if the window has gained focus, and false if it has lost focus. + Focused(bool), + + /// The window has been turned into an icon or restored. + /// + /// The parameter is true if the window has been iconified, and false if it has been restored. + Iconified(bool), + + /// The system asked that the content of this window must be redrawn. + NeedRefresh, + + /// The size of the framebuffer of the window has changed. + FramebufferSizeChanged(uint, uint), +} diff --git a/src/hints.rs b/src/hints.rs new file mode 100644 index 00000000..530fdc9a --- /dev/null +++ b/src/hints.rs @@ -0,0 +1,73 @@ +use std::default::Default; + +#[deriving(Clone,Show)] +pub struct Hints { + pub resizable: bool, + pub visible: bool, + pub decorated: bool, + pub red_bits: u8, + pub green_bits: u8, + pub blue_bits: u8, + pub alpha_bits: u8, + pub depth_bits: u8, + pub stencil_bits: u8, + pub accum_red_bits: u8, + pub accum_green_bits: u8, + pub accum_blue_bits: u8, + pub accum_alpha_bits: u8, + pub aux_buffers: u8, + pub samples: u8, + pub refresh_rate: u8, + pub stereo: bool, + pub srgb_capable: bool, + pub client_api: ClientAPI, + pub context_version: (u8, u8), + //pub robustness: , + pub opengl_forward_compat: bool, + pub opengl_debug_context: bool, + pub opengl_profile: Profile, +} + +#[deriving(Clone, Show)] +pub enum ClientAPI { + OpenGL, + OpenGLES, +} + +#[deriving(Clone, Show)] +pub enum Profile { + AnyProfile, + CompatProfile, + CoreProfile, +} + +impl Default for Hints { + fn default() -> Hints { + Hints { + resizable: true, + visible: true, + decorated: true, + red_bits: 8, + green_bits: 8, + blue_bits: 8, + alpha_bits: 8, + depth_bits: 24, + stencil_bits: 8, + accum_red_bits: 0, + accum_green_bits: 0, + accum_blue_bits: 0, + accum_alpha_bits: 0, + aux_buffers: 0, + samples: 0, + refresh_rate: 0, + stereo: false, + srgb_capable: false, + client_api: OpenGL, + context_version: (1, 0), + //robustness: , + opengl_forward_compat: false, + opengl_debug_context: false, + opengl_profile: AnyProfile, + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 2efe0af3..bffdb6d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,113 +2,88 @@ extern crate libc; +pub use events::{Event, PositionChanged, SizeChanged, Closed, CursorPositionChanged, Focused}; +pub use events::{Iconified, NeedRefresh, FramebufferSizeChanged}; +pub use hints::{Hints, ClientAPI, Profile}; + #[cfg(windows)] -pub use win32::Window; +use winimpl = win32; #[cfg(windows)] mod win32; -#[deriving(Clone,Show)] -pub enum Event { - /// The position of the window has changed. - PositionChanged(uint, uint), +mod events; +mod hints; - /// The size of the window has changed. - SizeChanged(uint, uint), - - /// The window has been closed. - Closed, - - /// The cursor has moved on the window. - /// - /// The parameter are the (x,y) coords in pixels relative to the top-left corner of the window. - CursorPositionChanged(uint, uint), - - /// The window gained or lost focus. - /// - /// The parameter is true if the window has gained focus, and false if it has lost focus. - Focused(bool), - - /// The window has been turned into an icon or restored. - /// - /// The parameter is true if the window has been iconified, and false if it has been restored. - Iconified(bool), - - /// The system asked that the content of this window must be redrawn. - NeedRefresh, - - /// The size of the framebuffer of the window has changed. - FramebufferSizeChanged(uint, uint), +pub struct Window { + window: winimpl::Window } -#[deriving(Clone,Show)] -pub struct Hints { - pub resizable: bool, - pub visible: bool, - pub decorated: bool, - pub red_bits: u8, - pub green_bits: u8, - pub blue_bits: u8, - pub alpha_bits: u8, - pub depth_bits: u8, - pub stencil_bits: u8, - pub accum_red_bits: u8, - pub accum_green_bits: u8, - pub accum_blue_bits: u8, - pub accum_alpha_bits: u8, - pub aux_buffers: u8, - pub samples: u8, - pub refresh_rate: u8, - pub stereo: bool, - pub srgb_capable: bool, - pub client_api: ClientAPI, - pub context_version: (u8, u8), - //pub robustness: , - pub opengl_forward_compat: bool, - pub opengl_debug_context: bool, - pub opengl_profile: Profile, -} +impl Window { + #[inline] + pub fn new(dimensions: Option<(uint, uint)>, title: &str, hints: &Hints) + -> Result + { + let win = try!(winimpl::Window::new(dimensions, title, hints)); + Ok(Window{window: win}) + } -#[deriving(Clone, Show)] -pub enum ClientAPI { - OpenGL, - OpenGLES, -} + /// Returns true if the window has been closed by the user. + #[inline] + pub fn should_close(&self) -> bool { + self.window.should_close() + } -#[deriving(Clone, Show)] -pub enum Profile { - AnyProfile, - CompatProfile, - CoreProfile, -} + /// Modifies the title of the window. + #[inline] + pub fn set_title(&self, title: &str) { + self.window.set_title(title) + } -impl std::default::Default for Hints { - fn default() -> Hints { - Hints { - resizable: true, - visible: true, - decorated: true, - red_bits: 8, - green_bits: 8, - blue_bits: 8, - alpha_bits: 8, - depth_bits: 24, - stencil_bits: 8, - accum_red_bits: 0, - accum_green_bits: 0, - accum_blue_bits: 0, - accum_alpha_bits: 0, - aux_buffers: 0, - samples: 0, - refresh_rate: 0, - stereo: false, - srgb_capable: false, - client_api: OpenGL, - context_version: (1, 0), - //robustness: , - opengl_forward_compat: false, - opengl_debug_context: false, - opengl_profile: AnyProfile, - } + #[inline] + pub fn get_position(&self) -> (uint, uint) { + self.window.get_position() + } + + #[inline] + pub fn set_position(&self, x: uint, y: uint) { + self.window.set_position(x, y) + } + + #[inline] + pub fn get_size(&self) -> (uint, uint) { + self.window.get_size() + } + + #[inline] + pub fn set_size(&self, x: uint, y: uint) { + self.window.set_size(x, y) + } + + // TODO: return iterator + #[inline] + pub fn poll_events(&self) -> Vec { + self.window.poll_events() + } + + // TODO: return iterator + #[inline] + pub fn wait_events(&self) -> Vec { + self.window.wait_events() + } + + #[inline] + pub fn make_current(&self) { + self.window.make_current() + } + + #[inline] + pub fn get_proc_address(&self, addr: &str) -> *const () { + self.window.get_proc_address(addr) + } + + #[inline] + pub fn swap_buffers(&self) { + self.window.swap_buffers() } }