From ee1fcf1eadbb78f2d2eb2c5f1ae8f0f4070ca75b Mon Sep 17 00:00:00 2001 From: Norbert Nemec Date: Sat, 13 Mar 2021 12:27:05 +0100 Subject: [PATCH] egui_glium: prevent cursor icon flickering at frame boundary on Windows (#217) (#218) * egui_glium: prevent cursor icon flickering at frame boundary (Windows) * fix compiler warning * cargo fmt --- egui_glium/src/backend.rs | 24 ++++++++++++++++++++++-- egui_glium/src/lib.rs | 11 +---------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/egui_glium/src/backend.rs b/egui_glium/src/backend.rs index c104d089..908be3b5 100644 --- a/egui_glium/src/backend.rs +++ b/egui_glium/src/backend.rs @@ -173,6 +173,7 @@ pub fn run(mut app: Box) -> ! { let mut previous_frame_time = None; let mut painter = Painter::new(&display); let mut clipboard = init_clipboard(); + let mut previous_cursor_icon = None; #[cfg(feature = "persistence")] let mut last_auto_save = Instant::now(); @@ -208,7 +209,15 @@ pub fn run(mut app: Box) -> ! { ctx.clear_animations(); let (egui_output, _shapes) = ctx.end_frame(); - handle_output(egui_output, &display, clipboard.as_mut()); + let new_cursor_icon = egui_output.cursor_icon; + handle_output(egui_output, clipboard.as_mut()); + + display + .gl_window() + .window() + .set_cursor_icon(translate_cursor(new_cursor_icon)); + previous_cursor_icon = Some(new_cursor_icon); + // TODO: handle app_output // eprintln!("Warmed up in {} ms", warm_up_start.elapsed().as_millis()) } @@ -276,7 +285,18 @@ pub fn run(mut app: Box) -> ! { } screen_reader.speak(&egui_output.events_description()); - handle_output(egui_output, &display, clipboard.as_mut()); + let new_cursor_icon = egui_output.cursor_icon; + handle_output(egui_output, clipboard.as_mut()); + + if Some(new_cursor_icon) != previous_cursor_icon { + // call only when changed to prevent flickering near frame boundary + // when Windows OS tries to control cursor icon for window resizing + display + .gl_window() + .window() + .set_cursor_icon(translate_cursor(new_cursor_icon)); + previous_cursor_icon = Some(new_cursor_icon); + } #[cfg(feature = "persistence")] if let Some(storage) = &mut storage { diff --git a/egui_glium/src/lib.rs b/egui_glium/src/lib.rs index f6915715..a01d5a62 100644 --- a/egui_glium/src/lib.rs +++ b/egui_glium/src/lib.rs @@ -277,11 +277,7 @@ pub fn translate_cursor(cursor_icon: egui::CursorIcon) -> glutin::window::Cursor } } -pub fn handle_output( - output: egui::Output, - display: &glium::backend::glutin::Display, - clipboard: Option<&mut ClipboardContext>, -) { +pub fn handle_output(output: egui::Output, clipboard: Option<&mut ClipboardContext>) { if let Some(open) = output.open_url { if let Err(err) = webbrowser::open(&open.url) { eprintln!("Failed to open url: {}", err); @@ -295,11 +291,6 @@ pub fn handle_output( } } } - - display - .gl_window() - .window() - .set_cursor_icon(translate_cursor(output.cursor_icon)); } pub fn init_clipboard() -> Option {