diff options
author | Antoine Damhet | 2020-08-23 12:56:49 +0200 |
---|---|---|
committer | Antoine Damhet | 2020-08-23 12:56:49 +0200 |
commit | 7b430130e338a84228a6326e3ed1ea42209412bf (patch) | |
tree | 50d9d87657b8cdfee5eb8400fb1fbacc33d184f6 /0020-UI-Check-for-Expose-and-PlatformSurface-events-to-cr.patch | |
parent | 8087c172b8373ffb15efe8f79905a3174d29c118 (diff) | |
download | aur-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.patch | 91 |
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 + |