diff --git a/engine/src/framework.rs b/engine/src/framework.rs index ddbabe65..be578720 100644 --- a/engine/src/framework.rs +++ b/engine/src/framework.rs @@ -137,7 +137,10 @@ async fn run(el: EventLoop<()>, window: Arc) { }); ctx.gfx.finish_frame(enc); - ctx.gfx.window.set_cursor_icon(get_cursor_icon()); + let (icon, changed) = get_cursor_icon(); + if changed { + ctx.gfx.window.set_cursor_icon(icon); + } ctx.input.end_frame(); ctx.times.total_cpu_time = last_update.elapsed().as_secs_f32(); diff --git a/engine/src/input.rs b/engine/src/input.rs index 37df7b40..dbea046e 100644 --- a/engine/src/input.rs +++ b/engine/src/input.rs @@ -10,15 +10,20 @@ use winit::platform::scancode::PhysicalKeyExtScancode; use winit::window::CursorIcon; lazy_static! { - static ref CURSOR_ICON: Arc> = Arc::new(Mutex::new(CursorIcon::Default)); + static ref CURSOR_ICON: Arc> = + Arc::new(Mutex::new((CursorIcon::Default, false))); } pub fn set_cursor_icon(icon: CursorIcon) { - *CURSOR_ICON.lock().unwrap() = icon; + let old = &mut *CURSOR_ICON.lock().unwrap(); + *old = (icon, old.1 || (old.0 != icon)); } -pub fn get_cursor_icon() -> CursorIcon { - *CURSOR_ICON.lock().unwrap() +pub fn get_cursor_icon() -> (CursorIcon, bool) { + let v = &mut *CURSOR_ICON.lock().unwrap(); + let to_ret = *v; + v.1 = false; + to_ret } #[derive(Default)]