Hello community, here is the log from the commit of package plasma5-workspace for openSUSE:Factory checked in at 2018-03-30 12:06:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/plasma5-workspace (Old) and /work/SRC/openSUSE:Factory/.plasma5-workspace.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "plasma5-workspace" Fri Mar 30 12:06:38 2018 rev:88 rq:592013 version:5.12.4 Changes: -------- --- /work/SRC/openSUSE:Factory/plasma5-workspace/plasma5-workspace.changes 2018-03-20 21:49:51.676364100 +0100 +++ /work/SRC/openSUSE:Factory/.plasma5-workspace.new/plasma5-workspace.changes 2018-03-30 12:06:53.690879217 +0200 @@ -1,0 +2,46 @@ +Wed Mar 28 11:46:36 UTC 2018 - [email protected] + +- Don't require plasma5-workspace in plasma5-workspace-devel, + it pulls in a lot of unnecessary requirements and can cause + build loops + +------------------------------------------------------------------- +Tue Mar 27 15:40:48 CEST 2018 - [email protected] + +- Update to 5.12.4 + * New bugfix release + * For more details please see: + * https://www.kde.org/announcements/plasma-5.12.4.php +- Changes since 5.12.3: + * [notifications applet] Fix two qml warnings about assigning [undefined] + * Remove long-time deprecated Encoding=UTF-8 from desktop format files + * [Run Command] Pass "event" to runCurrentIndex + * Move to KRunner's second results item with a single keypress (kde#392197) + * Pass proper click coordinates to SNI ContextMenu calls + * libdbusmenu-qt: Remove nonexistant actions directly from the menu + * Set a transient parent for SNI context menus + * [DeviceNotifications Engine] Never show safely remove message when mounting (kde#391180) + * Use dbus-run-session instead of dbus-launch --exit-with-session + * [System Tray] Fix hiding applets with HiddenStatus + * [Notifications] Remove NoAccessNetworkAccessManagerFactory + * Improve By Desktop sorting for task groups (kde#384747) + * Use separate config group for each wallpaper plugin + * Fix duplicated [Desktop Entry] sections in two menu directory files +- Remove patches, now upstream: + * 0001-Use-dbus-run-session-instead-of-dbus-launch-exit-wit.patch + +------------------------------------------------------------------- +Sat Mar 24 11:11:34 UTC 2018 - [email protected] + +- Add patches to not set QT_QPA_PLATFORM in a wayland session: + * 0001-Call-KLocalizedString-setApplicationDomain-after-Q-A.patch + * 0002-Add-platform-detection-to-KWorkspace-library-to-adju.patch + * 0003-No-longer-export-QT_QPA_PLATFORM-env-variable-to-the.patch + * 0001-Set-XDG_SESSION_TYPE-wayland-in-startplasmacomposito.patch +- Set GDK_BACKEND=x11 to work around GTK3 bugs: + * 0001-Set-GTK_BACKEND-x11-in-a-wayland-session.patch +- Add a suffix to the wayland session's name: + * 0001-Add-suffix-to-the-wayland-session-s-name.patch +- Apply upstream patches before downstream patches + +------------------------------------------------------------------- Old: ---- 0001-Use-dbus-run-session-instead-of-dbus-launch-exit-wit.patch plasma-workspace-5.12.3.tar.xz New: ---- 0001-Add-suffix-to-the-wayland-session-s-name.patch 0001-Call-KLocalizedString-setApplicationDomain-after-Q-A.patch 0001-Set-GTK_BACKEND-x11-in-a-wayland-session.patch 0001-Set-XDG_SESSION_TYPE-wayland-in-startplasmacomposito.patch 0002-Add-platform-detection-to-KWorkspace-library-to-adju.patch 0003-No-longer-export-QT_QPA_PLATFORM-env-variable-to-the.patch plasma-workspace-5.12.4.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ plasma5-workspace.spec ++++++ --- /var/tmp/diff_new_pack.2bWMEM/_old 2018-03-30 12:06:57.158753829 +0200 +++ /var/tmp/diff_new_pack.2bWMEM/_new 2018-03-30 12:06:57.162753685 +0200 @@ -27,7 +27,7 @@ %{!?_plasma5_bugfix: %global _plasma5_bugfix %{version}} # Lasted ABI-stable Plasma (e.g. 5.8 in KF5, but 5.9.1 in KUF) %{!?_plasma5_version: %global _plasma5_version %(echo %{_plasma5_bugfix} | awk -F. '{print $1"."$2}')} -Version: 5.12.3 +Version: 5.12.4 Release: 0 Summary: The KDE Plasma Workspace Components License: GPL-2.0+ @@ -35,13 +35,21 @@ Url: http://www.kde.org/ Source: http://download.kde.org/stable/plasma/%{version}/plasma-workspace-%{version}.tar.xz Source1: baselibs.conf +# PATCHES 000-100 and above are from upstream 5.12 branch +# PATCHES 101-500 are from upstream master/5.13 branch +Patch201: 0001-Call-KLocalizedString-setApplicationDomain-after-Q-A.patch +Patch202: 0002-Add-platform-detection-to-KWorkspace-library-to-adju.patch +Patch203: 0003-No-longer-export-QT_QPA_PLATFORM-env-variable-to-the.patch +# PATCHES 501-??? are PATCH-FIX-OPENSUSE # PATCH-FIX-OPENSUSE 0001-Rename-qdbus-in-startkde.patch [email protected] -- Rename the qdbus executable in startkde -Patch0: 0001-Rename-qdbus-in-startkde.patch +Patch501: 0001-Rename-qdbus-in-startkde.patch # PATCH-FIX-OPENSUSE 0001-Ignore-default-sddm-face-icons.patch boo#1001364 [email protected] -- Ignore default sddm face icons -Patch1: 0001-Ignore-default-sddm-face-icons.patch -# PATCHES 100-200 and above are from upstream 5.12 branch -Patch100: 0001-Use-dbus-run-session-instead-of-dbus-launch-exit-wit.patch -# PATCHES 201-300 and above are from upstream master/5.13 branch +Patch502: 0001-Ignore-default-sddm-face-icons.patch +Patch503: 0001-Set-GTK_BACKEND-x11-in-a-wayland-session.patch +# PATCH-FIX-UPSTREAM (once sddm part merged) +Patch504: 0001-Add-suffix-to-the-wayland-session-s-name.patch +# PATCH-FIX-UPSTRAM (or alternative solution) +Patch505: 0001-Set-XDG_SESSION_TYPE-wayland-in-startplasmacomposito.patch BuildRequires: breeze5-icons BuildRequires: fdupes BuildRequires: kf5-filesystem @@ -194,7 +202,6 @@ %package devel Summary: The KDE Plasma Workspace Components Group: Development/Libraries/KDE -Requires: %{name} >= %{version} Requires: %{name}-libs = %{version}-%{release} Requires: cmake(KF5SysGuard) >= %{_plasma5_version} Requires: cmake(KF5Wayland) >= %{kf5_version} ++++++ 0001-Add-suffix-to-the-wayland-session-s-name.patch ++++++ >From e430354b3628d250cba1e271ddc13024b4f59d8a Mon Sep 17 00:00:00 2001 From: Fabian Vogt <[email protected]> Date: Sat, 24 Mar 2018 14:51:47 +0100 Subject: [PATCH] Add suffix to the wayland session's name Sddm added the prefix previously, this is not the case anymore. --- plasmawayland.desktop.cmake | 46 +-------------------------------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/plasmawayland.desktop.cmake b/plasmawayland.desktop.cmake index 5d7db306..d2f98ee0 100644 --- a/plasmawayland.desktop.cmake +++ b/plasmawayland.desktop.cmake @@ -2,51 +2,7 @@ Exec=dbus-run-session ${CMAKE_INSTALL_FULL_BINDIR}/startplasmacompositor TryExec=${CMAKE_INSTALL_FULL_BINDIR}/startplasmacompositor DesktopNames=KDE -Name=Plasma -Name[ar]=بلازما -Name[bs]=Plazma -Name[ca]=Plasma -Name[ca@valencia]=Plasma -Name[cs]=Plasma -Name[da]=Plasma -Name[de]=Plasma -Name[el]=Plasma -Name[en_GB]=Plasma -Name[es]=Plasma -Name[et]=Plasma -Name[eu]=Plasma -Name[fi]=Plasma -Name[fr]=Plasma -Name[gl]=Plasma -Name[he]=פלזמה -Name[hu]=Plasma -Name[id]=Plasma -Name[is]=Plasma -Name[it]=Plasma -Name[ja]=プラズマ -Name[ko]=Plasma -Name[lt]=Plasma -Name[nb]=Plasma -Name[nds]=Plasma -Name[nl]=Plasma -Name[nn]=Plasma -Name[pa]=ਪਲਾਜ਼ਮਾ -Name[pl]=Plazma -Name[pt]=Plasma -Name[pt_BR]=Plasma -Name[ru]=Plasma -Name[sk]=Plasma -Name[sl]=Plasma -Name[sr]=Плазма -Name[sr@ijekavian]=Плазма -Name[sr@ijekavianlatin]=Plasma -Name[sr@latin]=Plasma -Name[sv]=Plasma -Name[tr]=Plama -Name[uk]=Плазма -Name[x-test]=xxPlasmaxx -Name[zh_CN]=Plasma -Name[zh_TW]=Plasma +Name=Plasma (Wayland) Comment=Plasma by KDE Comment[ar]=بلازما كدي Comment[bs]=Plazma od strane KDe -- 2.16.2 ++++++ 0001-Call-KLocalizedString-setApplicationDomain-after-Q-A.patch ++++++ >From 6eb5d00b48a67b415c0770434dbb6bc8a0e6d9d9 Mon Sep 17 00:00:00 2001 From: "Friedrich W. H. Kossebau" <[email protected]> Date: Sat, 10 Feb 2018 00:34:10 +0100 Subject: [PATCH 1/3] Call KLocalizedString::setApplicationDomain after Q*App creation As now recommended, to ensure all locale settings are done from Qt side --- klipper/main.cpp | 2 +- krunner/main.cpp | 3 +-- shell/main.cpp | 3 +-- startkde/kcminit/main.cpp | 2 +- systemmonitor/main.cpp | 3 +-- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/klipper/main.cpp b/klipper/main.cpp index 58a07783..36539b63 100644 --- a/klipper/main.cpp +++ b/klipper/main.cpp @@ -34,8 +34,8 @@ extern "C" int Q_DECL_EXPORT kdemain(int argc, char *argv[]) { - KLocalizedString::setApplicationDomain("klipper"); QApplication app(argc, argv); + KLocalizedString::setApplicationDomain("klipper"); KAboutData aboutData(QStringLiteral("klipper"), i18n("Klipper"), diff --git a/krunner/main.cpp b/krunner/main.cpp index b63156d2..24fe5a9f 100644 --- a/krunner/main.cpp +++ b/krunner/main.cpp @@ -43,10 +43,9 @@ int main(int argc, char **argv) qunsetenv("QT_DEVICE_PIXEL_RATIO"); QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); - KLocalizedString::setApplicationDomain("krunner"); - QQuickWindow::setDefaultAlphaBuffer(true); QApplication app(argc, argv); + KLocalizedString::setApplicationDomain("krunner"); KQuickAddons::QtQuickSettings::init(); diff --git a/shell/main.cpp b/shell/main.cpp index ed42ed40..22ef0388 100644 --- a/shell/main.cpp +++ b/shell/main.cpp @@ -56,9 +56,8 @@ int main(int argc, char *argv[]) QQuickWindow::setDefaultAlphaBuffer(true); - KLocalizedString::setApplicationDomain("plasmashell"); - QApplication app(argc, argv); + KLocalizedString::setApplicationDomain("plasmashell"); // The executable's path is added to the library/plugin paths. // This does not make much sense for plasmashell. diff --git a/startkde/kcminit/main.cpp b/startkde/kcminit/main.cpp index 6d6692b9..7181281c 100644 --- a/startkde/kcminit/main.cpp +++ b/startkde/kcminit/main.cpp @@ -221,9 +221,9 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char *argv[]) startup = ( strcmp( argv[ 0 ], "kcminit_startup" ) == 0 ); // started from startkde? - KLocalizedString::setApplicationDomain("kcminit"); QGuiApplication::setDesktopSettingsAware(false); QGuiApplication app(argc, argv); //gui is needed for several modules + KLocalizedString::setApplicationDomain("kcminit"); KAboutData about(QStringLiteral("kcminit"), i18n("KCMInit"), QString(), i18n("KCMInit - runs startup initialization for Control Modules."), KAboutLicense::GPL); KAboutData::setApplicationData(about); diff --git a/systemmonitor/main.cpp b/systemmonitor/main.cpp index 5e6be4f8..ccf6cae7 100644 --- a/systemmonitor/main.cpp +++ b/systemmonitor/main.cpp @@ -25,9 +25,8 @@ int main(int argc, char** argv) { - KLocalizedString::setApplicationDomain("systemmonitor"); - QApplication app(argc, argv); + KLocalizedString::setApplicationDomain("systemmonitor"); app.setOrganizationDomain(QStringLiteral("kde.org")); app.setDesktopFileName(QStringLiteral("org.kde.systemmonitor")); -- 2.16.2 ++++++ 0001-Set-GTK_BACKEND-x11-in-a-wayland-session.patch ++++++ >From 6de8c88ad78bb5b3d6e599b7dacd1b2359cf4fbb Mon Sep 17 00:00:00 2001 From: Fabian Vogt <[email protected]> Date: Sat, 24 Mar 2018 12:15:10 +0100 Subject: [PATCH] Set GTK_BACKEND=x11 in a wayland session Works around missing window decorations and broken config file reading. --- startkde/startplasmacompositor.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/startkde/startplasmacompositor.cmake b/startkde/startplasmacompositor.cmake index dd9e304d..53be3be8 100644 --- a/startkde/startplasmacompositor.cmake +++ b/startkde/startplasmacompositor.cmake @@ -174,6 +174,10 @@ XDG_DATA_DIRS="@KDE_INSTALL_FULL_DATADIR@:/usr/share:/usr/local/share" fi export XDG_DATA_DIRS +# GTK3 uses the wayland backend by default, but its implementation is not correct +# enough to work well here. Window decorations are missing, for instance. +export GDK_BACKEND=x11 + # Make sure that D-Bus is running if qdbus-qt5 >/dev/null 2>/dev/null; then : # ok -- 2.16.2 ++++++ 0001-Set-XDG_SESSION_TYPE-wayland-in-startplasmacomposito.patch ++++++ >From f7fd48a7103c20e1484d7d07de650729ff48eda5 Mon Sep 17 00:00:00 2001 From: Fabian Vogt <[email protected]> Date: Sat, 24 Mar 2018 19:43:19 +0100 Subject: [PATCH] Set XDG_SESSION_TYPE=wayland in startplasmacompositor KWorkSpace::detectPlatform uses that, so make sure it's set. --- startkde/startplasmacompositor.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/startkde/startplasmacompositor.cmake b/startkde/startplasmacompositor.cmake index 53be3be8..7be28e32 100644 --- a/startkde/startplasmacompositor.cmake +++ b/startkde/startplasmacompositor.cmake @@ -222,6 +222,9 @@ export KDE_SESSION_UID XDG_CURRENT_DESKTOP=KDE export XDG_CURRENT_DESKTOP +XDG_SESSION_TYPE=wayland +export XDG_SESSION_TYPE + # kwin_wayland can possibly also start dbus-activated services which need env variables. # In that case, the update in startplasma might be too late. if which dbus-update-activation-environment >/dev/null 2>/dev/null ; then -- 2.16.2 ++++++ 0002-Add-platform-detection-to-KWorkspace-library-to-adju.patch ++++++ >From 909eff21cca3cdb08ed683b126d83e20aa266608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Fl=C3=B6ser?= <[email protected]> Date: Sun, 25 Feb 2018 09:15:07 +0100 Subject: [PATCH 2/3] Add platform detection to KWorkspace library to adjust QT_QPA_PLATFORM Summary: This is a preparation step to unset QT_QPA_PLATFORM from the wayland startup session script. Setting QT_QPA_PLATFORM breaks 3rd-party Qt software which does not bundle QtWayland. Most prominent example is the Qt installer itself (see https://bugreports.qt.io/browse/QTBUG-60222). On the other hand our Plasma workspace applications need to be forced to Wayland on a Wayland system. So we have a conflict between we want to set QT_QPA_PLATFORM and we don't want to set QT_QPA_PLATFORM. This change adds new API to KWorkspace to address this problem. The new method adjusts the QT_QPA_PLATFORM based on the XDG_SESSION_TYPE enviornment variable. It is completely opt-in. Meaning applications need to explicitly add the call prior to creating the QGuiApplication and if the user specifies either QT_QPA_PLATFORM env variable or any of the -platform command line argument variants, the platform detection is skipped. The change also adjusts all plasma-workspace applications which should use Wayland on Wayland to use the new API. The startup script on the other hand still sets QT_QPA_PLATFORM. We also have applications outside of plasma-workspace which needs this detection. Examples are: * powerdevil * systemsettings * kinfocenter Once this change is merged those applications can be adjusted by linking against PW::KWorkspace and afterwards QT_QPA_PLATFORM can be unset from startplasmacompositor. Test Plan: See added autotest Reviewers: #plasma Subscribers: plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D10816 --- krunner/CMakeLists.txt | 3 +- krunner/main.cpp | 2 + ksmserver/logout-greeter/main.cpp | 1 + ksmserver/switchuser-greeter/main.cpp | 1 + ksplash/ksplashqml/CMakeLists.txt | 1 + ksplash/ksplashqml/main.cpp | 3 + kuiserver/CMakeLists.txt | 1 + kuiserver/main.cpp | 3 + libkworkspace/CMakeLists.txt | 4 + libkworkspace/autotests/CMakeLists.txt | 5 + libkworkspace/autotests/testPlatformDetection.cpp | 128 ++++++++++++++++++++++ libkworkspace/kworkspace.cpp | 24 ++++ libkworkspace/kworkspace.h | 15 +++ shell/CMakeLists.txt | 1 + shell/main.cpp | 2 + startkde/kcminit/CMakeLists.txt | 4 +- startkde/kcminit/main.cpp | 2 + systemmonitor/CMakeLists.txt | 1 + systemmonitor/main.cpp | 3 + 19 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 libkworkspace/autotests/CMakeLists.txt create mode 100644 libkworkspace/autotests/testPlatformDetection.cpp diff --git a/krunner/CMakeLists.txt b/krunner/CMakeLists.txt index c73216e4..46aa92f8 100644 --- a/krunner/CMakeLists.txt +++ b/krunner/CMakeLists.txt @@ -23,6 +23,7 @@ target_link_libraries(krunner KF5::Crash KF5::WaylandClient KF5::QuickAddons + PW::KWorkspace ) target_compile_definitions(krunner PRIVATE -DPROJECT_VERSION="${PROJECT_VERSION}") @@ -38,4 +39,4 @@ ecm_configure_package_config_file(KRunnerAppDBusInterfaceConfig.cmake.in install(FILES ${CMAKE_CURRENT_BINARY_DIR}/KRunnerAppDBusInterfaceConfig.cmake DESTINATION ${CMAKECONFIG_INSTALL_DIR}) -add_subdirectory(update) \ No newline at end of file +add_subdirectory(update) diff --git a/krunner/main.cpp b/krunner/main.cpp index 24fe5a9f..06bf47c0 100644 --- a/krunner/main.cpp +++ b/krunner/main.cpp @@ -33,6 +33,7 @@ #include <kdeclarative/qmlobject.h> #include <KQuickAddons/QtQuickSettings> +#include <kworkspace.h> #include "view.h" @@ -43,6 +44,7 @@ int main(int argc, char **argv) qunsetenv("QT_DEVICE_PIXEL_RATIO"); QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); + KWorkSpace::detectPlatform(argc, argv); QQuickWindow::setDefaultAlphaBuffer(true); QApplication app(argc, argv); KLocalizedString::setApplicationDomain("krunner"); diff --git a/ksmserver/logout-greeter/main.cpp b/ksmserver/logout-greeter/main.cpp index a94442be..369bc08f 100644 --- a/ksmserver/logout-greeter/main.cpp +++ b/ksmserver/logout-greeter/main.cpp @@ -166,6 +166,7 @@ int main(int argc, char *argv[]) // Qt does not currently (5.9.4) support fullscreen on xdg_shell v6. qputenv("QT_WAYLAND_SHELL_INTEGRATION", "wl-shell"); + KWorkSpace::detectPlatform(argc, argv); QQuickWindow::setDefaultAlphaBuffer(true); QApplication app(argc, argv); diff --git a/ksmserver/switchuser-greeter/main.cpp b/ksmserver/switchuser-greeter/main.cpp index cbacb9fc..22200a43 100644 --- a/ksmserver/switchuser-greeter/main.cpp +++ b/ksmserver/switchuser-greeter/main.cpp @@ -138,6 +138,7 @@ int main(int argc, char *argv[]) // Qt does not currently (5.9.4) support fullscreen on xdg_shell v6. qputenv("QT_WAYLAND_SHELL_INTEGRATION", "wl-shell"); + KWorkSpace::detectPlatform(argc, argv); QQuickWindow::setDefaultAlphaBuffer(true); QGuiApplication app(argc, argv); diff --git a/ksplash/ksplashqml/CMakeLists.txt b/ksplash/ksplashqml/CMakeLists.txt index 105cd022..b4ad34ef 100644 --- a/ksplash/ksplashqml/CMakeLists.txt +++ b/ksplash/ksplashqml/CMakeLists.txt @@ -16,6 +16,7 @@ target_link_libraries(ksplashqml KF5::QuickAddons KF5::WaylandClient KF5::WindowSystem + PW::KWorkspace ) install(TARGETS ksplashqml ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/ksplash/ksplashqml/main.cpp b/ksplash/ksplashqml/main.cpp index 25faacde..a97c3d60 100644 --- a/ksplash/ksplashqml/main.cpp +++ b/ksplash/ksplashqml/main.cpp @@ -23,6 +23,8 @@ #include <QTextStream> +#include <kworkspace.h> + #include <iostream> #include <unistd.h> @@ -88,6 +90,7 @@ int main(int argc, char **argv) //enable to send log output to /tmp/ksplash //which is useful for debugging // qInstallMsgHandler(myMessageHandler); + KWorkSpace::detectPlatform(argc, argv); QQuickWindow::setDefaultAlphaBuffer(true); SplashApp app(argc, argv); diff --git a/kuiserver/CMakeLists.txt b/kuiserver/CMakeLists.txt index 7e79076e..4787b828 100644 --- a/kuiserver/CMakeLists.txt +++ b/kuiserver/CMakeLists.txt @@ -60,6 +60,7 @@ endif () target_link_libraries(kdeinit_kuiserver5 + PW::KWorkspace Qt5::DBus KF5::ConfigWidgets KF5::DBusAddons diff --git a/kuiserver/main.cpp b/kuiserver/main.cpp index 2d8a5b6f..07df24a6 100644 --- a/kuiserver/main.cpp +++ b/kuiserver/main.cpp @@ -27,12 +27,15 @@ #include <kdbusservice.h> +#include <kworkspace.h> + #include <QCommandLineParser> Q_LOGGING_CATEGORY(KUISERVER, "kuiserver", QtInfoMsg) extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) { + KWorkSpace::detectPlatform(argc, argv); QApplication app(argc, argv); app.setApplicationName(QStringLiteral("kuiserver")); app.setApplicationVersion(QStringLiteral("2.0")); diff --git a/libkworkspace/CMakeLists.txt b/libkworkspace/CMakeLists.txt index b31ffc69..0f779040 100644 --- a/libkworkspace/CMakeLists.txt +++ b/libkworkspace/CMakeLists.txt @@ -73,3 +73,7 @@ install(EXPORT libkworkspaceLibraryTargets NAMESPACE PW:: DESTINATION ${CMAKECONFIG_INSTALL_DIR} FILE LibKWorkspaceLibraryTargets.cmake ) + +if(BUILD_TESTING) + add_subdirectory(autotests) +endif() diff --git a/libkworkspace/autotests/CMakeLists.txt b/libkworkspace/autotests/CMakeLists.txt new file mode 100644 index 00000000..4409dc6d --- /dev/null +++ b/libkworkspace/autotests/CMakeLists.txt @@ -0,0 +1,5 @@ +include(ECMMarkAsTest) +add_executable(testPlatformDetection testPlatformDetection.cpp) +target_link_libraries(testPlatformDetection Qt5::Test PW::KWorkspace) +add_test(NAME kworkspace-testPlatformDetection COMMAND testPlatformDetection) +ecm_mark_as_test(testPlatformDetection) diff --git a/libkworkspace/autotests/testPlatformDetection.cpp b/libkworkspace/autotests/testPlatformDetection.cpp new file mode 100644 index 00000000..8e06afb1 --- /dev/null +++ b/libkworkspace/autotests/testPlatformDetection.cpp @@ -0,0 +1,128 @@ +/* + * Copyright 2018 Martin Flöser <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QtTest/QtTest> + +#include "../kworkspace.h" + +#include <vector> + +class TestPlatformDetection : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void init(); + void testPlatformSelection_data(); + void testPlatformSelection(); + void testArguments_data(); + void testArguments(); + void testQtQpaPlatformIsSet_data(); + void testQtQpaPlatformIsSet(); +}; + +void TestPlatformDetection::init() +{ + qunsetenv("QT_QPA_PLATFORM"); + qunsetenv("XDG_SESSION_TYPE"); +} + +void TestPlatformDetection::testPlatformSelection_data() +{ + QTest::addColumn<QByteArray>("xdgSessionType"); + QTest::addColumn<QByteArray>("expectedQtQpaPlatform"); + + QTest::newRow("wayland") << QByteArrayLiteral("wayland") << QByteArrayLiteral("wayland"); + QTest::newRow("x11") << QByteArrayLiteral("x11") << QByteArrayLiteral("xcb"); + QTest::newRow("unknown") << QByteArrayLiteral("mir") << QByteArray(); +} + +void TestPlatformDetection::testPlatformSelection() +{ + QVERIFY(!qEnvironmentVariableIsSet("QT_QPA_PLATFORM")); + QFETCH(QByteArray, xdgSessionType); + qputenv("XDG_SESSION_TYPE", xdgSessionType); + + std::vector<QByteArray> cppArgv{ + QByteArrayLiteral("testPlatformDetction") + }; + std::vector<char*> argv; + for (QByteArray &arg : cppArgv) { + argv.push_back(arg.data()); + } + KWorkSpace::detectPlatform(1, argv.data()); + QTEST(qgetenv("QT_QPA_PLATFORM"), "expectedQtQpaPlatform"); +} + +void TestPlatformDetection::testArguments_data() +{ + QTest::addColumn<QByteArray>("arg"); + + QTest::newRow("-platform") << QByteArrayLiteral("-platform"); + QTest::newRow("--platform") << QByteArrayLiteral("--platform"); + QTest::newRow("-platform=wayland") << QByteArrayLiteral("-platform=wayland"); + QTest::newRow("--platform=wayland") << QByteArrayLiteral("--platform=wayland"); +} + +void TestPlatformDetection::testArguments() +{ + QVERIFY(!qEnvironmentVariableIsSet("QT_QPA_PLATFORM")); + qputenv("XDG_SESSION_TYPE", "wayland"); + + QFETCH(QByteArray, arg); + std::vector<QByteArray> cppArgv{ + QByteArrayLiteral("testPlatformDetction"), + arg, + QByteArrayLiteral("wayland") + }; + std::vector<char*> argv; + for (QByteArray &arg : cppArgv) { + argv.push_back(arg.data()); + } + KWorkSpace::detectPlatform(3, argv.data()); + QVERIFY(!qEnvironmentVariableIsSet("QT_QPA_PLATFORM")); +} + +void TestPlatformDetection::testQtQpaPlatformIsSet_data() +{ + QTest::addColumn<QByteArray>("qtQpaPlatform"); + QTest::addColumn<QByteArray>("xdgSessionType"); + + QTest::newRow("xcb - x11") << QByteArrayLiteral("xcb") << QByteArrayLiteral("x11"); + QTest::newRow("xcb - wayland") << QByteArrayLiteral("xcb") << QByteArrayLiteral("wayland"); + QTest::newRow("wayland - x11") << QByteArrayLiteral("wayland") << QByteArrayLiteral("x11"); + QTest::newRow("wayland - wayland") << QByteArrayLiteral("wayland") << QByteArrayLiteral("wayland"); + QTest::newRow("windows - x11") << QByteArrayLiteral("windows") << QByteArrayLiteral("x11"); +} + +void TestPlatformDetection::testQtQpaPlatformIsSet() +{ + // test verifies that if QT_QPA_PLATFORM is set the env variable does not get adjusted + QFETCH(QByteArray, qtQpaPlatform); + QFETCH(QByteArray, xdgSessionType); + qputenv("QT_QPA_PLATFORM", qtQpaPlatform); + qputenv("XDG_SESSION_TYPE", xdgSessionType); + + KWorkSpace::detectPlatform(0, nullptr); + QCOMPARE(qgetenv("QT_QPA_PLATFORM"), qtQpaPlatform); +} + +QTEST_GUILESS_MAIN(TestPlatformDetection) + +#include "testPlatformDetection.moc" diff --git a/libkworkspace/kworkspace.cpp b/libkworkspace/kworkspace.cpp index 444270d8..5b0b2505 100644 --- a/libkworkspace/kworkspace.cpp +++ b/libkworkspace/kworkspace.cpp @@ -260,6 +260,30 @@ void propagateSessionManager() #endif } +void detectPlatform(int argc, char **argv) +{ + if (qEnvironmentVariableIsSet("QT_QPA_PLATFORM")) { + return; + } + for (int i = 0; i < argc; i++) { + if (qstrcmp(argv[i], "-platform") == 0 || + qstrcmp(argv[i], "--platform") == 0 || + QByteArray(argv[i]).startsWith("-platform=") || + QByteArray(argv[i]).startsWith("--platform=")) { + return; + } + } + const QByteArray sessionType = qgetenv("XDG_SESSION_TYPE"); + if (sessionType.isEmpty()) { + return; + } + if (qstrcmp(sessionType, "wayland") == 0) { + qputenv("QT_QPA_PLATFORM", "wayland"); + } else if (qstrcmp(sessionType, "x11") == 0) { + qputenv("QT_QPA_PLATFORM", "xcb"); + } +} + } // end namespace diff --git a/libkworkspace/kworkspace.h b/libkworkspace/kworkspace.h index 6cfc94fe..44025674 100644 --- a/libkworkspace/kworkspace.h +++ b/libkworkspace/kworkspace.h @@ -150,6 +150,21 @@ namespace KWorkSpace */ KWORKSPACE_EXPORT void propagateSessionManager(); + /** + * Performs platform detection and adjusts QT_QPA_PLATFORM environment + * variable to either xcb or wayland depending on the detected platform. + * + * The detection is based on the XDG_SESSION_TYPE environment variable. + * The detection is skipped in case QT_QPA_PLATFORM is already set or + * if one of the command line arguments contains the "-platform" variable. + * + * In order to make use of this function, it has to be invoked before the + * QGuiApplication instance is constructed. Invoking after constructing the + * QGuiApplication has no effect. + * @since 5.13 + **/ + KWORKSPACE_EXPORT void detectPlatform(int argc, char **argv); + } #endif diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt index 04ad01ae..b5f53f84 100644 --- a/shell/CMakeLists.txt +++ b/shell/CMakeLists.txt @@ -93,6 +93,7 @@ target_link_libraries(plasmashell KF5::XmlGui KF5::Package KF5::WaylandClient + PW::KWorkspace ) target_include_directories(plasmashell PRIVATE "${CMAKE_BINARY_DIR}") target_compile_definitions(plasmashell PRIVATE -DPROJECT_VERSION="${PROJECT_VERSION}") diff --git a/shell/main.cpp b/shell/main.cpp index 22ef0388..09cca77a 100644 --- a/shell/main.cpp +++ b/shell/main.cpp @@ -31,6 +31,7 @@ #include <kdbusservice.h> #include <klocalizedstring.h> #include <kcrash.h> +#include <kworkspace.h> #include "shellcorona.h" #include "standaloneappcorona.h" @@ -56,6 +57,7 @@ int main(int argc, char *argv[]) QQuickWindow::setDefaultAlphaBuffer(true); + KWorkSpace::detectPlatform(argc, argv); QApplication app(argc, argv); KLocalizedString::setApplicationDomain("plasmashell"); diff --git a/startkde/kcminit/CMakeLists.txt b/startkde/kcminit/CMakeLists.txt index 783c1966..00f024e9 100644 --- a/startkde/kcminit/CMakeLists.txt +++ b/startkde/kcminit/CMakeLists.txt @@ -14,7 +14,7 @@ qt5_add_dbus_interface(kcminit_KDEINIT_SRCS ${klauncher_xml} klauncher_iface) kf5_add_kdeinit_executable( kcminit ${kcminit_KDEINIT_SRCS}) -target_link_libraries(kdeinit_kcminit Qt5::Core Qt5::Gui Qt5::DBus KF5::CoreAddons KF5::Service KF5::I18n) +target_link_libraries(kdeinit_kcminit Qt5::Core Qt5::Gui Qt5::DBus KF5::CoreAddons KF5::Service KF5::I18n PW::KWorkspace) if (XCB_XCB_FOUND) target_link_libraries(kdeinit_kcminit XCB::XCB) endif() @@ -32,7 +32,7 @@ set(kcminit_startup_KDEINIT_SRCS main.cpp) qt5_add_dbus_interface(kcminit_startup_KDEINIT_SRCS ${klauncher_xml} klauncher_iface) kf5_add_kdeinit_executable( kcminit_startup ${kcminit_startup_KDEINIT_SRCS}) -target_link_libraries(kdeinit_kcminit_startup Qt5::Core Qt5::Gui Qt5::DBus KF5::CoreAddons KF5::Service KF5::I18n) +target_link_libraries(kdeinit_kcminit_startup Qt5::Core Qt5::Gui Qt5::DBus KF5::CoreAddons KF5::Service KF5::I18n PW::KWorkspace) if (XCB_XCB_FOUND) target_link_libraries(kdeinit_kcminit_startup XCB::XCB) endif() diff --git a/startkde/kcminit/main.cpp b/startkde/kcminit/main.cpp index 7181281c..6ac26bda 100644 --- a/startkde/kcminit/main.cpp +++ b/startkde/kcminit/main.cpp @@ -42,6 +42,7 @@ #include <kconfiggroup.h> #include <klocalizedstring.h> #include <kservicetypetrader.h> +#include <kworkspace.h> static int ready[ 2 ]; static bool startup = false; @@ -221,6 +222,7 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char *argv[]) startup = ( strcmp( argv[ 0 ], "kcminit_startup" ) == 0 ); // started from startkde? + KWorkSpace::detectPlatform(argc, argv); QGuiApplication::setDesktopSettingsAware(false); QGuiApplication app(argc, argv); //gui is needed for several modules KLocalizedString::setApplicationDomain("kcminit"); diff --git a/systemmonitor/CMakeLists.txt b/systemmonitor/CMakeLists.txt index e952d9ed..f925cb63 100644 --- a/systemmonitor/CMakeLists.txt +++ b/systemmonitor/CMakeLists.txt @@ -25,6 +25,7 @@ target_link_libraries(systemmonitor KF5::XmlGui KF5::GlobalAccel KF5::WindowSystem + PW::KWorkspace ) install(TARGETS systemmonitor DESTINATION ${KDE_INSTALL_BINDIR}) diff --git a/systemmonitor/main.cpp b/systemmonitor/main.cpp index ccf6cae7..7311580b 100644 --- a/systemmonitor/main.cpp +++ b/systemmonitor/main.cpp @@ -21,10 +21,13 @@ #include <QDBusConnection> #include <KLocalizedString> +#include <kworkspace.h> + #include "ksystemactivitydialog.h" int main(int argc, char** argv) { + KWorkSpace::detectPlatform(argc, argv); QApplication app(argc, argv); KLocalizedString::setApplicationDomain("systemmonitor"); -- 2.16.2 ++++++ 0003-No-longer-export-QT_QPA_PLATFORM-env-variable-to-the.patch ++++++ >From 9dd3d4711ac74fd9d93344db7e6c2691026f21c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Fl=C3=B6ser?= <[email protected]> Date: Sun, 18 Mar 2018 11:08:02 +0100 Subject: [PATCH 3/3] No longer export QT_QPA_PLATFORM env variable to the session Summary: As discussed the env variables are no longer exported. Thus Qt applications follow the default qpa platform they are compiled with and thus still function if they are packaged with a Qt without QtWayland. Plasma's internal processes pick the qpa platform depending on the session type as well as our flatpak apps. KRunner and Plasmashell are adjusted to not leak the env variable they set for themselves. Test Plan: Started a wayland session, verified with KWin's debug console that plasmashell and krunner are wayland. Launched kwrite from both plasma and krunner and verified that it's xcb Reviewers: #plasma Subscribers: plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D11447 --- krunner/main.cpp | 5 +++++ shell/main.cpp | 5 +++++ startkde/startplasmacompositor.cmake | 4 ---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/krunner/main.cpp b/krunner/main.cpp index 06bf47c0..329eca7e 100644 --- a/krunner/main.cpp +++ b/krunner/main.cpp @@ -44,9 +44,14 @@ int main(int argc, char **argv) qunsetenv("QT_DEVICE_PIXEL_RATIO"); QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); + const bool qpaVariable = qEnvironmentVariableIsSet("QT_QPA_PLATFORM"); KWorkSpace::detectPlatform(argc, argv); QQuickWindow::setDefaultAlphaBuffer(true); QApplication app(argc, argv); + if (!qpaVariable) { + // don't leak the env variable to processes we start + qunsetenv("QT_QPA_PLATFORM"); + } KLocalizedString::setApplicationDomain("krunner"); KQuickAddons::QtQuickSettings::init(); diff --git a/shell/main.cpp b/shell/main.cpp index 09cca77a..037eb8f3 100644 --- a/shell/main.cpp +++ b/shell/main.cpp @@ -57,8 +57,13 @@ int main(int argc, char *argv[]) QQuickWindow::setDefaultAlphaBuffer(true); + const bool qpaVariable = qEnvironmentVariableIsSet("QT_QPA_PLATFORM"); KWorkSpace::detectPlatform(argc, argv); QApplication app(argc, argv); + if (!qpaVariable) { + // don't leak the env variable to processes we start + qunsetenv("QT_QPA_PLATFORM"); + } KLocalizedString::setApplicationDomain("plasmashell"); // The executable's path is added to the library/plugin paths. diff --git a/startkde/startplasmacompositor.cmake b/startkde/startplasmacompositor.cmake index 8ac47aa7..dd9e304d 100644 --- a/startkde/startplasmacompositor.cmake +++ b/startkde/startplasmacompositor.cmake @@ -218,10 +218,6 @@ export KDE_SESSION_UID XDG_CURRENT_DESKTOP=KDE export XDG_CURRENT_DESKTOP -#enforce wayland QPA -QT_QPA_PLATFORM=wayland -export QT_QPA_PLATFORM - # kwin_wayland can possibly also start dbus-activated services which need env variables. # In that case, the update in startplasma might be too late. if which dbus-update-activation-environment >/dev/null 2>/dev/null ; then -- 2.16.2 ++++++ plasma-workspace-5.12.3.tar.xz -> plasma-workspace-5.12.4.tar.xz ++++++ ++++ 12332 lines of diff (skipped)
