diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index a5924db1..a087c9fa 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -775,8 +775,21 @@ impl GlowWinitRunning<'_> { let mut repaint_asap = false; match event { - winit::event::WindowEvent::Focused(new_focused) => { - glutin.focused_viewport = new_focused.then(|| viewport_id).flatten(); + winit::event::WindowEvent::Focused(focused) => { + let focused = if cfg!(target_os = "macos") + && let Some(viewport_id) = viewport_id + && let Some(viewport) = glutin.viewports.get(&viewport_id) + && let Some(window) = &viewport.window + { + // TODO(emilk): remove this work-around once we update winit + // https://github.com/rust-windowing/winit/issues/4371 + // https://github.com/emilk/egui/issues/7588 + window.has_focus() + } else { + *focused + }; + + glutin.focused_viewport = focused.then_some(viewport_id).flatten(); } winit::event::WindowEvent::Resized(physical_size) => { diff --git a/crates/eframe/src/native/wgpu_integration.rs b/crates/eframe/src/native/wgpu_integration.rs index 0c06012e..53269c51 100644 --- a/crates/eframe/src/native/wgpu_integration.rs +++ b/crates/eframe/src/native/wgpu_integration.rs @@ -775,8 +775,21 @@ impl WgpuWinitRunning<'_> { let mut repaint_asap = false; match event { - winit::event::WindowEvent::Focused(new_focused) => { - shared.focused_viewport = new_focused.then(|| viewport_id).flatten(); + winit::event::WindowEvent::Focused(focused) => { + let focused = if cfg!(target_os = "macos") + && let Some(viewport_id) = viewport_id + && let Some(viewport) = shared.viewports.get(&viewport_id) + && let Some(window) = &viewport.window + { + // TODO(emilk): remove this work-around once we update winit + // https://github.com/rust-windowing/winit/issues/4371 + // https://github.com/emilk/egui/issues/7588 + window.has_focus() + } else { + *focused + }; + + shared.focused_viewport = focused.then_some(viewport_id).flatten(); } winit::event::WindowEvent::Resized(physical_size) => { diff --git a/crates/egui-winit/src/lib.rs b/crates/egui-winit/src/lib.rs index 92e8c341..16fc7b7b 100644 --- a/crates/egui-winit/src/lib.rs +++ b/crates/egui-winit/src/lib.rs @@ -423,10 +423,19 @@ impl State { } } WindowEvent::Focused(focused) => { - self.egui_input.focused = *focused; + let focused = if cfg!(target_os = "macos") { + // TODO(emilk): remove this work-around once we update winit + // https://github.com/rust-windowing/winit/issues/4371 + // https://github.com/emilk/egui/issues/7588 + window.has_focus() + } else { + *focused + }; + + self.egui_input.focused = focused; self.egui_input .events - .push(egui::Event::WindowFocused(*focused)); + .push(egui::Event::WindowFocused(focused)); EventResponse { repaint: true, consumed: false,