2022-04-07 16:03:49 +03:00
|
|
|
/* This file is part of the KDE project
|
|
|
|
Copyright (C) 2022 Ivailo Monev <xakepa10@gmail.com>
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
License version 2, as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
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
|
|
|
|
Library General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
|
|
Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
#define QT_NO_KEYWORDS
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QSettings>
|
|
|
|
#include <QMainWindow>
|
|
|
|
#include <QPainter>
|
|
|
|
#include <KMessageBox>
|
|
|
|
#include <KIcon>
|
2022-04-02 15:53:45 +03:00
|
|
|
#include <KStandardDirs>
|
2022-04-01 16:31:45 +03:00
|
|
|
#include <KGlobalSettings>
|
|
|
|
#include <KSharedConfig>
|
|
|
|
#include <KLocale>
|
2022-12-06 10:07:06 +02:00
|
|
|
#include <KDebug>
|
2022-04-01 16:31:45 +03:00
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
#include <lightdm-gobject-1/lightdm.h>
|
|
|
|
|
2022-04-26 11:02:28 +03:00
|
|
|
#include "kgreeter.h"
|
2022-04-01 16:31:45 +03:00
|
|
|
#include "ui_kgreeter.h"
|
2022-04-01 19:30:16 +03:00
|
|
|
#include "config-workspace.h"
|
2022-04-01 16:31:45 +03:00
|
|
|
|
|
|
|
// for the callbacks
|
2022-04-28 12:02:15 +03:00
|
|
|
static const int gliblooppolltime = 400;
|
2022-04-01 16:31:45 +03:00
|
|
|
static GMainLoop *glibloop = NULL;
|
|
|
|
|
2023-08-07 01:33:34 +03:00
|
|
|
static QSettings kgreetersettings(KDE_SYSCONFDIR "/lightdm/lightdm-kgreeter-greeter.conf");
|
2022-04-01 16:31:45 +03:00
|
|
|
|
2022-12-06 10:07:06 +02:00
|
|
|
static QString glibErrorString(const GError *const gliberror)
|
|
|
|
{
|
|
|
|
if (!gliberror) {
|
|
|
|
return i18n("Unknown error");
|
|
|
|
}
|
|
|
|
return QString::fromUtf8(gliberror->message);
|
|
|
|
}
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
class KGreeter : public QMainWindow
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
explicit KGreeter(QWidget *parent = nullptr);
|
2022-04-03 19:22:28 +03:00
|
|
|
~KGreeter();
|
2022-04-01 16:31:45 +03:00
|
|
|
|
|
|
|
QByteArray getUser() const;
|
|
|
|
QByteArray getPass() const;
|
|
|
|
QByteArray getSession() const;
|
|
|
|
|
|
|
|
LightDMGreeter* getGreeter() const;
|
|
|
|
|
2022-04-03 19:43:04 +03:00
|
|
|
void clearPass();
|
2022-04-28 20:03:36 +03:00
|
|
|
void stopGlibPoll();
|
2022-04-03 19:43:04 +03:00
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
static void showPromptCb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr);
|
|
|
|
static void authenticationCompleteCb(LightDMGreeter *ldmgreeter, gpointer ldmptr);
|
|
|
|
static void showMessageCb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr);
|
|
|
|
|
|
|
|
// QMainWindow reimplementations
|
|
|
|
protected:
|
|
|
|
void paintEvent(QPaintEvent *event) final;
|
2022-04-03 19:22:28 +03:00
|
|
|
void timerEvent(QTimerEvent *event) final;
|
2022-04-01 16:31:45 +03:00
|
|
|
|
|
|
|
private Q_SLOTS:
|
|
|
|
void slotSuspend();
|
|
|
|
void slotHibernate();
|
|
|
|
void slotPoweroff();
|
|
|
|
void slotReboot();
|
|
|
|
|
|
|
|
void slotSession();
|
|
|
|
|
|
|
|
void slotLayout();
|
|
|
|
|
|
|
|
void slotLogin();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void setUser(const QString &user);
|
|
|
|
void setSession(const QString &session);
|
|
|
|
bool isUserLogged() const;
|
|
|
|
|
|
|
|
Ui::KGreeter m_ui;
|
|
|
|
LightDMGreeter *m_ldmgreeter;
|
|
|
|
QList<QAction*> m_sessionactions;
|
|
|
|
QList<QAction*> m_layoutactions;
|
|
|
|
QImage m_background;
|
2022-04-28 11:32:53 +03:00
|
|
|
QImage m_backgroundscaled;
|
2022-04-01 16:31:45 +03:00
|
|
|
QImage m_rectangle;
|
2022-04-28 10:55:37 +03:00
|
|
|
QImage m_rectanglescaled;
|
2022-04-03 19:22:28 +03:00
|
|
|
int m_timerid;
|
2022-04-01 16:31:45 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
KGreeter::KGreeter(QWidget *parent)
|
|
|
|
: QMainWindow(parent),
|
2022-04-03 19:22:28 +03:00
|
|
|
m_ldmgreeter(nullptr),
|
|
|
|
m_timerid(0)
|
2022-04-01 16:31:45 +03:00
|
|
|
{
|
|
|
|
#if !defined(GLIB_VERSION_2_36)
|
|
|
|
g_type_init();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
m_ui.setupUi(this);
|
|
|
|
|
2023-08-07 01:33:34 +03:00
|
|
|
m_background = QImage(kgreetersettings.string("greeter/background", KGreeterDefaultBackground()));
|
|
|
|
m_rectangle = QImage(kgreetersettings.string("greeter/rectangle", KGreeterDefaultRectangle()));
|
2022-04-01 16:31:45 +03:00
|
|
|
|
|
|
|
m_ldmgreeter = lightdm_greeter_new();
|
|
|
|
|
|
|
|
g_signal_connect(
|
|
|
|
m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT,
|
|
|
|
G_CALLBACK(KGreeter::showPromptCb), this
|
|
|
|
);
|
|
|
|
g_signal_connect(
|
|
|
|
m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE,
|
|
|
|
G_CALLBACK(KGreeter::authenticationCompleteCb), this
|
|
|
|
);
|
|
|
|
g_signal_connect(
|
|
|
|
m_ldmgreeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE,
|
|
|
|
G_CALLBACK(KGreeter::showMessageCb), this
|
|
|
|
);
|
|
|
|
|
|
|
|
// TODO: sort and then add
|
|
|
|
GList *ldmlayouts = lightdm_get_layouts();
|
|
|
|
for (GList *ldmitem = ldmlayouts; ldmitem; ldmitem = ldmitem->next) {
|
|
|
|
LightDMLayout *ldmlayout = static_cast<LightDMLayout*>(ldmitem->data);
|
|
|
|
Q_ASSERT(ldmlayout);
|
|
|
|
|
|
|
|
QAction* layoutaction = new QAction(m_ui.menuKeyboard);
|
|
|
|
layoutaction->setCheckable(true);
|
|
|
|
layoutaction->setText(QString::fromUtf8(lightdm_layout_get_description(ldmlayout)));
|
|
|
|
layoutaction->setData(QVariant(QString::fromUtf8(lightdm_layout_get_name(ldmlayout))));
|
|
|
|
connect(layoutaction, SIGNAL(triggered()), this, SLOT(slotLayout()));
|
|
|
|
m_ui.menuKeyboard->addAction(layoutaction);
|
|
|
|
m_layoutactions.append(layoutaction);
|
|
|
|
}
|
|
|
|
|
|
|
|
GList *ldmusers = lightdm_user_list_get_users(lightdm_user_list_get_instance());
|
|
|
|
for (GList *ldmitem = ldmusers; ldmitem; ldmitem = ldmitem->next) {
|
|
|
|
LightDMUser *ldmuser = static_cast<LightDMUser*>(ldmitem->data);
|
|
|
|
Q_ASSERT(ldmuser);
|
|
|
|
|
|
|
|
const QString ldmuserimage = QString::fromUtf8(lightdm_user_get_image(ldmuser));
|
|
|
|
if (!ldmuserimage.isEmpty()) {
|
|
|
|
m_ui.usersbox->addItem(QIcon(QPixmap(ldmuserimage)), QString::fromUtf8(lightdm_user_get_name(ldmuser)));
|
|
|
|
} else {
|
|
|
|
m_ui.usersbox->addItem(QString::fromUtf8(lightdm_user_get_name(ldmuser)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
GList *ldmsessions = lightdm_get_sessions();
|
|
|
|
for (GList* ldmitem = ldmsessions; ldmitem; ldmitem = ldmitem->next) {
|
|
|
|
LightDMSession *ldmsession = static_cast<LightDMSession*>(ldmitem->data);
|
|
|
|
Q_ASSERT(ldmsession);
|
|
|
|
|
|
|
|
const QString ldmsessionname = QString::fromUtf8(lightdm_session_get_name(ldmsession));
|
|
|
|
const QString ldmsessionkey = QString::fromUtf8(lightdm_session_get_key(ldmsession));
|
|
|
|
|
|
|
|
QAction* sessionaction = new QAction(m_ui.menuSessions);
|
|
|
|
sessionaction->setCheckable(true);
|
|
|
|
sessionaction->setText(ldmsessionname);
|
|
|
|
sessionaction->setData(QVariant(ldmsessionkey));
|
|
|
|
connect(sessionaction, SIGNAL(triggered()), this, SLOT(slotSession()));
|
|
|
|
m_ui.menuSessions->addAction(sessionaction);
|
|
|
|
m_sessionactions.append(sessionaction);
|
|
|
|
}
|
|
|
|
|
|
|
|
const QString ldmdefaultuser = QString::fromUtf8(lightdm_greeter_get_select_user_hint(m_ldmgreeter));
|
|
|
|
if (!ldmdefaultuser.isEmpty()) {
|
|
|
|
setUser(ldmdefaultuser);
|
|
|
|
}
|
|
|
|
const QString ldmdefaultsession = QString::fromUtf8(lightdm_greeter_get_default_session_hint(m_ldmgreeter));
|
|
|
|
if (!ldmdefaultsession.isEmpty()) {
|
|
|
|
setSession(ldmdefaultsession);
|
|
|
|
}
|
|
|
|
|
|
|
|
QSettings kgreeterstate("lightdm-kgreeter-state");
|
2023-08-07 01:33:34 +03:00
|
|
|
const QString lastuser = kgreeterstate.string("state/lastuser");
|
2022-04-01 16:31:45 +03:00
|
|
|
if (!lastuser.isEmpty()) {
|
|
|
|
setUser(lastuser);
|
|
|
|
}
|
2023-08-07 01:33:34 +03:00
|
|
|
const QString lastsession = kgreeterstate.string("state/lastsession");
|
2022-04-01 16:31:45 +03:00
|
|
|
if (!lastsession.isEmpty()) {
|
|
|
|
setSession(lastsession);
|
|
|
|
}
|
|
|
|
|
|
|
|
// if no default session is specified and no last session is saved use the first
|
|
|
|
bool sessionchecked = false;
|
2022-04-28 12:02:15 +03:00
|
|
|
Q_FOREACH (const QAction *sessionaction, m_sessionactions) {
|
2022-04-01 16:31:45 +03:00
|
|
|
if (sessionaction->isChecked()) {
|
|
|
|
sessionchecked = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!sessionchecked && !m_sessionactions.isEmpty()) {
|
|
|
|
m_sessionactions.first()->setChecked(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
m_ui.actionSuspend->setVisible(lightdm_get_can_suspend());
|
|
|
|
m_ui.actionSuspend->setIcon(KIcon("system-suspend"));
|
|
|
|
m_ui.actionHibernate->setVisible(lightdm_get_can_hibernate());
|
|
|
|
m_ui.actionHibernate->setIcon(KIcon("system-suspend-hibernate"));
|
|
|
|
m_ui.actionPoweroff->setVisible(lightdm_get_can_shutdown());
|
|
|
|
m_ui.actionPoweroff->setIcon(KIcon("system-shutdown"));
|
|
|
|
m_ui.actionReboot->setVisible(lightdm_get_can_restart());
|
|
|
|
m_ui.actionReboot->setIcon(KIcon("system-reboot"));
|
|
|
|
connect(m_ui.actionSuspend, SIGNAL(triggered()), this, SLOT(slotSuspend()));
|
|
|
|
connect(m_ui.actionHibernate, SIGNAL(triggered()), this, SLOT(slotHibernate()));
|
|
|
|
connect(m_ui.actionPoweroff, SIGNAL(triggered()), this, SLOT(slotPoweroff()));
|
|
|
|
connect(m_ui.actionReboot, SIGNAL(triggered()), this, SLOT(slotReboot()));
|
|
|
|
|
2022-04-29 14:45:19 +03:00
|
|
|
m_ui.grouplabel->setText(QString::fromUtf8(lightdm_get_hostname()));
|
2022-04-01 16:31:45 +03:00
|
|
|
if (lightdm_greeter_get_hide_users_hint(m_ldmgreeter)
|
|
|
|
|| lightdm_greeter_get_show_manual_login_hint(m_ldmgreeter)) {
|
|
|
|
m_ui.userlabel->setVisible(false);
|
|
|
|
m_ui.usersbox->setVisible(false);
|
|
|
|
m_ui.useredit->setFocus();
|
|
|
|
} else {
|
|
|
|
m_ui.userlabel2->setVisible(false);
|
|
|
|
m_ui.useredit->setVisible(false);
|
|
|
|
m_ui.passedit->setFocus();
|
|
|
|
}
|
2022-04-29 14:45:19 +03:00
|
|
|
|
|
|
|
connect(m_ui.passedit, SIGNAL(returnPressed()), this, SLOT(slotLogin()));
|
|
|
|
connect(m_ui.loginbutton, SIGNAL(pressed()), this, SLOT(slotLogin()));
|
2022-05-05 14:38:39 +03:00
|
|
|
|
|
|
|
m_timerid = startTimer(gliblooppolltime);
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
|
2022-04-03 19:22:28 +03:00
|
|
|
KGreeter::~KGreeter()
|
|
|
|
{
|
2022-04-29 08:41:55 +03:00
|
|
|
stopGlibPoll();
|
2022-04-03 19:22:28 +03:00
|
|
|
}
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
void KGreeter::paintEvent(QPaintEvent *event)
|
|
|
|
{
|
2022-04-28 11:32:53 +03:00
|
|
|
QPainter painter(this);
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
if (!m_background.isNull()) {
|
2022-04-28 12:02:15 +03:00
|
|
|
const QSize windowsize(size());
|
2022-04-28 11:32:53 +03:00
|
|
|
if (m_backgroundscaled.isNull() || windowsize != m_backgroundscaled.size()) {
|
2022-04-28 18:43:40 +03:00
|
|
|
m_backgroundscaled = m_background.scaled(windowsize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
2022-04-28 11:32:53 +03:00
|
|
|
}
|
|
|
|
painter.drawImage(QPoint(0, 0), m_backgroundscaled);
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!m_rectangle.isNull()) {
|
2022-04-12 19:18:23 +03:00
|
|
|
QSize kgreeterrectanglesize(m_ui.groupframe->size());
|
|
|
|
kgreeterrectanglesize.rwidth() = kgreeterrectanglesize.width() * 1.06;
|
|
|
|
kgreeterrectanglesize.rheight() = kgreeterrectanglesize.height() * 1.65;
|
|
|
|
QPointF kgreeterrectanglepoint(m_ui.groupframe->pos());
|
|
|
|
kgreeterrectanglepoint -= QPointF(kgreeterrectanglepoint.x() * 0.03 , 0);
|
2022-04-28 10:55:37 +03:00
|
|
|
if (m_rectanglescaled.isNull() || kgreeterrectanglesize != m_rectanglescaled.size()) {
|
2023-06-04 18:13:38 +03:00
|
|
|
m_ui.groupframe->setFrameShape(QFrame::NoFrame);
|
2022-04-28 10:55:37 +03:00
|
|
|
m_rectanglescaled = m_rectangle.scaled(kgreeterrectanglesize);
|
|
|
|
}
|
|
|
|
painter.drawImage(kgreeterrectanglepoint, m_rectanglescaled);
|
2022-04-01 16:31:45 +03:00
|
|
|
} else {
|
2022-04-12 19:18:23 +03:00
|
|
|
m_ui.groupframe->setFrameShape(QFrame::StyledPanel);
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
QMainWindow::paintEvent(event);
|
|
|
|
}
|
|
|
|
|
2022-04-03 19:22:28 +03:00
|
|
|
void KGreeter::timerEvent(QTimerEvent *event)
|
|
|
|
{
|
|
|
|
if (event->timerId() == m_timerid) {
|
|
|
|
g_main_context_iteration(g_main_loop_get_context(glibloop), false);
|
2022-04-28 11:44:19 +03:00
|
|
|
event->accept();
|
|
|
|
return;
|
2022-04-03 19:22:28 +03:00
|
|
|
}
|
2022-04-28 11:44:19 +03:00
|
|
|
|
2022-04-03 19:22:28 +03:00
|
|
|
QMainWindow::timerEvent(event);
|
|
|
|
}
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
QByteArray KGreeter::getUser() const
|
|
|
|
{
|
|
|
|
if (m_ui.useredit->isVisible()) {
|
|
|
|
return m_ui.useredit->text().toUtf8();
|
|
|
|
}
|
|
|
|
return m_ui.usersbox->currentText().toUtf8();
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray KGreeter::getPass() const
|
|
|
|
{
|
|
|
|
return m_ui.passedit->text().toUtf8();
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray KGreeter::getSession() const
|
|
|
|
{
|
|
|
|
Q_FOREACH (const QAction *sessionaction, m_sessionactions) {
|
|
|
|
if (sessionaction->isChecked()) {
|
|
|
|
return sessionaction->data().toByteArray();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Q_ASSERT(false);
|
|
|
|
return QByteArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
LightDMGreeter * KGreeter::getGreeter() const
|
|
|
|
{
|
|
|
|
return m_ldmgreeter;
|
|
|
|
}
|
|
|
|
|
2022-04-03 19:43:04 +03:00
|
|
|
void KGreeter::clearPass()
|
|
|
|
{
|
|
|
|
m_ui.passedit->clear();
|
|
|
|
if (m_ui.useredit->isVisible()) {
|
|
|
|
m_ui.useredit->setFocus();
|
|
|
|
} else {
|
|
|
|
m_ui.passedit->setFocus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-28 20:03:36 +03:00
|
|
|
void KGreeter::stopGlibPoll()
|
|
|
|
{
|
2022-04-29 08:41:55 +03:00
|
|
|
if (m_timerid > 0) {
|
|
|
|
killTimer(m_timerid);
|
|
|
|
}
|
|
|
|
if (glibloop) {
|
|
|
|
g_main_loop_unref(glibloop);
|
|
|
|
glibloop = nullptr;
|
|
|
|
}
|
2022-04-28 20:03:36 +03:00
|
|
|
}
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
void KGreeter::showPromptCb(LightDMGreeter *ldmgreeter, const char *ldmtext, LightDMPromptType ldmtype, gpointer ldmptr)
|
|
|
|
{
|
|
|
|
// qDebug() << Q_FUNC_INFO;
|
|
|
|
|
|
|
|
KGreeter* kgreeter = static_cast<KGreeter*>(ldmptr);
|
|
|
|
Q_ASSERT(kgreeter);
|
|
|
|
|
|
|
|
if (ldmtype == LIGHTDM_PROMPT_TYPE_SECRET) {
|
|
|
|
const QByteArray kgreeterpass = kgreeter->getPass();
|
|
|
|
|
|
|
|
g_autoptr(GError) gliberror = NULL;
|
|
|
|
if (!lightdm_greeter_respond(ldmgreeter, kgreeterpass.constData(), &gliberror)) {
|
2022-12-06 10:07:06 +02:00
|
|
|
kgreeter->statusBar()->showMessage(i18n("Failed to respond: %1", glibErrorString(gliberror)));
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::authenticationCompleteCb(LightDMGreeter *ldmgreeter, gpointer ldmptr)
|
|
|
|
{
|
|
|
|
// qDebug() << Q_FUNC_INFO;
|
|
|
|
|
|
|
|
KGreeter* kgreeter = static_cast<KGreeter*>(ldmptr);
|
|
|
|
Q_ASSERT(kgreeter);
|
|
|
|
|
|
|
|
const QByteArray kgreetersession = kgreeter->getSession();
|
|
|
|
|
2022-04-03 19:37:28 +03:00
|
|
|
if (!lightdm_greeter_get_is_authenticated(ldmgreeter)) {
|
|
|
|
kgreeter->statusBar()->showMessage(i18n("Failed to authenticate"));
|
2022-04-03 19:43:04 +03:00
|
|
|
kgreeter->clearPass();
|
2022-04-03 19:37:28 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
g_autoptr(GError) gliberror = NULL;
|
2022-04-03 19:37:28 +03:00
|
|
|
if (!lightdm_greeter_start_session_sync(ldmgreeter, kgreetersession.constData(), &gliberror)) {
|
2022-12-06 10:07:06 +02:00
|
|
|
kgreeter->statusBar()->showMessage(i18n("Failed to start session: %1", glibErrorString(gliberror)));
|
2022-04-03 19:43:04 +03:00
|
|
|
kgreeter->clearPass();
|
2022-04-03 19:37:28 +03:00
|
|
|
return;
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
2022-04-03 19:37:28 +03:00
|
|
|
|
2022-04-28 20:03:36 +03:00
|
|
|
kgreeter->stopGlibPoll();
|
|
|
|
|
2022-04-03 19:37:28 +03:00
|
|
|
qApp->quit();
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::showMessageCb(LightDMGreeter *ldmgreeter, const gchar *ldmtext, LightDMMessageType ldmtype, gpointer ldmptr)
|
|
|
|
{
|
|
|
|
// qDebug() << Q_FUNC_INFO;
|
|
|
|
|
|
|
|
KGreeter* kgreeter = static_cast<KGreeter*>(ldmptr);
|
|
|
|
Q_ASSERT(kgreeter);
|
|
|
|
|
|
|
|
kgreeter->statusBar()->showMessage(QString::fromUtf8(ldmtext));
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::slotSuspend()
|
|
|
|
{
|
|
|
|
g_autoptr(GError) gliberror = NULL;
|
|
|
|
if (!lightdm_suspend(&gliberror)) {
|
2022-12-06 10:07:06 +02:00
|
|
|
statusBar()->showMessage(i18n("Could not suspend: %1", glibErrorString(gliberror)));
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::slotHibernate()
|
|
|
|
{
|
|
|
|
g_autoptr(GError) gliberror = NULL;
|
|
|
|
if (!lightdm_hibernate(&gliberror)) {
|
2022-12-06 10:07:06 +02:00
|
|
|
statusBar()->showMessage(i18n("Could not hibernate: %1", glibErrorString(gliberror)));
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::slotPoweroff()
|
|
|
|
{
|
|
|
|
if (isUserLogged()) {
|
|
|
|
const int kmessageresult = KMessageBox::questionYesNo(
|
|
|
|
this,
|
|
|
|
i18n("There is user logged in, are you sure you want to poweroff?")
|
|
|
|
);
|
|
|
|
if (kmessageresult != KMessageBox::Yes) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
g_autoptr(GError) gliberror = NULL;
|
|
|
|
if (!lightdm_shutdown(&gliberror)) {
|
2022-12-06 10:07:06 +02:00
|
|
|
statusBar()->showMessage(i18n("Could not poweroff: %1", glibErrorString(gliberror)));
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::slotReboot()
|
|
|
|
{
|
|
|
|
if (isUserLogged()) {
|
|
|
|
const int kmessageresult = KMessageBox::questionYesNo(
|
|
|
|
this,
|
|
|
|
i18n("There is user logged in, are you sure you want to reboot?")
|
|
|
|
);
|
|
|
|
if (kmessageresult != KMessageBox::Yes) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
g_autoptr(GError) gliberror = NULL;
|
|
|
|
if (!lightdm_restart(&gliberror)) {
|
2022-12-06 10:07:06 +02:00
|
|
|
statusBar()->showMessage(i18n("Could not reboot: %1", glibErrorString(gliberror)));
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::slotSession()
|
|
|
|
{
|
|
|
|
const QAction* sessionaction = qobject_cast<QAction*>(sender());
|
|
|
|
const QString sessionname = sessionaction->data().toString();
|
|
|
|
|
|
|
|
Q_FOREACH (QAction *sessionaction, m_sessionactions) {
|
|
|
|
sessionaction->setChecked(false);
|
|
|
|
if (sessionaction->data().toString() == sessionname) {
|
|
|
|
sessionaction->setChecked(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::slotLayout()
|
|
|
|
{
|
|
|
|
QString ldmlayoutname;
|
|
|
|
|
|
|
|
const QAction* layoutaction = qobject_cast<QAction*>(sender());
|
|
|
|
const QString layoutname = layoutaction->data().toString();
|
|
|
|
GList *ldmlayouts = lightdm_get_layouts();
|
|
|
|
for (GList *ldmitem = ldmlayouts; ldmitem; ldmitem = ldmitem->next) {
|
|
|
|
LightDMLayout *ldmlayout = static_cast<LightDMLayout*>(ldmitem->data);
|
|
|
|
Q_ASSERT(ldmlayout);
|
|
|
|
|
|
|
|
ldmlayoutname = QString::fromUtf8(lightdm_layout_get_name(ldmlayout));
|
|
|
|
if (layoutname == ldmlayoutname) {
|
|
|
|
lightdm_set_layout(ldmlayout);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ldmlayoutname.isEmpty()) {
|
|
|
|
Q_ASSERT(false);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Q_FOREACH (QAction *layoutaction, m_layoutactions) {
|
|
|
|
layoutaction->setChecked(false);
|
|
|
|
if (layoutaction->data().toString() == ldmlayoutname) {
|
|
|
|
layoutaction->setChecked(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::slotLogin()
|
|
|
|
{
|
|
|
|
const QByteArray kgreeterusername = getUser();
|
|
|
|
const QByteArray kgreetersession = getSession();
|
|
|
|
|
|
|
|
// the trick is to save before lightdm_greeter_authenticate()
|
|
|
|
{
|
|
|
|
QSettings kgreeterstate("lightdm-kgreeter-state");
|
2023-08-07 01:33:34 +03:00
|
|
|
kgreeterstate.setString("state/lastsession", kgreetersession);
|
|
|
|
kgreeterstate.setString("state/lastuser", kgreeterusername);
|
2022-04-01 16:31:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
g_autoptr(GError) gliberror = NULL;
|
|
|
|
lightdm_greeter_authenticate(m_ldmgreeter, kgreeterusername.constData(), &gliberror);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::setUser(const QString &user)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < m_ui.usersbox->count(); i++) {
|
|
|
|
if (m_ui.usersbox->itemText(i) == user) {
|
|
|
|
m_ui.usersbox->setCurrentIndex(i);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_ui.useredit->setText(user);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KGreeter::setSession(const QString &session)
|
|
|
|
{
|
|
|
|
Q_FOREACH (QAction *sessionaction, m_sessionactions) {
|
|
|
|
sessionaction->setChecked(false);
|
|
|
|
if (sessionaction->data().toString() == session) {
|
|
|
|
sessionaction->setChecked(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool KGreeter::isUserLogged() const
|
|
|
|
{
|
|
|
|
GList *ldmusers = lightdm_user_list_get_users(lightdm_user_list_get_instance());
|
|
|
|
for (GList *ldmitem = ldmusers; ldmitem; ldmitem = ldmitem->next) {
|
|
|
|
LightDMUser *ldmuser = static_cast<LightDMUser*>(ldmitem->data);
|
|
|
|
Q_ASSERT(ldmuser);
|
|
|
|
|
|
|
|
if (lightdm_user_get_logged_in(ldmuser)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char**argv)
|
|
|
|
{
|
2022-12-06 10:07:06 +02:00
|
|
|
kDebug() << "starting kgreeter";
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
QApplication app(argc, argv);
|
|
|
|
|
2023-08-07 01:33:34 +03:00
|
|
|
const QString kgreeterfontstring = kgreetersettings.string("greeter/font");
|
2022-04-13 22:37:30 +03:00
|
|
|
QFont kgreeterfont;
|
|
|
|
if (!kgreeterfont.fromString(kgreeterfontstring)) {
|
2022-04-26 11:02:28 +03:00
|
|
|
kgreeterfont = KGreeterDefaultFont();
|
2022-04-13 22:37:30 +03:00
|
|
|
}
|
|
|
|
app.setFont(kgreeterfont);
|
|
|
|
|
2022-04-02 15:53:45 +03:00
|
|
|
// for the style
|
|
|
|
const QStringList pluginpaths = KGlobal::dirs()->resourceDirs("qtplugins");
|
|
|
|
Q_FOREACH (const QString &path, pluginpaths) {
|
2022-06-07 22:40:37 +03:00
|
|
|
app.addPluginPath(path);
|
2022-04-02 15:53:45 +03:00
|
|
|
}
|
|
|
|
|
2023-08-07 01:33:34 +03:00
|
|
|
const QString kgreeterstyle = kgreetersettings.string("greeter/style", KGreeterDefaultStyle());
|
2022-04-26 11:02:28 +03:00
|
|
|
app.setStyle(kgreeterstyle);
|
2022-04-01 16:31:45 +03:00
|
|
|
|
2023-08-07 01:33:34 +03:00
|
|
|
const QString kgreetercolorscheme = kgreetersettings.string("greeter/colorscheme");
|
2022-04-01 16:31:45 +03:00
|
|
|
if (!kgreetercolorscheme.isEmpty()) {
|
|
|
|
KSharedConfigPtr kcolorschemeconfig = KSharedConfig::openConfig(
|
|
|
|
QString::fromLatin1("color-schemes/%1.colors").arg(kgreetercolorscheme),
|
|
|
|
KConfig::FullConfig, "data"
|
|
|
|
);
|
|
|
|
app.setPalette(KGlobalSettings::createApplicationPalette(kcolorschemeconfig));
|
|
|
|
} else {
|
|
|
|
app.setPalette(KGlobalSettings::createApplicationPalette());
|
|
|
|
}
|
|
|
|
|
2023-08-07 01:33:34 +03:00
|
|
|
const QString kgreetercursortheme = kgreetersettings.string("greeter/cursortheme", KGreeterDefaultCursorTheme());
|
2022-05-24 15:20:56 +03:00
|
|
|
if (!kgreetercursortheme.isEmpty()) {
|
|
|
|
const QByteArray xcursorthemebytes = kgreetercursortheme.toAscii();
|
|
|
|
::setenv("XCURSOR_THEME", xcursorthemebytes.constData(), 1);
|
|
|
|
}
|
|
|
|
|
2022-04-01 16:31:45 +03:00
|
|
|
glibloop = g_main_loop_new(NULL, false);
|
|
|
|
|
|
|
|
KGreeter kgreeter;
|
|
|
|
kgreeter.showMaximized();
|
|
|
|
|
|
|
|
LightDMGreeter *ldmgreeter = kgreeter.getGreeter();
|
|
|
|
|
|
|
|
g_autoptr(GError) gliberror = NULL;
|
|
|
|
if (!lightdm_greeter_connect_to_daemon_sync(ldmgreeter, &gliberror)) {
|
2022-12-06 10:07:06 +02:00
|
|
|
kError() << "Could not connect to daemon" << glibErrorString(gliberror);
|
2022-04-01 16:31:45 +03:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2022-12-06 10:07:06 +02:00
|
|
|
kDebug() << "kgreeter is connected to daemon";
|
2022-04-01 16:31:45 +03:00
|
|
|
return app.exec();
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "kgreeter.moc"
|