diff options
| -rw-r--r-- | src/android/mod.rs | 8 | ||||
| -rw-r--r-- | src/lib.rs | 7 | ||||
| -rw-r--r-- | src/osx/headless.rs | 4 | ||||
| -rw-r--r-- | src/osx/mod.rs | 25 | ||||
| -rw-r--r-- | src/win32/mod.rs | 4 | ||||
| -rw-r--r-- | 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..bde2417 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::OpenGlEs +    }  }  #[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 {} @@ -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 +    }  } | 
