0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 04:42:18 +02:00

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
This commit is contained in:
Georges Basile Stavracas Neto 2020-08-20 11:58:45 -03:00
parent 226cc22669
commit e67fdbca79

View File

@ -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