diff --git a/imgui-examples/examples/support/mod.rs b/imgui-examples/examples/support/mod.rs index c476955..e664c83 100644 --- a/imgui-examples/examples/support/mod.rs +++ b/imgui-examples/examples/support/mod.rs @@ -1,4 +1,4 @@ -use imgui::{ImGui, Ui}; +use imgui::{ImGui, ImGuiMouseCursor, Ui}; use std::time::Instant; #[derive(Copy, Clone, PartialEq, Debug, Default)] @@ -105,6 +105,26 @@ pub fn run bool>(title: String, clear_color: [f32; 4], mut run_ update_mouse(&mut imgui, &mut mouse_state); let gl_window = display.gl_window(); + + let mouse_cursor = imgui.mouse_cursor(); + if imgui.mouse_draw_cursor() || mouse_cursor == ImGuiMouseCursor::None { + // Hide OS cursor + gl_window.set_cursor_state(glutin::CursorState::Hide).unwrap(); + } else { + // Set OS cursor + gl_window.set_cursor_state(glutin::CursorState::Normal).unwrap(); + gl_window.set_cursor(match mouse_cursor { + ImGuiMouseCursor::None => unreachable!("mouse_cursor was None!"), + ImGuiMouseCursor::Arrow => glutin::MouseCursor::Arrow, + ImGuiMouseCursor::TextInput => glutin::MouseCursor::Text, + ImGuiMouseCursor::Move => glutin::MouseCursor::Move, + ImGuiMouseCursor::ResizeNS => glutin::MouseCursor::NsResize, + ImGuiMouseCursor::ResizeEW => glutin::MouseCursor::EwResize, + ImGuiMouseCursor::ResizeNESW => glutin::MouseCursor::NeswResize, + ImGuiMouseCursor::ResizeNWSE => glutin::MouseCursor::NwseResize, + }); + } + let size_pixels = gl_window.get_inner_size().unwrap(); let hdipi = gl_window.hidpi_factor(); let size_points = ( diff --git a/imgui-examples/examples/support_gfx/mod.rs b/imgui-examples/examples/support_gfx/mod.rs index ebfd030..b019fca 100644 --- a/imgui-examples/examples/support_gfx/mod.rs +++ b/imgui-examples/examples/support_gfx/mod.rs @@ -1,4 +1,4 @@ -use imgui::{ImGui, Ui}; +use imgui::{ImGui, ImGuiMouseCursor, Ui}; use imgui_gfx_renderer::{Renderer, Shaders}; use std::time::Instant; @@ -131,6 +131,25 @@ pub fn run bool>(title: String, clear_color: [f32; 4], mut run_ update_mouse(&mut imgui, &mut mouse_state); + let mouse_cursor = imgui.mouse_cursor(); + if imgui.mouse_draw_cursor() || mouse_cursor == ImGuiMouseCursor::None { + // Hide OS cursor + window.set_cursor_state(glutin::CursorState::Hide).unwrap(); + } else { + // Set OS cursor + window.set_cursor_state(glutin::CursorState::Normal).unwrap(); + window.set_cursor(match mouse_cursor { + ImGuiMouseCursor::None => unreachable!("mouse_cursor was None!"), + ImGuiMouseCursor::Arrow => glutin::MouseCursor::Arrow, + ImGuiMouseCursor::TextInput => glutin::MouseCursor::Text, + ImGuiMouseCursor::Move => glutin::MouseCursor::Move, + ImGuiMouseCursor::ResizeNS => glutin::MouseCursor::NsResize, + ImGuiMouseCursor::ResizeEW => glutin::MouseCursor::EwResize, + ImGuiMouseCursor::ResizeNESW => glutin::MouseCursor::NeswResize, + ImGuiMouseCursor::ResizeNWSE => glutin::MouseCursor::NwseResize, + }); + } + let size_pixels = window.get_inner_size().unwrap(); let hdipi = window.hidpi_factor(); let size_points = ( diff --git a/src/lib.rs b/src/lib.rs index ef59fc7..c6e3264 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,8 +9,8 @@ use std::str; use sys::ImGuiStyleVar; pub use sys::{ImDrawIdx, ImDrawVert, ImGuiColorEditFlags, ImGuiHoveredFlags, ImGuiInputTextFlags, - ImGuiKey, ImGuiSelectableFlags, ImGuiCond, ImGuiCol, ImGuiStyle, ImGuiTreeNodeFlags, - ImGuiWindowFlags, ImVec2, ImVec4}; + ImGuiKey, ImGuiMouseCursor, ImGuiSelectableFlags, ImGuiCond, ImGuiCol, ImGuiStyle, + ImGuiTreeNodeFlags, ImGuiWindowFlags, ImVec2, ImVec4}; pub use child_frame::ChildFrame; pub use color_editors::{ColorButton, ColorEdit, ColorEditMode, ColorFormat, ColorPicker, ColorPickerMode, ColorPreview, EditableColor}; @@ -198,10 +198,31 @@ impl ImGui { let io = self.io_mut(); io.mouse_wheel = value; } + /// Set to `true` to have ImGui draw the cursor in software. + /// If `false`, the OS cursor is used (default to `false`). pub fn set_mouse_draw_cursor(&mut self, value: bool) { let io = self.io_mut(); io.mouse_draw_cursor = value; } + pub fn mouse_draw_cursor(&self) -> bool { + let io = self.io(); + io.mouse_draw_cursor + } + /// Set currently displayed cursor. + /// Requires support in the windowing back-end if OS cursor is used. + /// OS cursor is used if `mouse_draw_cursor` is set to `false` with + /// [set_mouse_draw_cursor](#method.set_mouse_draw_cursor). + pub fn set_mouse_cursor(&self, cursor: ImGuiMouseCursor) { + unsafe { + sys::igSetMouseCursor(cursor); + } + } + /// Get currently displayed cursor. + pub fn mouse_cursor(&self) -> ImGuiMouseCursor { + unsafe { + sys::igGetMouseCursor() + } + } pub fn key_ctrl(&self) -> bool { let io = self.io(); io.key_ctrl