diff --git a/examples/support/mod.rs b/examples/support/mod.rs index ab9afca..29cd5fe 100644 --- a/examples/support/mod.rs +++ b/examples/support/mod.rs @@ -56,10 +56,15 @@ impl Support { } } - pub fn update_mouse(&mut self, hidpi_factor: f32) { - self.imgui.set_mouse_pos(self.mouse_pos.0 as f32 / hidpi_factor, self.mouse_pos.1 as f32 / hidpi_factor); + pub fn update_hidpi_factor(&mut self) { + let hidpi_factor = self.display.get_window().expect("Failed to get window").hidpi_factor(); + self.imgui.set_hidpi_factor(hidpi_factor); + } + + pub fn update_mouse(&mut self) { + self.imgui.set_mouse_pos(self.mouse_pos.0 as f32, self.mouse_pos.1 as f32); self.imgui.set_mouse_down(&[self.mouse_pressed.0, self.mouse_pressed.1, self.mouse_pressed.2, false, false]); - self.imgui.set_mouse_wheel(self.mouse_wheel / hidpi_factor); + self.imgui.set_mouse_wheel(self.mouse_wheel); } pub fn render<'ui, 'a: 'ui , F: FnMut(&Ui<'ui>)>( @@ -69,12 +74,8 @@ impl Support { let delta_f = delta.num_nanoseconds().unwrap() as f32 / 1_000_000_000.0; self.last_frame = now; - let hidpi_factor = - self.display.get_window() - .expect("Failed to get window") - .hidpi_factor(); - - self.update_mouse(hidpi_factor); + self.update_hidpi_factor(); + self.update_mouse(); self.mouse_wheel = 0.0; let mut target = self.display.draw(); @@ -82,7 +83,7 @@ impl Support { clear_color.2, clear_color.3); let (width, height) = target.get_dimensions(); - let ui = self.imgui.frame(width, height, hidpi_factor, delta_f); + let ui = self.imgui.frame(width, height, delta_f); f(&ui); self.renderer.render(&mut target, ui).unwrap(); diff --git a/src/lib.rs b/src/lib.rs index 99d2629..986b979 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,6 +68,8 @@ pub struct ImGui { // lives long enough in case the ImStr contains a Cow::Owned ini_filename: Option>, log_filename: Option>, + // Ideally this would be handled by imgui, but for now we have to keep track of it ourselves + hidpi_factor: f32, } #[macro_export] @@ -126,6 +128,7 @@ impl ImGui { ImGui { ini_filename: None, log_filename: None, + hidpi_factor: 1.0, } } fn io(&self) -> &imgui_sys::ImGuiIO { unsafe { mem::transmute(imgui_sys::igGetIO()) } } @@ -206,14 +209,18 @@ impl ImGui { let io = self.io_mut(); io.key_repeat_rate = value; } + pub fn hidpi_factor(&self) -> f32 { self.hidpi_factor } + pub fn set_hidpi_factor(&mut self, hidpi_factor: f32) { self.hidpi_factor = hidpi_factor; } pub fn mouse_pos(&self) -> (f32, f32) { + let hidpi_factor = self.hidpi_factor; let io = self.io(); - (io.mouse_pos.x, io.mouse_pos.y) + (io.mouse_pos.x * hidpi_factor, io.mouse_pos.y * hidpi_factor) } pub fn set_mouse_pos(&mut self, x: f32, y: f32) { + let hidpi_factor = self.hidpi_factor; let io = self.io_mut(); - io.mouse_pos.x = x; - io.mouse_pos.y = y; + io.mouse_pos.x = x / hidpi_factor; + io.mouse_pos.y = y / hidpi_factor; } pub fn set_mouse_down(&mut self, states: &[bool; 5]) { let io = self.io_mut(); @@ -265,12 +272,7 @@ impl ImGui { pub fn get_time(&self) -> f32 { unsafe { imgui_sys::igGetTime() } } pub fn get_frame_count(&self) -> i32 { unsafe { imgui_sys::igGetFrameCount() } } pub fn get_frame_rate(&self) -> f32 { self.io().framerate } - pub fn frame<'ui, 'a: 'ui>(&'a mut self, - width: u32, - height: u32, - hidpi_factor: f32, - delta_time: f32) - -> Ui<'ui> { + pub fn frame<'ui, 'a: 'ui>(&'a mut self, width: u32, height: u32, delta_time: f32) -> Ui<'ui> { { let io = self.io_mut(); io.display_size.x = width as c_float; @@ -279,15 +281,9 @@ impl ImGui { } unsafe { imgui_sys::igNewFrame(); - CURRENT_UI = Some(Ui { - imgui: mem::transmute(self as &'a ImGui), - hidpi_factor: hidpi_factor, - }); - } - Ui { - imgui: self, - hidpi_factor: hidpi_factor, + CURRENT_UI = Some(Ui { imgui: mem::transmute(self as &'a ImGui) }); } + Ui { imgui: self } } } @@ -310,7 +306,6 @@ pub struct DrawList<'a> { pub struct Ui<'ui> { imgui: &'ui ImGui, - hidpi_factor: f32, } static FMT: &'static [u8] = b"%s\0"; @@ -360,7 +355,7 @@ impl<'ui> Ui<'ui> { idx_buffer: (*cmd_list).idx_buffer.as_slice(), vtx_buffer: (*cmd_list).vtx_buffer.as_slice(), }; - try!(f(draw_list, self.hidpi_factor)); + try!(f(draw_list, self.imgui.hidpi_factor)); } CURRENT_UI = None; }