--- kscreenlocker-5.12.9/CMakeLists.txt.old 2019-09-10 10:30:52.000000000 +0000 +++ kscreenlocker-5.12.9/CMakeLists.txt 2019-12-29 16:39:31.945860585 +0000 @@ -73,16 +73,16 @@ find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS X11Extras) -find_package(KF5Wayland CONFIG REQUIRED) +find_package(KF5Wayland) set_package_properties(KF5Wayland PROPERTIES - TYPE REQUIRED - PURPOSE "Required for building screenlocker") + TYPE OPTIONAL + PURPOSE "Required for building Wayland screenlocker") find_package(WaylandScanner) find_package(Wayland 1.3 COMPONENTS Client Server) set_package_properties(Wayland PROPERTIES - TYPE REQUIRED - PURPOSE "Required for building screenlocker") + TYPE OPTIONAL + PURPOSE "Required for building Wayland screenlocker") find_package(loginctl) set_package_properties(loginctl PROPERTIES @@ -138,9 +138,7 @@ interface.cpp globalaccel.cpp x11locker.cpp - waylandlocker.cpp logind.cpp - waylandserver.cpp powermanagement.cpp powermanagement_inhibition.cpp ) @@ -149,10 +147,20 @@ kconfig_add_kcfg_files(ksld_SRCS kcfg/kscreensaversettings.kcfgc) qt5_add_dbus_interface(ksld_SRCS ${powerdevilpolicyagent_xml} powerdevilpolicyagent) +if(KF5Wayland_FOUND) +list(APPEND ksld_SRCS + waylandlocker.cpp + waylandserver.cpp +) ecm_add_wayland_server_protocol(ksld_SRCS PROTOCOL protocols/ksld.xml BASENAME ksld ) +set(OPT_WL_LIBRARIES + KF5::WaylandServer + Wayland::Server +) +endif(KF5Wayland_FOUND) add_library(KScreenLocker SHARED ${ksld_SRCS}) @@ -171,8 +179,7 @@ ${X11_LIBRARIES} XCB::XCB XCB::KEYSYMS - KF5::WaylandServer - Wayland::Server + ${OPT_WL_LIBRARIES} ) if (X11_Xinput_FOUND) --- kscreenlocker-5.12.9/ksldapp.cpp.old 2019-09-10 10:30:16.000000000 +0000 +++ kscreenlocker-5.12.9/ksldapp.cpp 2019-12-29 17:00:37.930322855 +0000 @@ -38,9 +38,11 @@ #include <KNotification> #include <KGlobalAccel> +#ifdef WAYLAND_FOUND //kwayland #include <KWayland/Server/display.h> #include <KWayland/Server/clientconnection.h> +#endif // Qt #include <QAction> @@ -84,8 +86,10 @@ , m_lockState(Unlocked) , m_lockProcess(NULL) , m_lockWindow(NULL) +#ifdef WAYLAND_FOUND , m_waylandServer(new WaylandServer(this)) , m_waylandDisplay(nullptr) +#endif /* WAYLAND_FOUND */ , m_lockedTimer(QElapsedTimer()) , m_idleId(0) , m_lockGrace(0) @@ -96,8 +100,12 @@ , m_greeterEnv(QProcessEnvironment::systemEnvironment()) , m_powerManagementInhibition(new PowerManagementInhibition(this)) { +#ifdef WAYLAND_FOUND m_isX11 = QX11Info::isPlatformX11(); m_isWayland = QCoreApplication::instance()->property("platformName").toString().startsWith( QLatin1String("wayland"), Qt::CaseInsensitive); +#else + m_isX11 = true; +#endif } KSldApp::~KSldApp() @@ -215,9 +223,11 @@ auto finishedSignal = static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished); connect(m_lockProcess, finishedSignal, this, [this](int exitCode, QProcess::ExitStatus exitStatus) { +#ifdef WAYLAND_FOUND if (m_isWayland && m_waylandDisplay && m_greeterClientConnection) { m_greeterClientConnection->destroy(); } +#endif /* WAYLAND_FOUND */ if ((!exitCode && exitStatus == QProcess::NormalExit) || s_graceTimeKill || s_logindExit) { // unlock process finished successfully - we can remove the lock grab s_graceTimeKill = false; @@ -240,7 +250,9 @@ [this](QProcess::ProcessError error) { if (error == QProcess::FailedToStart) { doUnlock(); +#ifdef WAYLAND_FOUND m_waylandServer->stop(); +#endif /* WAYLAND_FOUND */ qCritical() << "Greeter Process not available"; } } @@ -533,7 +545,9 @@ m_lockedTimer.invalidate(); m_greeterCrashedCounter = 0; endGraceTime(); +#ifdef WAYLAND_FOUND m_waylandServer->stop(); +#endif /* WAYLAND_FOUND */ KNotification::event(QStringLiteral("unlocked"), i18n("Screen unlocked"), QPixmap(), @@ -553,6 +567,7 @@ { QProcessEnvironment env = m_greeterEnv; +#ifdef WAYLAND_FOUND if (m_isWayland && m_waylandDisplay) { int sx[2]; if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sx) < 0) { @@ -576,6 +591,7 @@ env.insert("WAYLAND_SOCKET", QByteArray::number(socket)); } } +#endif /* WAYLAND_FOUND */ QStringList args; if (establishLock == EstablishLock::Immediate) { args << QStringLiteral("--immediateLock"); @@ -596,6 +612,7 @@ env.insert(s_qtQuickBackend, QStringLiteral("software")); } +#ifdef WAYLAND_FOUND // start the Wayland server int fd = m_waylandServer->start(); if (fd == -1) { @@ -605,10 +622,13 @@ args << QStringLiteral("--ksldfd"); args << QString::number(fd); +#endif /* WAYLAND_FOUND */ m_lockProcess->setProcessEnvironment(env); m_lockProcess->start(QStringLiteral(KSCREENLOCKER_GREET_BIN), args); +#ifdef WAYLAND_FOUND close(fd); +#endif } void KSldApp::showLockWindow() @@ -617,9 +637,11 @@ if (m_isX11) { m_lockWindow = new X11Locker(this); } +#ifdef WAYLAND_FOUND if (m_isWayland) { m_lockWindow = new WaylandLocker(m_waylandDisplay, this); } +#endif /* WAYLAND_FOUND */ if (!m_lockWindow) { return; } @@ -637,7 +659,9 @@ lockScreenShown(); } , Qt::QueuedConnection); +#ifdef WAYLAND_FOUND connect(m_waylandServer, &WaylandServer::x11WindowAdded, m_lockWindow, &AbstractLocker::addAllowedWindow); +#endif /* WAYLAND_FOUND */ } m_lockWindow->showLockWindow(); if (m_isX11) { @@ -702,12 +726,14 @@ } } +#ifdef WAYLAND_FOUND void KSldApp::setWaylandDisplay(KWayland::Server::Display *display) { if (m_waylandDisplay != display) { m_waylandDisplay = display; } } +#endif /* WAYLAND_FOUND */ void KSldApp::lockScreenShown() { @@ -723,9 +749,11 @@ void KSldApp::setGreeterEnvironment(const QProcessEnvironment &env) { m_greeterEnv = env; +#ifdef WAYLAND_FOUND if (m_isWayland) { m_greeterEnv.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("wayland")); } +#endif /* WAYLAND_FOUND */ } bool KSldApp::event(QEvent *event) --- kscreenlocker-5.12.9/autotests/CMakeLists.txt.old 2019-09-10 10:30:16.000000000 +0000 +++ kscreenlocker-5.12.9/autotests/CMakeLists.txt 2019-12-29 17:16:10.540254516 +0000 @@ -55,6 +55,7 @@ add_test(ksmserver-x11LockerTest x11LockerTest) ecm_mark_as_test(x11LockerTest) +if(KF5Wayland_FOUND) ####################################### # NoScreensTest ####################################### @@ -67,3 +68,4 @@ ) add_test(ksld-noScreensTest noScreensTest) ecm_mark_as_test(noScreensTest) +endif() --- kscreenlocker-5.12.9/greeter/greeterapp.cpp.old 2019-09-10 10:30:16.000000000 +0000 +++ kscreenlocker-5.12.9/greeter/greeterapp.cpp 2019-12-29 17:14:57.458241696 +0000 @@ -26,6 +26,7 @@ #include "lnf_integration.h" #include <config-kscreenlocker.h> +#include <config-workspace.h> // KDE #include <KAuthorized> @@ -40,12 +41,14 @@ #include <KPackage/Package> #include <KPackage/PackageStructure> #include <KPackage/PackageLoader> +#ifdef WAYLAND_FOUND // KWayland #include <KWayland/Client/connection_thread.h> #include <KWayland/Client/event_queue.h> #include <KWayland/Client/plasmashell.h> #include <KWayland/Client/registry.h> #include <KWayland/Client/surface.h> +#endif // Qt #include <QClipboard> #include <QAbstractNativeEventFilter> @@ -63,9 +66,11 @@ #include <QQmlExpression> #include <QX11Info> +#ifdef WAYLAND_FOUND // Wayland #include <wayland-client.h> #include <wayland-ksld-client-protocol.h> +#endif // X11 #include <X11/Xatom.h> #include <X11/Xlib.h> @@ -137,6 +142,7 @@ } qDeleteAll(m_views); +#ifdef WAYLAND_FOUND if (m_ksldInterface) { org_kde_ksld_destroy(m_ksldInterface); } @@ -148,6 +154,7 @@ m_ksldConnectionThread->quit(); m_ksldConnectionThread->wait(); } +#endif /* WAYLAND_FOUND */ } Authenticator *UnlockApp::createAuthenticator() @@ -165,7 +172,10 @@ void UnlockApp::initialize() { +#ifdef WAYLAND_FOUND initializeWayland(); +#endif /* WAYLAND_FOUND */ + // set up the request ignore timeout, so that multiple requests to sleep/suspend/shutdown // are not processed in quick (and confusing) succession) m_resetRequestIgnoreTimer->setSingleShot(true); @@ -205,6 +215,7 @@ if (!platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) { return; } +#ifdef WAYLAND_FOUND using namespace KWayland::Client; auto *c = ConnectionThread::fromApplication(this); if (!c) { @@ -219,6 +230,7 @@ return; } m_plasmaShell = r->createPlasmaShell(i.name, i.version, this); +#endif /* WAYLAND_FOUND */ } void UnlockApp::loadWallpaperPlugin(KQuickAddons::QuickViewSharedEngine *view) @@ -281,6 +293,7 @@ } } +#ifdef WAYLAND_FOUND if (m_ksldInterface) { view->create(); org_kde_ksld_x11window(m_ksldInterface, view->winId()); @@ -294,6 +307,7 @@ view->setProperty("plasmaShellSurface", QVariant::fromValue(shellSurface)); } } +#endif /* WAYLAND_FOUND */ // engine stuff QQmlContext* context = view->engine()->rootContext(); @@ -353,10 +367,14 @@ auto screen = QGuiApplication::screens()[i]; view->setGeometry(screen->geometry()); +#ifdef WAYLAND_FOUND KWayland::Client::PlasmaShellSurface *plasmaSurface = view->property("plasmaShellSurface").value<KWayland::Client::PlasmaShellSurface *>(); if (plasmaSurface) { plasmaSurface->setPosition(view->geometry().topLeft()); } +#else + void *plasmaSurface = nullptr; +#endif /* WAYLAND_FOUND */ if (auto object = view->property("wallpaperGraphicsObject").value<KDeclarative::QmlObjectSharedEngine*>()) { //initialize with our size to avoid as much resize events as possible object->completeInitialization({ @@ -370,9 +388,11 @@ view, [view, plasmaSurface](const QRect &geo) { view->setGeometry(geo); +#ifdef WAYLAND_FOUND if (plasmaSurface) { plasmaSurface->setPosition(view->geometry().topLeft()); } +#endif /* WAYLAND_FOUND */ } ); @@ -477,6 +497,7 @@ void UnlockApp::suspendToRam() { +#ifdef WAYLAND_FOUND if (m_ignoreRequests) { return; } @@ -485,11 +506,12 @@ m_resetRequestIgnoreTimer->start(); org_kde_ksld_suspendSystem(m_ksldInterface); - +#endif /* WAYLAND_FOUND */ } void UnlockApp::suspendToDisk() { +#ifdef WAYLAND_FOUND if (m_ignoreRequests) { return; } @@ -498,6 +520,7 @@ m_resetRequestIgnoreTimer->start(); org_kde_ksld_hibernateSystem(m_ksldInterface); +#endif /* WAYLAND_FOUND */ } void UnlockApp::setTesting(bool enable) @@ -626,7 +649,7 @@ m_defaultToSwitchUser = defaultToSwitchUser; } - +#ifdef WAYLAND_FOUND static void osdProgress(void *data, org_kde_ksld *org_kde_ksld, const char *icon, int32_t percent, const char *text) { Q_UNUSED(org_kde_ksld) @@ -657,9 +680,11 @@ canSuspend, canHibernate }; +#endif /* WAYLAND_FOUND */ void UnlockApp::setKsldSocket(int socket) { +#ifdef WAYLAND_FOUND using namespace KWayland::Client; m_ksldConnection = new ConnectionThread; m_ksldConnection->setSocketFd(socket); @@ -697,6 +722,7 @@ m_ksldConnection->moveToThread(m_ksldConnectionThread); m_ksldConnectionThread->start(); m_ksldConnection->initConnection(); +#endif /* WAYLAND_FOUND */ } void UnlockApp::osdProgress(const QString &icon, int percent, const QString &additionalText) --- kscreenlocker-5.12.9/greeter/CMakeLists.txt.old 2019-09-10 10:30:16.000000000 +0000 +++ kscreenlocker-5.12.9/greeter/CMakeLists.txt 2019-12-29 17:29:44.832222068 +0000 @@ -24,10 +24,16 @@ qt5_add_resources(kscreenlocker_greet_SRCS fallbacktheme.qrc) kconfig_add_kcfg_files(kscreenlocker_greet_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/../kcfg/kscreensaversettings.kcfgc) +if(KF5Wayland_FOUND) ecm_add_wayland_client_protocol(kscreenlocker_greet_SRCS PROTOCOL ../protocols/ksld.xml BASENAME ksld ) +set(OPT_WL_CLI_LIBRARIES + KF5::WaylandClient + Wayland::Client +) +endif() add_executable(kscreenlocker_greet ${kscreenlocker_greet_SRCS}) @@ -43,8 +49,7 @@ Qt5::Qml Qt5::X11Extras ${X11_LIBRARIES} - KF5::WaylandClient - Wayland::Client + ${OPT_WL_CLI_LIBRARIES} ) if(HAVE_SECCOMP) target_link_libraries(kscreenlocker_greet Qt5::DBus Seccomp::Seccomp)