基于lightdm开发轻量版greeter
ssk-wh Lv4

lightdm是什么

lightdm/LightDM,全称”Light Display Manager”。是 linux 操作系统中的一种轻量级显示管理器,用于显示登录屏幕并处理用户登录。适用于 gnome、kde、xfce 和l xde 等不同的桌面环境,并且相对于其他登录管理器来说,占用的系统资源较少,启动速度也较快。

常见的登录管理器包括:

GDM (GNOME Display Manager)
SDDM (Simple Desktop Display Manager)
LightDM
XDM (X Display Manager)
KDM (KDE Display Manager)

还有其他一些较少使用的登录管理器,如SLiM和Entrance等。

greeter是什么

greeter 是 LightDM 登录管理器的用户界面。它提供了一个简单而美观的图形化界面,用户可以使用该界面登录到他们的系统。

业界常见的 greeter 包括:

greeter名称 描述
unity greeter 这是 ubuntu使用的默认greeter,具有现代化的外观和感觉。它支持用户切换、自定义背景和语言。
lightdm webkit2 greeter 这个greeter使用webkit2引擎,支持html5和css3,提供了更灵活的自定义选项。
slick greeter 这个greeter具有紧凑的设计和简单的配置。它支持用户切换、自定义背景和语言。
gtk+ greeter 这个greeter采用gtk +工具包,支持多种语言和主题。
lxde greeter 这个greeter轻量级、快速,并具有直观的用户界面。它支持自定义主题、多个用户和面孔浏览功能。
pantheon greeter 这个greeter是 elementary os 的默认greeter,具有干净的设计和响应式布局。它支持用户切换、自定义背景和语言。

这只是其中的一些示例,还有其他许多基于 LightDM 的可用 greeter 。

开发库

liblightdm-qt5-3-dev 是一个用于与lightdm显示管理器交互的qt应用程序开发包。它包含了 lightdm qt 库的头文件和静态库。开发人员可以使用该软件包创建自定义登录界面或在他们的应用程序中添加其他lightdm功能。

安装开发包
sudo apt install liblightdm-qt5-3-dev

在此软件包中,提供了以下四个类,这些类足以为您的greeter应用程序提供支持

描述
greeter.h 提供认证、回填密码、错误提示、语言设置、会话同步等功能
power.h 判断是否支持待机、休眠、关机、重启等操作以及待机、休眠、关机、重启接口
sessionsmodel.h 继承自QAbstractListModel,封装了所有的会话列表,数据一般源自/usr/share/xsessions目录中的配置文件
usersmodel.h 继承自QAbstractListModel,封装了所有的用户信息

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "greeter.h"

#include <QApplication>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QPushButton>
#include <QListView>
#include <QComboBox>
#include <QDebug>

#include <QLightDM/Greeter>
#include <QLightDM/SessionsModel>
#include <QLightDM/UsersModel>

Greeter::Greeter(QWidget *parent)
: QWidget(parent)
, m_layout(new QVBoxLayout(this))
, passwordEdit(new QLineEdit(this))
, m_userList(new QListView(this))
, m_sessionCbx(new QComboBox(this))
, m_loginBtn(new QPushButton("Login", this))
, m_greeter(new QLightDM::Greeter(this))
{
#ifdef QT_DEBUG
if (!m_greeter->connectSync()) {
qWarning() << "connect sync failed";
close();
}
#endif

initUI();
initConnections();
}

void Greeter::initUI()
{
m_layout->addWidget(m_userList);
m_layout->addWidget(passwordEdit);
m_layout->addWidget(m_sessionCbx);
m_layout->addWidget(m_loginBtn);

m_userList->setModel(new QLightDM::UsersModel(this));
m_userList->setCurrentIndex(QModelIndex());
m_sessionCbx->setModel(new QLightDM::SessionsModel(this));
}

void Greeter::initConnections()
{
connect(m_loginBtn, &QPushButton::clicked, this, &Greeter::onLogin);
connect(m_greeter, &QLightDM::Greeter::authenticationComplete, this, &Greeter::onAuthenticationComplete);
connect(m_greeter, &QLightDM::Greeter::showPrompt, this, &Greeter::onShowPrompt);
connect(m_greeter, &QLightDM::Greeter::showMessage, this, &Greeter::onShowMessage);
}

void Greeter::onLogin()
{
// cancel authentication
if (m_greeter->inAuthentication()) {
m_greeter->cancelAuthentication();
}

// start authentication
QModelIndex currentIndex = m_userList->currentIndex();
if (currentIndex.isValid() && !m_greeter->inAuthentication()) {
m_greeter->authenticate(currentIndex.data(QLightDM::UsersModel::NameRole).toString());
} else {
qWarning() << "user list index is invalid or greeter is in authentication";
}
}

void Greeter::onAuthenticationComplete()
{
if (m_greeter->isAuthenticated()) {
int index = m_sessionCbx->currentIndex();
m_greeter->startSessionSync(m_sessionCbx->itemData(index, QLightDM::SessionsModel::IdRole).toString());
} else {
passwordEdit->setPlaceholderText("Incorrect password, please try again");
}
}

void Greeter::onShowPrompt(const QString &text, int type) {
qDebug() << text << static_cast<QLightDM::Greeter::PromptType>(type);
m_greeter->respond(passwordEdit->text());
}

void Greeter::onShowMessage(QString text, int type)
{
qDebug() << text << static_cast<QLightDM::Greeter::MessageType>(type);
}

image

Greeter类实现了一个简单的登录界面,该界面包括以下几个要素:

账户列表:在该列表中列出了所有可用的用户账户,用户可以通过选中所需账户来进入其对应账户的登录页面。
密码输入框:在该输入框中,用户需要输入与所选账户对应的密码信息才能完成登录操作。
下拉列表:该下拉列表提供多个会话文件的选择,这些会话文件定义了一些桌面设置和应用程序的配置等信息,用户可以从中选择自己喜欢的会话选项。
登录按钮:当用户输入正确的密码并选择所需的会话后,可以点击此按钮以完成整个登录过程。

为用户提供了一个简易的登录界面,使得用户可以方便地完成登录操作,并在多个会话配置中选择最适合自己的会话选项。

示例程序

完整demo

如何验证

在您操作之前,请确保您拥有相关的领域知识,在碰到意外时能及时保存您的数据资产,否则请止步。

/usr/share/xgreeters 目录中创建 lighter-greeter.desktop ,内容如下:

1
2
3
4
5
6
[Desktop Entry]
Name=Lighter Greeter
Comment=Lighter Greeter
Exec=[修改为上面的demo编译出的二进制文件的具体路径]
Type=Application

修改lightdm的配置文件,让 lightdm 在启动时拉起自定义的 greeter 启动文件

sudo vim /etc/lightdm/lightdm.conf

[Seat:*]组中的修改以下两行信息(如果不存在需要手动添加)

1
2
greeter-session=lighter-greeter
user-session=deepin

image

保存退出重启电脑即可。

附录

Light Display Manager

LightDM

qt-lightdm-greeter

 Comments
Comment plugin failed to load
Loading comment plugin