mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
2.9 KiB
127 lines
2.9 KiB
/* |
|
ksmserver - the KDE session management server |
|
|
|
SPDX-FileCopyrightText: 2016 Martin Graesslin <[email protected]> |
|
SPDX-FileCopyrightText: 2018 David Edmundson <[email protected]> |
|
|
|
SPDX-License-Identifier: MIT |
|
*/ |
|
|
|
#include "greeter.h" |
|
|
|
#include <QApplication> |
|
#include <QDebug> |
|
#include <QScreen> |
|
|
|
#include "shutdowndlg.h" |
|
|
|
#include "ksmserveriface.h" |
|
#include "logoutpromptadaptor.h" |
|
|
|
#include <KQuickAddons/QtQuickSettings> |
|
#include <KWindowSystem> |
|
#include <LayerShellQt/Shell> |
|
|
|
Greeter::Greeter() |
|
: QObject() |
|
{ |
|
new LogoutPromptAdaptor(this); |
|
QDBusConnection::sessionBus().registerObject(QStringLiteral("/LogoutPrompt"), this); |
|
QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.LogoutPrompt")); |
|
} |
|
|
|
Greeter::~Greeter() |
|
{ |
|
qDeleteAll(m_dialogs); |
|
} |
|
|
|
void Greeter::setupWaylandIntegration() |
|
{ |
|
if (!KWindowSystem::isPlatformWayland()) { |
|
return; |
|
} |
|
LayerShellQt::Shell::useLayerShell(); |
|
} |
|
|
|
void Greeter::init() |
|
{ |
|
setupWaylandIntegration(); |
|
const auto screens = qApp->screens(); |
|
for (QScreen *screen : screens) { |
|
adoptScreen(screen); |
|
} |
|
connect(qApp, &QGuiApplication::screenAdded, this, &Greeter::adoptScreen); |
|
m_running = true; |
|
} |
|
|
|
void Greeter::adoptScreen(QScreen *screen) |
|
{ |
|
if (screen->geometry().isNull()) { |
|
return; |
|
} |
|
// TODO: last argument is the theme, maybe add command line option for it? |
|
KSMShutdownDlg *w = new KSMShutdownDlg(nullptr, m_shutdownType, screen); |
|
w->installEventFilter(this); |
|
m_dialogs << w; |
|
|
|
QObject::connect(screen, &QObject::destroyed, w, [w, this] { |
|
m_dialogs.removeOne(w); |
|
w->deleteLater(); |
|
}); |
|
connect(w, &KSMShutdownDlg::rejected, this, &Greeter::rejected); |
|
connect(w, &KSMShutdownDlg::accepted, this, []() { |
|
QApplication::exit(1); |
|
}); |
|
w->setGeometry(screen->geometry()); |
|
w->init(); |
|
} |
|
|
|
void Greeter::rejected() |
|
{ |
|
QApplication::exit(1); |
|
} |
|
|
|
bool Greeter::eventFilter(QObject *watched, QEvent *event) |
|
{ |
|
if (qobject_cast<KSMShutdownDlg *>(watched)) { |
|
if (event->type() == QEvent::MouseButtonPress) { |
|
// check that the position is on no window |
|
QMouseEvent *me = static_cast<QMouseEvent *>(event); |
|
for (auto it = m_dialogs.constBegin(); it != m_dialogs.constEnd(); ++it) { |
|
if ((*it)->geometry().contains(me->globalPos())) { |
|
return false; |
|
} |
|
} |
|
// click outside, close |
|
rejected(); |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
void Greeter::promptLogout() |
|
{ |
|
if (m_running) { |
|
return; |
|
} |
|
m_shutdownType = KWorkSpace::ShutdownTypeNone; |
|
init(); |
|
} |
|
|
|
void Greeter::promptShutDown() |
|
{ |
|
if (m_running) { |
|
return; |
|
} |
|
m_shutdownType = KWorkSpace::ShutdownTypeHalt; |
|
init(); |
|
} |
|
|
|
void Greeter::promptReboot() |
|
{ |
|
if (m_running) { |
|
return; |
|
} |
|
m_shutdownType = KWorkSpace::ShutdownTypeReboot; |
|
init(); |
|
}
|
|
|