From fd5e77f23e18c131fe2ae20ec3aad10394a7dbc0 Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Fri, 19 Dec 2014 11:27:03 +1000 Subject: Add missing get_api stubs. Add hidpi_factor() support for retina displays. Fix Resize and MouseMoved events to handle retina displays. Fix inverted y position for MouseMoved events on mac. Fix initial painting on retina display. --- src/android/mod.rs | 8 ++++++++ src/lib.rs | 7 +++++++ src/osx/headless.rs | 4 ++++ src/osx/mod.rs | 25 ++++++++++++++++++++++--- src/win32/mod.rs | 4 ++++ src/x11/window/mod.rs | 4 ++++ 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/android/mod.rs b/src/android/mod.rs index 6987f52..62714dc 100644 --- a/src/android/mod.rs +++ b/src/android/mod.rs @@ -63,6 +63,10 @@ impl HeadlessContext { pub fn get_proc_address(&self, _addr: &str) -> *const () { unimplemented!() } + + pub fn get_api(&self) -> ::Api { + ::Api::OpenGl + } } #[cfg(feature = "headless")] @@ -284,6 +288,10 @@ impl Window { pub fn set_cursor(&self, _: MouseCursor) { } + + pub fn hidpi_factor(&self) -> f32 { + 1.0 + } } unsafe impl Send for Window {} diff --git a/src/lib.rs b/src/lib.rs index 12a908c..fb551c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -621,6 +621,13 @@ impl Window { pub fn set_cursor(&self, cursor: MouseCursor) { self.window.set_cursor(cursor); } + + /// Returns the ratio between the backing framebuffer resolution and the + /// window size in screen pixels. This is typically one for a normal display + /// and two for a retina display. + pub fn hidpi_factor(&self) -> f32 { + self.window.hidpi_factor() + } } #[cfg(feature = "window")] diff --git a/src/osx/headless.rs b/src/osx/headless.rs index ab3c341..3981058 100644 --- a/src/osx/headless.rs +++ b/src/osx/headless.rs @@ -97,6 +97,10 @@ impl HeadlessContext { }; symbol as *const () } + + pub fn get_api(&self) -> ::Api { + ::Api::OpenGl + } } unsafe impl Send for HeadlessContext {} diff --git a/src/osx/mod.rs b/src/osx/mod.rs index 58b6176..b338184 100644 --- a/src/osx/mod.rs +++ b/src/osx/mod.rs @@ -51,6 +51,7 @@ struct DelegateState<'a> { is_closed: bool, context: id, view: id, + window: id, handler: Option, } @@ -117,7 +118,8 @@ extern fn window_did_resize(this: id, _: id) -> id { match state.handler { Some(handler) => { let rect = NSView::frame(state.view); - (handler)(rect.size.width as u32, rect.size.height as u32); + let scale_factor = state.window.backingScaleFactor() as f32; + (handler)((scale_factor * rect.size.width as f32) as u32, (scale_factor * rect.size.height as f32) as u32); } None => {} } @@ -360,6 +362,7 @@ impl Window { let mut ds = DelegateState { is_closed: self.is_closed.get(), context: self.context, + window: self.window, view: self.view, handler: self.resize, }; @@ -380,8 +383,17 @@ impl Window { NSRightMouseUp => { events.push_back(MouseInput(Released, RightMouseButton)); }, NSMouseMoved => { let window_point = event.locationInWindow(); - let view_point = self.view.convertPoint_fromView_(window_point, nil); - events.push_back(MouseMoved((view_point.x as i32, view_point.y as i32))); + let window: id = msg_send()(event, selector("window")); + let view_point = if window == 0 { + let window_rect = self.window.convertRectFromScreen_(NSRect::new(window_point, NSSize::new(0.0, 0.0))); + self.view.convertPoint_fromView_(window_rect.origin, nil) + } else { + self.view.convertPoint_fromView_(window_point, nil) + }; + let view_rect = NSView::frame(self.view); + let scale_factor = self.hidpi_factor(); + events.push_back(MouseMoved(((scale_factor * view_point.x as f32) as i32, + (scale_factor * (view_rect.size.height - view_point.y) as f32) as i32))); }, NSKeyDown => { let received_c_str = event.characters().UTF8String(); @@ -461,6 +473,7 @@ impl Window { } pub unsafe fn make_current(&self) { + let _: id = msg_send()(self.context, selector("update")); self.context.makeCurrentContext(); } @@ -495,4 +508,10 @@ impl Window { pub fn set_cursor(&self, cursor: MouseCursor) { unimplemented!() } + + pub fn hidpi_factor(&self) -> f32 { + unsafe { + self.window.backingScaleFactor() as f32 + } + } } diff --git a/src/win32/mod.rs b/src/win32/mod.rs index e6964b4..984278a 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -289,6 +289,10 @@ impl Window { pub fn set_cursor(&self, cursor: MouseCursor) { unimplemented!() } + + pub fn hidpi_factor(&self) -> f32 { + 1.0 + } } #[unsafe_destructor] diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index 5b70a19..0f74dfe 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -658,4 +658,8 @@ impl Window { ffi::XFlush(self.x.display); } } + + pub fn hidpi_factor(&self) -> f32 { + 1.0 + } } -- cgit v1.2.3