aur-obs-studio-wayland/0020-UI-Check-for-Expose-an...

92 lines
2.3 KiB
Diff

From 8a8757b4b6ce1e74d68c9fe6a3f31fad906c0fe7 Mon Sep 17 00:00:00 2001
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
Date: Thu, 20 Aug 2020 11:58:45 -0300
Subject: [PATCH 20/25] UI: Check for Expose and PlatformSurface events to
create display
This is a workaround for QWaylandWindow never becoming exposed, or
receiving the QEvent::Expose [1].
[1] https://bugreports.qt.io/browse/QTBUG-86176
---
UI/qt-display.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/UI/qt-display.cpp b/UI/qt-display.cpp
index b230ab4e..5d81c463 100644
--- a/UI/qt-display.cpp
+++ b/UI/qt-display.cpp
@@ -10,6 +10,56 @@
#ifdef ENABLE_WAYLAND
#include <obs-nix-platform.h>
+
+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<QPlatformSurfaceEvent *>(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
--
2.28.0