From b6f74911579f1a46bfa112032b2efc38aeff1a99 Mon Sep 17 00:00:00 2001 From: Tomaka17 Date: Sat, 1 Nov 2014 09:02:01 +0100 Subject: Add visibility-related functions to window --- src/android/mod.rs | 6 ++++++ src/lib.rs | 30 ++++++++++++++++++++++++++++++ src/osx/mod.rs | 6 ++++++ src/win32/init.rs | 4 ++-- src/win32/mod.rs | 16 ++++++++++++++-- src/x11/window/mod.rs | 6 ++++++ 6 files changed, 64 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/android/mod.rs b/src/android/mod.rs index db3dd19..7198553 100644 --- a/src/android/mod.rs +++ b/src/android/mod.rs @@ -125,6 +125,12 @@ impl Window { pub fn set_title(&self, _: &str) { } + pub fn show(&self) { + } + + pub fn hide(&self) { + } + pub fn get_position(&self) -> Option<(int, int)> { None } diff --git a/src/lib.rs b/src/lib.rs index 096bae4..d8c546a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -74,6 +74,7 @@ pub struct WindowBuilder { monitor: Option, gl_version: Option<(uint, uint)>, vsync: bool, + visible: bool, } #[cfg(feature = "window")] @@ -86,6 +87,7 @@ impl WindowBuilder { monitor: None, gl_version: None, vsync: false, + visible: true, } } @@ -127,6 +129,12 @@ impl WindowBuilder { self } + /// Sets whether the window will be initially hidden or visible. + pub fn with_visibility(mut self, visible: bool) -> WindowBuilder { + self.visible = visible; + self + } + /// Builds the window. /// /// Error should be very rare and only occur in case of permission denied, incompatible system, @@ -252,6 +260,28 @@ impl Window { self.window.set_title(title) } + /// Shows the window if it was hidden. + /// + /// ## Platform-specific + /// + /// - Has no effect on Android + /// + #[inline] + pub fn show(&self) { + self.window.show() + } + + /// Hides the window if it was visible. + /// + /// ## Platform-specific + /// + /// - Has no effect on Android + /// + #[inline] + pub fn hide(&self) { + self.window.hide() + } + /// Returns the position of the top-left hand corner of the window relative to the /// top-left hand corner of the desktop. /// diff --git a/src/osx/mod.rs b/src/osx/mod.rs index 287dcb4..3e0d668 100644 --- a/src/osx/mod.rs +++ b/src/osx/mod.rs @@ -198,6 +198,12 @@ impl Window { unimplemented!() } + pub fn show(&self) { + } + + pub fn hide(&self) { + } + pub fn get_position(&self) -> Option<(int, int)> { unimplemented!() } diff --git a/src/win32/init.rs b/src/win32/init.rs index 5168cc6..bf84973 100644 --- a/src/win32/init.rs +++ b/src/win32/init.rs @@ -17,7 +17,7 @@ local_data_key!(WINDOW: (ffi::HWND, Sender)) pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: String, builder_monitor: Option, builder_gl_version: Option<(uint, uint)>, builder_vsync: bool, - builder_headless: bool) -> Result + builder_hidden: bool) -> Result { use std::mem; use std::os; @@ -237,7 +237,7 @@ pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: Strin (None, None) }; - let style = if builder_headless { + let style = if builder_hidden { style } else { style | ffi::WS_VISIBLE diff --git a/src/win32/mod.rs b/src/win32/mod.rs index 35e7169..facfb6d 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -68,8 +68,8 @@ pub struct Window { impl Window { /// See the docs in the crate root file. pub fn new(builder: WindowBuilder) -> Result { - let WindowBuilder { dimensions, title, monitor, gl_version, vsync } = builder; - init::new_window(dimensions, title, monitor, gl_version, vsync, false) + let WindowBuilder { dimensions, title, monitor, gl_version, vsync, visible } = builder; + init::new_window(dimensions, title, monitor, gl_version, vsync, !visible) } } @@ -91,6 +91,18 @@ impl Window { } } + pub fn show(&self) { + unsafe { + ffi::ShowWindow(self.window, ffi::SW_SHOW); + } + } + + pub fn hide(&self) { + unsafe { + ffi::ShowWindow(self.window, ffi::SW_HIDE); + } + } + /// See the docs in the crate root file. pub fn get_position(&self) -> Option<(int, int)> { use std::mem; diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index 26d5497..2d26cbd 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -295,6 +295,12 @@ impl Window { } } + pub fn show(&self) { + } + + pub fn hide(&self) { + } + fn get_geometry(&self) -> Option<(int, int, uint, uint)> { unsafe { use std::mem; -- cgit v1.2.3 From 9dd592600ac91f7fe00a6e2af6651755b38f57a7 Mon Sep 17 00:00:00 2001 From: David Partouche Date: Tue, 4 Nov 2014 18:03:38 +0100 Subject: Retrieve the monitors and their info for osx --- Cargo.toml | 6 ++++++ src/lib.rs | 2 ++ src/osx/mod.rs | 23 +++-------------------- src/osx/monitor.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 src/osx/monitor.rs (limited to 'src') diff --git a/Cargo.toml b/Cargo.toml index 4cae79d..7157229 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,3 +29,9 @@ git = "https://github.com/servo/rust-core-foundation" [target.x86_64-apple-darwin.dependencies.core_foundation] git = "https://github.com/servo/rust-core-foundation" + +[target.i686-apple-darwin.dependencies.core_graphics] +git = "https://github.com/servo/rust-core-graphics" + +[target.x86_64-apple-darwin.dependencies.core_graphics] +git = "https://github.com/servo/rust-core-graphics" diff --git a/src/lib.rs b/src/lib.rs index d8c546a..f1f8d5a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,6 +37,8 @@ extern crate libc; extern crate cocoa; #[cfg(target_os = "macos")] extern crate core_foundation; +#[cfg(target_os = "macos")] +extern crate core_graphics; #[cfg(target_os = "linux")] extern crate sync; diff --git a/src/osx/mod.rs b/src/osx/mod.rs index 3e0d668..3dda56a 100644 --- a/src/osx/mod.rs +++ b/src/osx/mod.rs @@ -22,6 +22,9 @@ use {MouseInput, Pressed, Released, LeftMouseButton, RightMouseButton, MouseMove use events; +pub use self::monitor::{MonitorID, get_available_monitors, get_primary_monitor}; + +mod monitor; mod event; static mut shift_pressed: bool = false; @@ -43,26 +46,6 @@ impl Deref for HeadlessContext { } } -pub struct MonitorID; - -pub fn get_available_monitors() -> Vec { - unimplemented!() -} - -pub fn get_primary_monitor() -> MonitorID { - unimplemented!() -} - -impl MonitorID { - pub fn get_name(&self) -> Option { - unimplemented!() - } - - pub fn get_dimensions(&self) -> (uint, uint) { - unimplemented!() - } -} - #[cfg(feature = "window")] impl Window { pub fn new(builder: WindowBuilder) -> Result { diff --git a/src/osx/monitor.rs b/src/osx/monitor.rs new file mode 100644 index 0000000..383fd32 --- /dev/null +++ b/src/osx/monitor.rs @@ -0,0 +1,46 @@ +use core_graphics::display; + +pub struct MonitorID(u32); + +pub fn get_available_monitors() -> Vec { + let mut monitors = Vec::new(); + unsafe { + let max_displays = 10u32; + let mut active_displays = [0u32, ..10]; + let mut display_count = 0; + display::CGGetActiveDisplayList(max_displays, + &mut active_displays[0], + &mut display_count); + for i in range(0u, display_count as uint) { + monitors.push(MonitorID(active_displays[i])); + } + } + monitors +} + +pub fn get_primary_monitor() -> MonitorID { + let id = unsafe { + MonitorID(display::CGMainDisplayID()) + }; + id +} + +impl MonitorID { + pub fn get_name(&self) -> Option { + let MonitorID(display_id) = *self; + let screen_num = unsafe { + display::CGDisplayModelNumber(display_id) + }; + Some(format!("Monitor #{}", screen_num)) + } + + pub fn get_dimensions(&self) -> (uint, uint) { + let MonitorID(display_id) = *self; + let dimension = unsafe { + let height = display::CGDisplayPixelsHigh(display_id); + let width = display::CGDisplayPixelsWide(display_id); + (width as uint, height as uint) + }; + dimension + } +} -- cgit v1.2.3