LightDM Greeter的启动流程与分析

news2024/10/7 6:46:28

重要的概念

LightDM Greeter是什么?它是一个登录管理器,用于在Ubuntu或其他基于Linux的操作系统中管理用户登录。它提供了一个图形化用户界面,用户可以在其中输入他们的用户名和密码以及选择登录的桌面环境。LightDM Greeter还提供了可定制的选项,如自定义主题和背景图像。它是一个轻量级的登录管理器,可以与各种桌面环境和窗口管理器一起使用。

如果把系统比作一栋建筑,Greeter就像是那个门卫——它还不算是警卫。通过LightDM的配置把它屏蔽,用户可以长驱直入。下文以Linux Deepin系统开发的lightdm-deepin-greeter为样本。其它系统大同小异。LightDM视角下Greeter流程如下图所示:
在这里插入图片描述

配置部分

lightdm配置

LightDM支持以下位置的配置文件:

/usr/share/lightdm/lightdm.conf.d/*.conf
/etc/lightdm/lightdm.conf.d/*.conf
/etc/lightdm/lightdm.conf

当多个配置文件存在相同配置时以最后的配置文件的配置为依据,读取顺序从上到下。dde-session-shell直接修改最后一个配置文件/etc/lightdm/lightdm.conf,把greeter-session设置为lightdm-deepin-greeter

Desktop文件

代码里面的files文件夹下的lightdm-deepin-greeter.desktop文件就是按照LightDM的要求写的配置文件,内容如下:

[Desktop Entry]
Name=Deepin Lightdm Greeter
Comment=Deepin Lightdm Greeter
Exec=/usr/bin/deepin-greeter
Type=Application
X-Ubuntu-Gettext-Domain=deepin-lightdm-greeter

CMakeLists.txt第396行代码是关于这个文件的安装规则代码,它指定安装包把这个Desktop文件复制到/usr/share/xgreeters/下面。
Desktop文件其中的Exec指定启动/usr/bin/deepin-greeter这个文件。

Shell部分

deepin-greeter

deepin-greeter是一个shell文件,代码位于files文件夹下,代码如下:

for i in /etc/deepin/greeters.d/*; do
    $i
done

CMakeLists.txt第387行代码是关于这个文件的安装规则代码,它指定安装包把这个shell文件复制到/usr/bin/下面。
它的作用是遍历/etc/deepin/greeters.d/下面的所有可执行文件,把它们依次轮流启动执行。

深度shell

这部分shell代码不在dde-session-shell工程代码里面。其中存在2个关键的shell,第一个是00-xrandr。文件名为什么要加00-呢?因为这个shell是用来获取显示设备最大支持的分辨率并改变分辨率。按照deepin-greeter这个shell的依次循环执行做法,为了保证先设置分辨率后启动界面应用,所以加了这个前缀。它的代码如下:

#!/bin/bash
#
# xrandr 输出的主屏幕有可能是断开的
# $ xrandr|egrep -o '^.* (connected|primary)'
# DVI-I-0 disconnected primary
# DVI-I-1 connected
# VGA-1-1 connected

xinfo(){
    local IFS=$'\n'
    XINFO=($(xrandr|egrep -o '^.* connected( primary)?'))
}

# 仅当连接两个屏幕时进行如下操作
if xinfo && ((${#XINFO[@]} == 2)); then
    # 假设第一行为主屏
    primary=(${XINFO[0]})
    second=(${XINFO[1]})
    # 如果第二行输出含有 primary, 则交换
    if ((${#second[@]} == 3)); then
        primary=(${XINFO[1]})
        second=(${XINFO[0]})
    fi
    xrandr --output ${second[0]} --right-of ${primary[0]} --auto
fi

第二个是lightdm-deepin-greeter。注意这还是个shell,不是Qt编译的二进制可执行文件。它的代码是:

#!/bin/bash
display_daemon="/usr/lib/deepin-daemon/greeter-display-daemon"
if [ -x $display_daemon ]; then
    $display_daemon &
fi
/usr/bin/lightdm-deepin-greeter

为了计时,编者把代码改成了:

#!/bin/bash
display_daemon="/usr/lib/deepin-daemon/greeter-display-daemon"
if [ -x $display_daemon ]; then
    echo $(date +"%Y-%m-%d %H:%M:%S") $display_daemon  >> /home/log/greeter-elapse.log
    $display_daemon &
fi
echo $(date +"%Y-%m-%d %H:%M:%S") /usr/bin/lightdm-deepin-greeter started >> /home/log/greeter-elapse.log
/usr/bin/lightdm-deepin-greeter
echo $(date +"%Y-%m-%d %H:%M:%S") /usr/bin/lightdm-deepin-greeter ended >> /home/log/greeter-elapse.log

增加到代码都是把时刻打印到/home/log/greeter-elapse.log。需要注意是的这些shell的启动身份是lightdm这个用户。这个用户权限很低,/home/log/ 的权限须为755greeter-elapse.log的权限须为777

可执行文件部分

/usr/bin/lightdm-deepin-greeter是最终的可执行文件,它才是dde-session-shell的编译结果。CMakeLists.txt第386行代码指定安装包把lightdm-deepin-greeter复制到/usr/bin

主程序入口

main函数位于lightdm-deepin-greeter.cpp第181行。开始启动时调用DTK加载主题,设置Qt主程序相关信息,设置Qt的调色板等等。最重要的是判断当系统环境是不是X11,如果是则加载XCB插件。

SessionBaseModelGreeterWorkek类型虽然不是单例模式的实现,但是单例模式的用法,它在界面类型中层层传递,确认只有这些类型的单个对象。GreeterWorkek实现了登录逻辑。

多屏的信号监听由MultiScreenManager提供支持。每个屏幕信号都触发一次std::function<QWidget *(QScreen *)> 类型的回调。

LoginWindow类型

这个类型是主窗口,继承自FullscreenBackground类型。FullscreenBackground的作用是全屏遮挡,但它作用一个通用类型不提供界面的实现细节,也不实现对鼠标和键盘信号的抓取并屏蔽功能。它特别提供了一个调试功能,debug模式编译的程序可按Esc键退出。

绘制的背景图片之前要获取用户设置的背景图片。曾经的做法是从com.deepin.daemon.Accounts服务获取用户的背景图片的路径,然后调用com.deepin.daemon.ImageEffect生成虚化的背景图片,用虚化的背景图片填充效果。这样的做法存在一个巨大的敝端:无论用户是否修改过背景图片,它在每次登录操作都要生成一次。对于龙芯这样的没有真实GPU只能模拟图形处理的硬件平台造成不必要的启动缓慢问题。后来引入共享内存技术,通过保存用户修改背景图片设置时的保存的缓存图片,一定程序上提高了greeter启动速度,特别对于开机后的注销、锁屏操作,速度提升效果更加明显。

LoginContent类型

LoginContent类型继承自LockContent类型。这里是greeter和锁屏程序的逻辑存在共用的地方。框架上的整体布局由它管理和设置,它管理的LogoWidget对象实现了左下角UOS的标志,MediaWidget对象实现了锁屏播放音乐,UserLoginInfo对象实现中间的登录界面,ControlWidget实现了切换用户、关机、重启等界面。

关于服务器版本

服务器版本不显示用户列表,不过它并非通过LightDM的配置实现,而是自己写了一个配置文件,代码位于files文件夹下的dde-session-ui.conf.in,代码是:

[Power]
sleep=$$ENABLE_SLEEP
hibernate=$$ENABLE_HIBERNATE

[OS]
isDeepin=$$IS_DEEPIN

[General]
loginPromptAvatar=$$LOGIN_PROMPT_AVATAR
loginPromptInput=$$LOGIN_PROMPT_INPUT
lockNoPassword=false

[Lock]
#[always | ondemand | disabled]
showSwitchUserButton=$$SHOW_SWITCH_USER_BUTTON

其中$ENABLE_SLEEP$$LOGIN_PROMPT_INPUT$$IS_DEEPIN$$LOGIN_PROMPT_INPUT$$SHOW_SWITCH_USER_BUTTON是CMake传递过来的变量。showSwitchUserButton指明是否显示切换用户按钮,sleep指明是否显示休眠按钮,hibernate指明是否显示待机按钮,isDeepin指示是否深度系统,loginPromptAvatar指示是否显示用户头像。

dde-session-ui.conf.inCMakeLists.txt指定安装到/usr/share/dde-session-ui/dde-session-ui.conf

作者:岬淢箫声
日期:2020年12月16日
版本:1.0
博客:http://caowei.blog.csdn.net
创作不易,请大家多多支持关注、转发。转发请注明来源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式_中介者模式

中介者模式 介绍 设计模式定义案例问题堆积在哪里解决办法中介者代替了多个对象之间的互动 使对象1 2 3 之间的互动 变为&#xff1a; 对象1->中介 对象2->中介 对象3->中介好友之间 约饭好友1 通知 好友2 -3 -4 等等加一个群 谁想吃饭就 通知一下 类图 代码 角色 …

Spring Security认证架构介绍

在之前的Spring Security&#xff1a;总体架构中&#xff0c;我们讲到Spring Security整个架构是通过Bean容器和Servlet容器对过滤器的支持来实现的。我们将从过滤器出发介绍Spring Security的Servlet类型的认证架构。 1.AbstractAuthenticationProcessingFilter AbstractAut…

操作系统——进程互斥的软件实现算法(王道视频p27、课本ch6)

1.总结概览&#xff1a; 2.单标志[turn]法——算法代码&#xff1a; 可能违反“空闲让进” 3.双标志[flag[2]]先检查法——算法代码&#xff1a; 如果不能利用硬件的原语的话&#xff0c;就可能出现违反“忙则等待”的问题: 4.双标志[flag[2]]后检查法——算法代码&#xff1…

RT-Smart 应用开发笔记:fopen 造成文件被清空问题的分析记录

前言 RT-Smart 应用&#xff08;apps&#xff09;开发环境&#xff0c;ubuntu 20.04 win10 VS Code 最近在调试一个问题&#xff0c;需要使用 FILE 的 fopen、fread 等去读取处理一个大文件&#xff0c;为了尽快复现验证问题&#xff0c;随手搜了一下 fopen 等几个 API的用法…

Pytorch搭建DTLN降噪算法

前面介绍了几种轻量级网路结构的降噪做法&#xff0c;本文介绍DTLN—一种时频双核心网络降噪做法。 AI-GruNet降噪算法 AI-CGNet降噪算法 AI-FGNet降噪算法 Pytorch搭建实虚部重建AI-GruNet降噪算法 一、模型结构 DTLN来自[2005.07551] Dual-Signal Transformation LSTM N…

无代码的未来

随着无代码技术越来越成熟&#xff0c;很多web应用已经可以基于无代码平台进行开发。本文分析了4个最流行的无代码平台&#xff0c;并梳理了无代码行业今后可能的发展方向。原文: The future of NoCode 所有无代码编辑器都需要回答的问题 当需要选择无代码解决方案时&#xff0…

小白也能成功搭建网站

随着互联网的快速发展&#xff0c;拥有一个个人网站已经成为了越来越多人的追求。然而&#xff0c;对于编程知识不太了解的小白来说&#xff0c;搭建个人网站似乎是一件很困难的事情。但是&#xff0c;现在有了一个不需要编程的方法&#xff0c;小白也能够轻松建立自己的个人网…

高速DSP系统设计参考指南(六)锁相环(PLL)

&#xff08;六&#xff09;锁相环&#xff08;PLL&#xff09; 1.模拟锁相环2.数字锁相环3.PLL隔离技术 系统设计人员需要隔离PLL&#xff0c;使其免受内部和外部噪声的影响。PLL通常用作频率合成器&#xff0c;将输入时钟乘以一个整数。该整数是反馈计数器M除以输入计数器N的…

C++学习过程中的一些值得注意的小点(1)

一、内联函数 1.1内联函数的定义 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 call指令表明Add函数在被调用的时候建立了栈帧。如果在上述函数前增…

如何更换微信公众号主体?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不止局限…

java8 Optional理解及示例

大量判空的代码 实际中&#xff0c;对象不判空会导致空指针异常。 为了规避为指针&#xff0c;不得不写出这种非常冗长又丑陋的空指针判断。 public void tooMuchNull(Worker worker) {if (worker ! null) {Address addressworker.getAddress();if (address ! null) {String…

UVM 验证方法学之interface学习系列文章(八)《interface不小心引入X态问题》

前面的文章学习,想必大家都对interface 有了深入了解。大家可不要骄傲哦,俗话说:小心驶得万年船。今天,再给大家介绍一个工作中,不是经常遇到,但是一旦遇到,会让你纠结很久的事情。 前面文章提到,随着验证复杂度的不断增加,interface 的bind 的操作,是必不可少的用法…

1.1 网页的基本概念

思维导图&#xff1a; 网页设计基础知识 --- **导言&#xff1a;** 随着互联网的迅速蔓延&#xff0c;世界各地的数亿人群均可以通过网络实现聊天、购物、阅读新闻、查询天气等功能。而在幕后&#xff0c;是成千上万的网页支撑这一切。但这些网页是如何制作的&#xff1f;我们…

Unity之ShaderGraph如何实现靠近显示溶解效果

前言 今天我们来实现一个我再B站看到的一个使用LeapMotion实现的用手部触摸就可以显示的溶解效果。 效果如下图所示&#xff1a; 主要节点 Position&#xff1a;提供对网格顶点或片段的Position 的访问&#xff0c;具体取决于节点所属图形部分的有效着色器阶段。使用Space下…

无痕视频去水印方法分享-这些软件你值得拥有

怎么无痕视频去水印&#xff1f;喜欢剪视频的你是不是经常碰到这种烦人的事&#xff1f;就是每次在网上找到好看的视频素材&#xff0c;下载下来却总是带着各种各样的水印&#xff0c;这些水印不仅影响美观&#xff0c;还挡住了视频里重要的内容&#xff0c;如果你也遇到这种情…

JAVA基础-方法(5)

目录 1、方法介绍<br />2、方法的重载&#xff08;在同一个类中&#xff0c;方法名相同&#xff0c;列表参数不同&#xff08;数量不同&#xff0c;类型不同&#xff0c;顺序&#xff09;&#xff09;3、方法的重写&#xff08;方法的覆盖-参数类别相同&#xff0c;返回值…

java项目容器化(docker)部署注意点

cgroup 支持 从 jdk 8u121 开始支持&#xff0c;即低于这个版本无法使用容器特性 https://bugs.java.com/bugdatabase/view_bug.do?bug_id8170888 https://bugs.openjdk.org/browse/JDK-8170888 https://bugs.java.com/bugdatabase/view_bug.do?bug_id8175898 https://b…

EPLAN_008#3D布局图

一、新建页 多线原理图纸画好以后 打开布局空间导航器——右键——新建 二、插入箱柜 菜单栏——插入——箱柜 三、显示安装板 然后调整视角 四、插入线槽 菜单栏——插入——线槽——选择合适的线槽——确定 按A键可以切换线槽方向&#xff0c;如果位置不对&#xff0c;可以再…

redis的cluster

1.我们的哨兵模式中&#xff0c;当主节点挂掉以后&#xff0c;此时哨兵会重新进行选举&#xff0c;选举出新的主节点去对外提供写服务 在选举的过程中,他redis整个集群是不提供写服务的 &#xff08;因为此时我们哨兵对外提供写服务的只有Master&#xff09; 2.我们单节点的red…

NRK3301语音芯片在智能窗帘上的应用

窗帘是人们日常生活中所经常使用的家居产品&#xff0c;传统的窗帘大多都需要手动拉动窗帘使用&#xff1b;存在着拉拽费劲&#xff0c;挂钩容易掉落等问题。随着数字化转型的升级&#xff0c;推进了窗帘市场的高质量发展。智能窗帘也“适时出现”出现了&#xff0c;一款带有语…