From 42009cf385381216d86b724c2c8532a497463b61 Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Thu, 24 Sep 2026 11:41:56 -0500 Subject: [PATCH] fix: Linux Flatpak crash rendering plate thumbnails while slicing or saving (#15873) --- src/slic3r/GUI/GLCanvas3D.cpp | 13 +++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 1 + 2 files changed, 14 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index cc3a1deb0a..0b16212567 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2354,6 +2354,13 @@ void GLCanvas3D::render_thumbnail(ThumbnailData & thumbnail_data, render_thumbnail(thumbnail_data, w, h, thumbnail_params, model_objects, m_volumes, camera_type, camera_view_angle_type, for_picking, ban_light); } +bool GLCanvas3D::_set_shown_canvas_current() +{ + // Thumbnails also render outside render(), where another library's GL context (e.g. WebKitGTK's) can be current. + // Inside render(), the shown canvas is the one already bound. + return wxGetApp().plater()->get_current_canvas3D()->_set_current(); +} + void GLCanvas3D::render_thumbnail(ThumbnailData & thumbnail_data, unsigned int w, unsigned int h, @@ -2365,6 +2372,9 @@ void GLCanvas3D::render_thumbnail(ThumbnailData & thumbnail_data, bool for_picking, bool ban_light) { + if (!_set_shown_canvas_current()) + return; + GLShaderProgram* shader = nullptr; if (for_picking) shader = wxGetApp().get_shader("flat"); @@ -2403,6 +2413,9 @@ void GLCanvas3D::render_thumbnail(ThumbnailData & thumbnail_d bool for_picking, bool ban_light) { + if (!_set_shown_canvas_current()) + return; + GLShaderProgram *shader = wxGetApp().get_shader("thumbnail"); switch (OpenGLManager::get_framebuffers_type()) { case OpenGLManager::EFramebufferType::Arb: { diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 254fa9ddca..663b72a1d3 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -1320,6 +1320,7 @@ private: bool _init_collapse_toolbar(); bool _set_current(); + bool _set_shown_canvas_current(); void _resize(unsigned int w, unsigned int h); //BBS: add part plate related logic