Details
-
Bug
-
Resolution: Done
-
P2: Important
-
5.15.0
-
None
-
-
e20e1d506d627a53d9d7bf7794b93bf9e8b9bedb (qt/qtwayland/dev) 7d7ac7f0a4bd6a7956448ddb0ba44c12755dca2e (qt/qtwayland/5.15)
Description
I've been working on porting OBS Studio to be a native Wayland client, and I'm seeing what I believe to be an odd, potentially buggy behavior.
OBS Studio has this OBSQTDisplay class that is a native QWidget subclass, and renders the contents of the different sources (webcam, screen capture, etc) into them. The graphics (GLX / EGL / WGL / etc) infrastructure is created only if this particular widget's windowHandle() is exposed. On X11, this seems to be a reasonable check, however on Wayland it is not.
I've added an event filter to all the places this widget is created, and found some interesting facts:
* When in a dialog, QWidget::resizeEvent() is called, and windowHandle()'s QWindow::visibleChanged event is fired, but windowHandle()->isExposed() returns false in both places.
* The QEvent::PlatformSurface event is always properly received by the event filter, regardless of being inside a window or a dialog.
* I've checked with a timer and, when inside a dialog, this native widget's windowHandle never becomes exposed until I create a wl_egl_window with the widget's wl_surface.
* The QEvent::Expose event is sent when the QWidget is created with the Qt::Window flag.
You can verify the code at https://github.com/obsproject/obs-studio/pull/2484
Let me know if there's any other information I can provide to help tracking down this issue.