From 6a265400656ba6045329c48253ebbaff81497bfc Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 26 Feb 2021 10:48:47 +0200 Subject: [PATCH] wayland: Query pkg-config if Xwayland supports listenfd -listen option is deprecated in favor of the -listenfd option. This change makes kwin query whether Xwayland supports the -listenfd option at build time. If the pkg-config file is missing, we'll use the old listen option. --- CMakeLists.txt | 1 + cmake/modules/FindXwayland.cmake | 36 +++++++++++++++++++++++++++----- src/config-kwin.h.cmake | 2 ++ src/xwl/xwayland.cpp | 24 ++++++++++++++------- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 50e6519cac..bbd407e339 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -294,6 +294,7 @@ set_package_properties(Xwayland PROPERTIES TYPE RUNTIME PURPOSE "Needed for running kwin_wayland" ) +set(HAVE_XWAYLAND_LISTENFD ${Xwayland_HAVE_LISTENFD}) find_package(Libcap) set_package_properties(Libcap PROPERTIES diff --git a/cmake/modules/FindXwayland.cmake b/cmake/modules/FindXwayland.cmake index 9dd49ba97b..1c96518069 100644 --- a/cmake/modules/FindXwayland.cmake +++ b/cmake/modules/FindXwayland.cmake @@ -1,13 +1,39 @@ +#.rst: +# FindXwayland +# ------- +# +# Try to find Xwayland on a Unix system. +# +# This will define the following variables: +# +# ``Xwayland_FOUND`` +# True if (the requested version of) Xwayland is available +# ``Xwayland_VERSION`` +# The version of Xwayland +# ``Xwayland_HAVE_LISTENFD`` +# True if (the requested version of) Xwayland has -listenfd option + #============================================================================= # SPDX-FileCopyrightText: 2016 Martin Gräßlin +# SPDX-FileCopyrightText: 2021 Vlad Zahorodnii # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= + +find_package(PkgConfig) +pkg_check_modules(PKG_xwayland QUIET xwayland) + +set(Xwayland_VERSION ${PKG_xwayland_VERSION}) +pkg_get_variable(Xwayland_HAVE_LISTENFD xwayland have_listenfd) + find_program(Xwayland_EXECUTABLE NAMES Xwayland) find_package_handle_standard_args(Xwayland - FOUND_VAR - Xwayland_FOUND - REQUIRED_VARS - Xwayland_EXECUTABLE + FOUND_VAR Xwayland_FOUND + REQUIRED_VARS Xwayland_EXECUTABLE + VERSION_VAR Xwayland_VERSION +) +mark_as_advanced( + Xwayland_EXECUTABLE + Xwayland_HAVE_LISTENFD + Xwayland_VERSION ) -mark_as_advanced(Xwayland_EXECUTABLE) diff --git a/src/config-kwin.h.cmake b/src/config-kwin.h.cmake index 4a8500e511..2f54718c0d 100644 --- a/src/config-kwin.h.cmake +++ b/src/config-kwin.h.cmake @@ -48,3 +48,5 @@ #endif #cmakedefine PipeWire_FOUND 1 + +#cmakedefine HAVE_XWAYLAND_LISTENFD diff --git a/src/xwl/xwayland.cpp b/src/xwl/xwayland.cpp index 21fd143f36..56695ccbd4 100644 --- a/src/xwl/xwayland.cpp +++ b/src/xwl/xwayland.cpp @@ -215,6 +215,22 @@ bool Xwayland::startInternal() m_xcbConnectionFd = sx[0]; + QStringList arguments { + m_socket->name(), + QStringLiteral("-displayfd"), QString::number(pipeFds[1]), + QStringLiteral("-rootless"), + QStringLiteral("-wm"), QString::number(fd), + QStringLiteral("-auth"), m_authorityFile.fileName(), + }; + +#if defined(HAVE_XWAYLAND_LISTENFD) + arguments << QStringLiteral("-listenfd") << QString::number(abstractSocket) + << QStringLiteral("-listenfd") << QString::number(unixSocket); +#else + arguments << QStringLiteral("-listen") << QString::number(abstractSocket) + << QStringLiteral("-listen") << QString::number(unixSocket); +#endif + m_xwaylandProcess = new Process(this); m_xwaylandProcess->setProcessChannelMode(QProcess::ForwardedErrorChannel); m_xwaylandProcess->setProgram(QStringLiteral("Xwayland")); @@ -225,13 +241,7 @@ bool Xwayland::startInternal() env.insert("WAYLAND_DEBUG", QByteArrayLiteral("1")); } m_xwaylandProcess->setProcessEnvironment(env); - m_xwaylandProcess->setArguments({m_socket->name(), - QStringLiteral("-displayfd"), QString::number(pipeFds[1]), - QStringLiteral("-rootless"), - QStringLiteral("-wm"), QString::number(fd), - QStringLiteral("-auth"), m_authorityFile.fileName(), - QStringLiteral("-listen"), QString::number(abstractSocket), - QStringLiteral("-listen"), QString::number(unixSocket)}); + m_xwaylandProcess->setArguments(arguments); connect(m_xwaylandProcess, &QProcess::errorOccurred, this, &Xwayland::handleXwaylandError); connect(m_xwaylandProcess, QOverload::of(&QProcess::finished), this, &Xwayland::handleXwaylandFinished);