diff --git a/UI/qt-display.cpp b/UI/qt-display.cpp index b230ab4e7b1692..5d81c463074ada 100644 --- a/UI/qt-display.cpp +++ b/UI/qt-display.cpp @@ -10,6 +10,56 @@ #ifdef ENABLE_WAYLAND #include + +class SurfaceEventFilter : public QObject { + OBSQTDisplay *display; + int mTimerId; + +public: + SurfaceEventFilter(OBSQTDisplay *src) : display(src), mTimerId(0) {} + +protected: + bool eventFilter(QObject *obj, QEvent *event) override + { + bool result = QObject::eventFilter(obj, event); + QPlatformSurfaceEvent *surfaceEvent; + + switch (event->type()) { + case QEvent::PlatformSurface: + surfaceEvent = + static_cast(event); + if (surfaceEvent->surfaceEventType() != + QPlatformSurfaceEvent::SurfaceCreated) + return result; + + if (display->windowHandle()->isExposed()) + createOBSDisplay(); + else + mTimerId = startTimer(67); // Arbitrary + break; + case QEvent::Expose: + createOBSDisplay(); + break; + default: + break; + } + + return result; + } + + void timerEvent(QTimerEvent *) { createOBSDisplay(true); } + +private: + void createOBSDisplay(bool force = false) + { + display->CreateDisplay(force); + if (mTimerId > 0) { + killTimer(mTimerId); + mTimerId = 0; + } + } +}; + #endif static inline long long color_to_int(const QColor &color) @@ -65,6 +115,12 @@ OBSQTDisplay::OBSQTDisplay(QWidget *parent, Qt::WindowFlags flags) connect(windowHandle(), &QWindow::visibleChanged, windowVisible); connect(windowHandle(), &QWindow::screenChanged, screenChanged); + +#ifdef ENABLE_WAYLAND + if (obs_get_nix_platform() == OBS_NIX_PLATFORM_WAYLAND) + windowHandle()->installEventFilter( + new SurfaceEventFilter(this)); +#endif } QColor OBSQTDisplay::GetDisplayBackgroundColor() const