Skip to content

Commit

Permalink
UI: Retrieve Wayland surface from QWindow
Browse files Browse the repository at this point in the history
On Wayland, we want to query the window's underlying
platform for the Wayland surface, instead of foolishly
retrieving the X11 display.

Pass QWindow instead of WId directly, and set the surface
as the platform data on Wayland systems.
  • Loading branch information
GeorgesStavracas committed Apr 12, 2020
1 parent 24a0b1f commit c48b435
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 7 deletions.
2 changes: 1 addition & 1 deletion UI/qt-display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ void OBSQTDisplay::CreateDisplay()
info.format = GS_BGRA;
info.zsformat = GS_ZS_NONE;

QTToGSWindow(winId(), info.window);
QTToGSWindow(windowHandle(), info.window);

display = obs_display_create(&info, backgroundColor);

Expand Down
28 changes: 23 additions & 5 deletions UI/qt-wrappers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,14 @@
#include <QKeyEvent>

#if !defined(_WIN32) && !defined(__APPLE__)
#include <obs-nix-platform.h>
#include <QX11Info>
#endif

#ifdef ENABLE_WAYLAND
#include <qpa/qplatformnativeinterface.h>
#endif

static inline void OBSErrorBoxva(QWidget *parent, const char *msg, va_list args)
{
char full_message[4096];
Expand Down Expand Up @@ -105,15 +110,28 @@ void OBSMessageBox::critical(QWidget *parent, const QString &title,
mb.exec();
}

void QTToGSWindow(WId windowId, gs_window &gswindow)
void QTToGSWindow(QWindow *window, gs_window &gswindow)
{
#ifdef _WIN32
gswindow.hwnd = (HWND)windowId;
gswindow.hwnd = (HWND)window->winId();
#elif __APPLE__
gswindow.view = (id)windowId;
gswindow.view = (id)window->winId();
#else
gswindow.id = windowId;
gswindow.display = QX11Info::display();
switch (obs_get_nix_platform()) {
case OBS_NIX_PLATFORM_X11_GLX:
case OBS_NIX_PLATFORM_X11_EGL:
gswindow.id = window->winId();
gswindow.display = obs_get_nix_platform_display();
break;
#ifdef ENABLE_WAYLAND
case OBS_NIX_PLATFORM_WAYLAND:
QPlatformNativeInterface *native =
QGuiApplication::platformNativeInterface();
gswindow.display =
native->nativeResourceForWindow("surface", window);
break;
#endif
}
#endif
}

Expand Down
3 changes: 2 additions & 1 deletion UI/qt-wrappers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <QApplication>
#include <QMessageBox>
#include <QWidget>
#include <QWindow>
#include <QThread>
#include <obs.hpp>

Expand Down Expand Up @@ -55,7 +56,7 @@ class OBSMessageBox {

void OBSErrorBox(QWidget *parent, const char *msg, ...);

void QTToGSWindow(WId windowId, gs_window &gswindow);
void QTToGSWindow(QWindow *window, gs_window &gswindow);

uint32_t TranslateQtKeyboardEventModifiers(Qt::KeyboardModifiers mods);

Expand Down

0 comments on commit c48b435

Please sign in to comment.