92 lines
2.3 KiB
Diff
92 lines
2.3 KiB
Diff
|
From 0e49f864012ef995870d9debac5fa08d73615b30 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/20] 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
|
||
|
|