aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Watson <gw@intuitionlibrary.com>2014-12-19 11:27:03 +1000
committerGlenn Watson <gw@intuitionlibrary.com>2015-01-19 11:54:11 +1000
commitfd5e77f23e18c131fe2ae20ec3aad10394a7dbc0 (patch)
treef9dd861298b762039d715730d89bdd178d5e50da
parentbcda3631887cf84f09f418946c462211cd7a540c (diff)
downloadglutin-fd5e77f23e18c131fe2ae20ec3aad10394a7dbc0.tar.gz
glutin-fd5e77f23e18c131fe2ae20ec3aad10394a7dbc0.zip
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.
-rw-r--r--src/android/mod.rs8
-rw-r--r--src/lib.rs7
-rw-r--r--src/osx/headless.rs4
-rw-r--r--src/osx/mod.rs25
-rw-r--r--src/win32/mod.rs4
-rw-r--r--src/x11/window/mod.rs4
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<fn(u32, u32)>,
}
@@ -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
+ }
}