* egui_glium: prevent cursor icon flickering at frame boundary (Windows) * fix compiler warning * cargo fmt
This commit is contained in:
parent
269bcdfce3
commit
ee1fcf1ead
2 changed files with 23 additions and 12 deletions
|
@ -173,6 +173,7 @@ pub fn run(mut app: Box<dyn epi::App>) -> ! {
|
||||||
let mut previous_frame_time = None;
|
let mut previous_frame_time = None;
|
||||||
let mut painter = Painter::new(&display);
|
let mut painter = Painter::new(&display);
|
||||||
let mut clipboard = init_clipboard();
|
let mut clipboard = init_clipboard();
|
||||||
|
let mut previous_cursor_icon = None;
|
||||||
|
|
||||||
#[cfg(feature = "persistence")]
|
#[cfg(feature = "persistence")]
|
||||||
let mut last_auto_save = Instant::now();
|
let mut last_auto_save = Instant::now();
|
||||||
|
@ -208,7 +209,15 @@ pub fn run(mut app: Box<dyn epi::App>) -> ! {
|
||||||
ctx.clear_animations();
|
ctx.clear_animations();
|
||||||
|
|
||||||
let (egui_output, _shapes) = ctx.end_frame();
|
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
|
// TODO: handle app_output
|
||||||
// eprintln!("Warmed up in {} ms", warm_up_start.elapsed().as_millis())
|
// eprintln!("Warmed up in {} ms", warm_up_start.elapsed().as_millis())
|
||||||
}
|
}
|
||||||
|
@ -276,7 +285,18 @@ pub fn run(mut app: Box<dyn epi::App>) -> ! {
|
||||||
}
|
}
|
||||||
|
|
||||||
screen_reader.speak(&egui_output.events_description());
|
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")]
|
#[cfg(feature = "persistence")]
|
||||||
if let Some(storage) = &mut storage {
|
if let Some(storage) = &mut storage {
|
||||||
|
|
|
@ -277,11 +277,7 @@ pub fn translate_cursor(cursor_icon: egui::CursorIcon) -> glutin::window::Cursor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_output(
|
pub fn handle_output(output: egui::Output, clipboard: Option<&mut ClipboardContext>) {
|
||||||
output: egui::Output,
|
|
||||||
display: &glium::backend::glutin::Display,
|
|
||||||
clipboard: Option<&mut ClipboardContext>,
|
|
||||||
) {
|
|
||||||
if let Some(open) = output.open_url {
|
if let Some(open) = output.open_url {
|
||||||
if let Err(err) = webbrowser::open(&open.url) {
|
if let Err(err) = webbrowser::open(&open.url) {
|
||||||
eprintln!("Failed to open url: {}", err);
|
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<ClipboardContext> {
|
pub fn init_clipboard() -> Option<ClipboardContext> {
|
||||||
|
|
Loading…
Reference in a new issue