From 8c902a15e93978d9e1c61f559a076fe5ae606503 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 18 Aug 2020 19:38:29 -0300 Subject: [PATCH 15/25] UI: Destroy display when becoming invisible When a window is made invisible, then visible again, the obs_display is reused. Turns out, QT destroys the wl_surface associated with the previewer on Wayland. However, the EGL surface created on top of this wl_surface is not, and any attempt to attach a new buffer to it will crash OBS. Destroy the obs_display when becoming invisible, and when running as a Wayland client. Also nullify the display variable on destruction, to avoid subclasses double-freeing the obs display. --- UI/qt-display.cpp | 13 ++++++++++++- UI/qt-display.hpp | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/UI/qt-display.cpp b/UI/qt-display.cpp index 685ee6f9..fc83e0e0 100644 --- a/UI/qt-display.cpp +++ b/UI/qt-display.cpp @@ -6,6 +6,12 @@ #include #include +#include + +#ifdef ENABLE_WAYLAND +#include +#endif + static inline long long color_to_int(const QColor &color) { auto shift = [&](unsigned val, int shift) { @@ -33,8 +39,13 @@ OBSQTDisplay::OBSQTDisplay(QWidget *parent, Qt::WindowFlags flags) setAttribute(Qt::WA_NativeWindow); auto windowVisible = [this](bool visible) { - if (!visible) + if (!visible) { +#ifdef ENABLE_WAYLAND + if (obs_get_nix_platform() == OBS_NIX_PLATFORM_WAYLAND) + display = nullptr; +#endif return; + } if (!display) { CreateDisplay(); diff --git a/UI/qt-display.hpp b/UI/qt-display.hpp index 816d96bc..21308e70 100644 --- a/UI/qt-display.hpp +++ b/UI/qt-display.hpp @@ -25,6 +25,7 @@ signals: public: OBSQTDisplay(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); + ~OBSQTDisplay() { display = nullptr; } virtual QPaintEngine *paintEngine() const override; -- 2.28.0