diff --git a/CMakeLists.txt b/CMakeLists.txt index 369f9c4e64..cba770b91e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,6 +116,11 @@ set_package_properties(KF5Wayland PROPERTIES TYPE REQUIRED ) +find_package(KScreenLocker CONFIG REQUIRED) +set_package_properties(KScreenLocker PROPERTIES + TYPE REQUIRED + PURPOSE "For screenlocker integration in kwin_wayland") + find_package(EGL) set_package_properties(EGL PROPERTIES TYPE RUNTIME @@ -462,6 +467,7 @@ set(kwin_KDE_LIBS KF5::WindowSystem KDecoration2::KDecoration KDecoration2::KDecoration2Private + PW::KScreenLocker ) set(kwin_XLIB_LIBS diff --git a/main_wayland.cpp b/main_wayland.cpp index fc09aa7af9..e2881a4635 100644 --- a/main_wayland.cpp +++ b/main_wayland.cpp @@ -486,6 +486,10 @@ int main(int argc, char * argv[]) i18n("List all available backends and quit.")); parser.addOption(listBackendsOption); + QCommandLineOption screenLockerOption(QStringLiteral("lockscreen"), + i18n("Starts the session in locked mode.")); + parser.addOption(screenLockerOption); + parser.addPositionalArgument(QStringLiteral("applications"), i18n("Applications to start once Wayland and Xwayland server are started"), QStringLiteral("[/path/to/application...]")); @@ -578,7 +582,12 @@ int main(int argc, char * argv[]) // TODO: create backend without having the server running KWin::WaylandServer *server = KWin::WaylandServer::create(&a); - server->init(parser.value(waylandSocketOption).toUtf8()); + + KWin::WaylandServer::InitalizationFlags flags; + if (parser.isSet(screenLockerOption)) { + flags = KWin::WaylandServer::InitalizationFlag::LockScreen; + } + server->init(parser.value(waylandSocketOption).toUtf8(), flags); if (qobject_cast((*pluginIt).instantiate())) { #if HAVE_INPUT diff --git a/wayland_server.cpp b/wayland_server.cpp index 3bbf59f294..798ce4d2f8 100644 --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -53,6 +53,9 @@ along with this program. If not, see . #include #include +//screenlocker +#include + using namespace KWayland::Server; namespace KWin @@ -77,8 +80,9 @@ WaylandServer::~WaylandServer() } } -void WaylandServer::init(const QByteArray &socketName) +void WaylandServer::init(const QByteArray &socketName, InitalizationFlags flags) { + m_initFlags = flags; m_display = new KWayland::Server::Display(this); if (!socketName.isNull() && !socketName.isEmpty()) { m_display->setSocketName(QString::fromUtf8(socketName)); @@ -206,6 +210,10 @@ void WaylandServer::initWorkspace() } ); } + ScreenLocker::KSldApp::self(); + if (m_initFlags.testFlag(InitalizationFlag::LockScreen)) { + ScreenLocker::KSldApp::self()->lock(ScreenLocker::EstablishLock::Immediate); + } } void WaylandServer::initOutputs() diff --git a/wayland_server.h b/wayland_server.h index 2be2d2272e..b9bda4df83 100644 --- a/wayland_server.h +++ b/wayland_server.h @@ -62,8 +62,15 @@ class KWIN_EXPORT WaylandServer : public QObject { Q_OBJECT public: + enum class InitalizationFlag { + NoOptions = 0x0, + LockScreen = 0x1 + }; + + Q_DECLARE_FLAGS(InitalizationFlags, InitalizationFlag) + virtual ~WaylandServer(); - void init(const QByteArray &socketName = QByteArray()); + void init(const QByteArray &socketName = QByteArray(), InitalizationFlags flags = InitalizationFlag::NoOptions); void initOutputs(); KWayland::Server::Display *display() { @@ -159,6 +166,7 @@ private: QList m_clients; QList m_internalClients; QHash m_clientIds; + InitalizationFlags m_initFlags; KWIN_SINGLETON(WaylandServer) };