From 2a862b5d5aa3e4e6d521a0fbc10e65b8328fd440 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 20 May 2026 01:52:49 +0800 Subject: [PATCH] Fix Linux/Wayland crash on Preview tab at startup --- src/slic3r/GUI/GUI_App.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b5204e1d49..1534b1db92 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -786,9 +786,20 @@ void GUI_App::post_init() mainframe->select_tab(size_t(MainFrame::tp3DEditor)); plater_->select_view_3D("3D"); //BBS init the opengl resource here -//#ifdef __linux__ - if (plater_->canvas3D()->get_wxglcanvas()->IsShownOnScreen()&&plater_->canvas3D()->make_current_for_postinit()) { -//#endif + if (!plater_->canvas3D()->get_wxglcanvas()->IsShownOnScreen() || + !plater_->canvas3D()->make_current_for_postinit()) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": glcontext not ready, postpone init"; + plater_->canvas3D()->enable_render(true); + plater_->canvas3D()->set_as_dirty(); +#ifdef __linux__ + // Wayland/EGL may not have committed the GL surface yet; ask the + // idle loop to retry post_init when the canvas is actually mapped. + // Without this, GL function pointers stay null and the first + // Preview focus crashes in Camera::apply_viewport. + m_post_initialized = false; + return; +#endif + } else { Size canvas_size = plater_->canvas3D()->get_canvas_size(); wxGetApp().imgui()->set_display_size(static_cast(canvas_size.get_width()), static_cast(canvas_size.get_height())); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", start to init opengl"; @@ -808,14 +819,7 @@ void GUI_App::post_init() plater_->canvas3D()->render(false); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", finished rendering a first frame for test"; } -//#ifdef __linux__ } - else { - BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << "Found glcontext not ready, postpone the init"; - plater_->canvas3D()->enable_render(true); - plater_->canvas3D()->set_as_dirty(); - } -//#endif if (is_editor()) mainframe->select_tab(size_t(0)); if (app_config->get("default_page") == "1")