summarylogtreecommitdiffstats
path: root/0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch
diff options
context:
space:
mode:
authorAntoine Damhet2020-08-23 12:56:49 +0200
committerAntoine Damhet2020-08-23 12:56:49 +0200
commit7b430130e338a84228a6326e3ed1ea42209412bf (patch)
tree50d9d87657b8cdfee5eb8400fb1fbacc33d184f6 /0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch
parent8087c172b8373ffb15efe8f79905a3174d29c118 (diff)
downloadaur-7b430130e338a84228a6326e3ed1ea42209412bf.tar.gz
update patches from pull request
Signed-off-by: Antoine Damhet <antoine.damhet@lse.epita.fr>
Diffstat (limited to '0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch')
-rw-r--r--0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch91
1 files changed, 91 insertions, 0 deletions
diff --git a/0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch b/0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch
new file mode 100644
index 000000000000..84e49a418fdd
--- /dev/null
+++ b/0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch
@@ -0,0 +1,91 @@
+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
+