Skip to content

Commit

Permalink
UI: Check for Expose and PlatformSurface events to create display
Browse files Browse the repository at this point in the history
This is a workaround for QWaylandWindow never becoming exposed, or
receiving the QEvent::Expose [1].

[1] https://bugreports.qt.io/browse/QTBUG-86176
  • Loading branch information
GeorgesStavracas committed Feb 9, 2021
1 parent 10553d1 commit e2cdcce
Showing 1 changed file with 56 additions and 0 deletions.
56 changes: 56 additions & 0 deletions UI/qt-display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit e2cdcce

Please sign in to comment.