最近开发Linux桌面环境,把自己学到的分享出来
有一说一,体感上没有桌面环境的Linux(纯命令行)和有桌面环境的像两个系统。桌面,或者桌面环境就是我们所看到的图形页面,桌面环境一般指更多的东西。比较著名的有gnome、kde plasma,现在还有hyperland和niri,不过后面两个更像合成器之类的,想要有完整的“环境”必须安装其他软件丰富,下面要讲的也是环境由什么组成。
我不会讲太多技术细节,因为一来我了解也不多,二来现在ai方便。但是在问及ai如何开发桌面环境,还是没有一个好的参考,很多信息、规范分布零碎,我稍微总结总结。
[推广] [Token 抽奖 + 招推广人] 我们做了个 token 中转,先上来挨打,顺便送点额度
[推广] [Token 抽奖 + 招推广人] 我们做了个 token 中转,先上来挨打,顺便送点额度
前置知识,桌面等也是个应用,所以需要了解不同应用间是如何通信的。
最核心是Unix Socket,服务器(比如桌面合成器)创建一个地址(文件位置),其他应用作为客户端连接上去,双向通信。与其他Socket(套接字)不同的是,unix socket可以传递fd(文件描述符),举个例子,应用a发送数据给应用b,比较大,是个图片,直接通过socket消息传递总共要复制两次,而通过fd,应用a往里面写数据,unix socket把fd告诉应用b,应用b就直接读取,它们共享了内存(或者其它资源)。这种特性叫SCM_RIGHTS。
然后是dbus。一般dbus是基于unix socket。unix socket可以传递任意二进制数据,为了方便大家交流,dbus就规定了如何解析二进制,比如哪部分是数字,哪部分是字符串等等。同时,dbus还实现了类似“网址”的东西,即服务器地址、路径、接口(这里服务器与socket的不同)。接口里可以call来运行方法,或者get、set属性,还可以监听属性变化。
基本上现代桌面环境各个部分由上面一个两个联系起来。
应用显示,窗口管理:以前由x11负责,是个协议,由桌面环境自己实现协议,现在主流wayland协议,还是由桌面自己开发实现,名称有服务器、合成器等,基于unix socket。应用把界面画好,通过fd发送给合成器,合成器把它显示出来,还会发送鼠标键盘事件给应用。wayland基本管的是窗口内部显示,至于窗口怎么布局,平铺还是堆叠、甚至3d显示,由合成器自己内部处理。其他东西,比如任务栏通知栏等,看你的架构设计。有些是分离的,比如niri+waybar栏,当然也可以把面板、组件与合成器放在一个应用。合成器有些开发框架,比如wlroots等。Wayland Protocol Documentation | Wayland Explorer 这个网站总结了wayland协议,以及各个合成器的支持情况
x11应用兼容:x11和wayland是两套协议,如果你可以的话,你的合成器可以全都兼容,但现在一般是用xwayland把x11翻译成wayland。
剪贴板:wayland里规定了。
下面先介绍freedesktop,类似一个组织或者协议,统一一些东西。 https://www.freedesktop.org/wiki/Software/ https://www.freedesktop.org/wiki/Specifications/ 这两个网址有很多东西可以学。如果你浏览系统的dbus服务名,会发现有很多以org.freedesktop打头。下面我节选部分
应用名称、图标与其执行文件:Desktop Entry Specification,也就是.desktop文件,包含了应用执行路径、名称、图标等
启动器:在/usr/share/applications/ /usr/local/share/applications/ ~.local/share/applications/ 下找到没有NoDisplay的desktop文件
右键图标菜单:desktop文件的[Desktop Action XXX]条目可以设置(我记得手机上图标长按也会弹出菜单,忘记叫什么了)
图标:desktop文件图标用图标名表示,需要从相关目录,并结合主题名称等查找图标,见Icon Theme Specification
通知:Desktop Notifications Specification 通过创建org.freedesktop.Notifications,接收应用发来的通知。还有xdg-portal相关的实现,稍后可以读到
媒体控制器:mpris协议,应用创建org.mpris.MediaPlayer2打头的dbus服务,如org.mpris.MediaPlayer2.firefox,然后控制器可以遍历服务,找到它们,这些服务提供了控制接口,控制播放、暂停等,还可以读取进度、音量等。可以获取元数据,包括媒体名称、封面等。元数据还可以有歌词,不过没有多少应用支持,大部分通过歌名到网上找
拖盘(tray):StatusNotifierItem,sni。即windows任务栏右下一堆应用图标,比如qq微信等。应用创建服务,桌面环境有个watcher服务,应用向watcher注册,然后另一个桌面环境的客户端(一般叫host)通过watcher读取应用名、图标等。右键应用的菜单通过dbus menu协议实现
电量:UPower 这个也是dbus服务,不过在系统总线上创建的,开发时注意socket路径。可以获取各种东西的电量:笔记本电池、耳机、蓝牙键盘等等
网络连接:networkmanagerdbus服务,处理网络扫描、连接和一大堆
蓝牙:bluz。也提供了dbus服务,扫描、配对、连接等
账户,或者说电源,就是关机、重启、睡眠那些:login1 systemd-logind dbus服务,当然直接用命令也是可以的
验证用户密码:pam。锁屏可以用独立软件,也可以桌面环境自己开发,验证用户密码时就用到pam。pam是linux自带的,不是dbus协议,需要通过引入库交流
权限管理:polkit。就是有时候如用分区软件时弹让你输密码的那个。桌面环境要实现的是前端代理(agent),一般引入专门库处理。底层是向polkit dbus服务注册,等它发请求过来要求弹窗,然后把密码通过socket发送到(具体我还没研究好,可能有加密,不过unix socket本身不会被劫取,而dbus是可以监听全部的消息)helper,剩下的helper自己处理,可以参考 GitHub - polkit-org/polkit: polkit (formerly PolicyKit) is a toolkit for defining and handling authorizations. It is used for allowing unprivileged processes to speak to privileged processes. · GitHub r-vdp/polkit-stdin-agent: Non-interactive polkit authentication agent that answers PAM prompts from a file descriptor - Codeberg.org
指纹、人脸:创建pam模块
音频输出控制等:pipewire
密码环:gnome keyring
输入法:fcitx、ibus等把按键转成文字。在wayland下,需要合成器把按键转发给输入法,得到文字后通过另一个协议发送给目标应用。输入法会提供界面显示,不过也可以像mac和手机那样桌面环境提供统一的候选词选择前端,但是如何与输入法交互我还没了解
屏幕背光:需要往/sys/class/backlight里写数据,要求权限。有的桌面环境可能会用 brightnessctl 控制
打印机:CUPS
介绍xdg desktop portal。flatpak是一个沙箱打包形式,相当于管理了软件权限,自然就需要管理dbus接口。软件只会调用给定的dbus服务,这些服务就通过xdg desktop portal给定。本来这个专门给flatpak开发,但是集中了系统调用,所以有些服务不仅提供给沙箱里面还提供给其他应用。现在wayland下的截屏录屏就需要portal。
基本上桌面环境提供org.freedesktop.impl.portal.desktop.xx服务,并提供各种org/portal/desktop/org.freedesktop.impl.portal.xx接口,然后有个中控把它作为服务提供给应用。
文档资源比较集中,规定了许多功能,如文件选择器、打印、远程连接、截屏、录屏、定位、深色模式(位于设置)等,这些需要桌面环境实现。
所以桌面环境一要处理自己和硬件的关系,二要提供给应用的相关功能
最后,桌面环境如何启动,就需要显示管理器了
1 个帖子 - 1 位参与者