From 200051d5d8fb3c384db21fe14d8318265c60c038 Mon Sep 17 00:00:00 2001 From: Garoven <95014675+Garoven@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:50:21 +0100 Subject: [PATCH] Fix Android crash on resume with Glow backend (#3867) Addition for In previous one i only fixed crash occurring with Wgpu backend. This fixes crash with Glow backend as well. I only tested this change with android so most things i changed are behind ```#[cfg(target_os = "android")]```. Both fixes are dirty thought. As says that "The root viewport is the original viewport, and cannot be closed without closing the application.". So they break rules i guess? But i can't think about better solution for now. Closes . --- crates/eframe/src/native/glow_integration.rs | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index 75820becf..ea193ee87 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -39,18 +39,6 @@ use super::{ *, }; -// Note: that the current Glutin API design tightly couples the GL context with -// the Window which means it's not practically possible to just destroy the -// window and re-create a new window while continuing to use the same GL context. -// -// For now this means it's not possible to support Android as well as we can with -// wgpu because we're basically forced to destroy and recreate _everything_ when -// the application suspends and resumes. -// -// There is work in progress to improve the Glutin API so it has a separate Surface -// API that would allow us to just destroy a Window/Surface when suspending, see: -// https://github.com/rust-windowing/glutin/pull/1435 - // ---------------------------------------------------------------------------- // Types: @@ -525,7 +513,9 @@ impl GlowWinitRunning { let mut glutin = self.glutin.borrow_mut(); let egui_ctx = glutin.egui_ctx.clone(); let viewport = glutin.viewports.get_mut(&viewport_id).unwrap(); - let window = viewport.window.as_ref().unwrap(); + let Some(window) = viewport.window.as_ref() else { + return EventResult::Wait; + }; egui_winit::update_viewport_info(&mut viewport.info, &egui_ctx, window); let egui_winit = viewport.egui_winit.as_mut().unwrap();