开发一个Linux桌面环境所需要的

Xushengfeng 2026-05-08 18:28 1

最近开发Linux桌面环境,把自己学到的分享出来


有一说一,体感上没有桌面环境的Linux(纯命令行)和有桌面环境的像两个系统。桌面,或者桌面环境就是我们所看到的图形页面,桌面环境一般指更多的东西。比较著名的有gnome、kde plasma,现在还有hyperland和niri,不过后面两个更像合成器之类的,想要有完整的“环境”必须安装其他软件丰富,下面要讲的也是环境由什么组成。


我不会讲太多技术细节,因为一来我了解也不多,二来现在ai方便。但是在问及ai如何开发桌面环境,还是没有一个好的参考,很多信息、规范分布零碎,我稍微总结总结。


前置知识,桌面等也是个应用,所以需要了解不同应用间是如何通信的。


最核心是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等把按键转成文字。fcitx等提供了一个统一的输入法框架,如果是底层,比如在wayland下,需要合成器把按键转发给输入法,得到文字后通过另一个协议发送给目标应用。输入法会提供界面显示,不过也可以像mac和手机那样桌面环境提供统一的候选词选择前端,但是如何通过dbus与fcitx交互我还没了解


屏幕背光:需要往/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接口,然后有个中控把它作为服务提供给应用。


文档资源比较集中,规定了许多功能,如文件选择器、打印、远程连接、截屏、录屏、定位、深色模式(位于设置)等,这些需要桌面环境实现。


所以桌面环境一要处理自己和硬件的关系,二要提供给应用的相关功能


最后,桌面环境如何启动,就需要显示管理器了

最新回复 (19)
  • calendar 05-08 20:21
    1

    学到了,佬是在开发什么桌面环境吗?

  • ffgan 05-08 20:26
    2

    请问佬可以评价一下system76用rust开发的cosmic desktop嘛,日常使用它,但是不清楚里面rust的组件具体是占了上面列出的那些内容的多少。


    还有一个问题是,请问关于原生桌面应用开发,佬对这个有什么看法嘛?比如说用GTK4 SDK来开发的话,能算是原生开发嘛

  • 哈雷彗星 05-08 20:29
    3

    整挺好,最近碰巧也在学习这方面的内容

  • Xushengfeng 楼主 05-08 20:38
    4

    有在开发,不过是基于electron的 ^-^

    正是因为这样没有什么库可以直接用才研究这些底层dbus东西

  • NumPy 05-08 20:39
    5

    基于electron的



    这让我想到了一个人

    搜了一下。。

    结果就是你


    [myde演示]
    如图所示
    Linux的好处在于可以自由更改桌面,也就是显示界面。
    一开始想一步到位,直接输出,但要改Electron源码。后来受到Weston启发,先开发一个“子桌面”,图中的蓝色窗口就是我开发的桌面(背景父桌面是kde桌面)。
    目前支持很少部分协议,并且协议处理也有问题,但一些软件,kde的文件管理器和终端,chrome和edge都是可以运行的。所以目前项目是demo…


    汗 ^-^




    一般这叫 扮猪吃老虎 ^-^

  • Xushengfeng 楼主 05-08 20:55
    6

    没有仔细研究,我用的时候它的功能覆盖都是比较全面的,看起来上面列的应该大部分都用到,上面那些算是协议约定俗称了,软件开发会使用那些协议桌面环境自然要支持,具体怎么样得看他们代码

    原生开发我了解不多(因为大部份都是拿electron),在大家眼里,或者我之前也问过ai,gtk/qt算是原生开发了,不过其实也是封装了dbus协议那些(当然还有些私有协议或者封装不稳定底层协议等)(不过手搓与dbus服务通信也是原生吧)。还封装了组件之类的,我不清楚x11时代这些组件是与桌面有什么关系,不过wayland基本只传递渲染好的图像,那更原生的开发方式就是手动绘制界面^-^。所以你说不原生吧,大家基本上在linux都拿它们开发,要说原生,自己走协议也是可以的,还更底层,无所谓了 ^-^

  • ffgan 05-08 21:11
    7

    其实原生的话,我从个人角度还是比较倾向于是否得到了桌面环境的原生支持,而非是应用自己适配的。比如GTK是GNOME原生就支持,这样的话这个应用就能够保持和"系统应用"等一致的体感。其实更重要的一个是对electron的速度、内存占用等存在较大的争议,所以才会比较关注原生开发这件事。

  • Jason Smith 05-08 21:18
    8

    开发远程桌面啥的需要研究这些,比如 rustdesk 之类,另外一个linux 下面的比较好用的远程桌面,真的好少,尤其是 支持 wayland 桌面,ubuntu 24 以上系统,默认 集成了 rdp ,远程体验提升很多,不过,不支持 nvidia 显卡gpu加速,想要体验linux好用的远程桌面 任重道远

  • Xushengfeng 楼主 05-08 21:44
    9

    确实风格这方面是非gtk/qt外可以简单达到的

    应用主题这一块也有好多东西呢,有些关于主题的特殊环境变量之类的

    关于内存占用,现在zed的gpui看起来也是不错的

  • Xushengfeng 楼主 05-08 21:55
    10

    现在进步还是比较大的

    我记得以前vnc是比较方便的,后来wayland起来就不怎么好支持了,现在随着各种进步吧,包括xdg desktop portal、还有pipewire的流行,远程桌面这块在协议上是更规范了,包括桌面环境也渐渐支持权限记忆,换句话就是支持无人值守了,还是很值得期待的,就等好用的软件开发了

  • Jason Smith 05-09 10:58
    11

    wayland 完整支持的客户端软件,就没看到几个,rustdesk, 到现在也不能完整支持 ,大部分都停留在 x11桌面,gnome rdp 算是支持的很好的,但是还是有很多问题,没有硬件加速,开机自启动,麻烦, 原没有原生windows rdp简单方便好用,之前一直用到Linux 远程桌面,也需要gpu加速,做了一些简单的研究。哎

  • Default 05-10 12:09
    12

    这才是真正的 linux do ^-^

  • Fieo 05-14 11:32
    13

    太硬核了,,前端看的一愣一愣的!

  • naga888 05-14 11:36
    14

    难得关于linux的帖子 大佬强啊

  • kor1 05-14 11:37
    15

    本质上就是通过ipc 让各大组件相互通信,还有 wanland 和合成器这些,我感觉个人做不好这些,工作量太大了,坑太多了。这也不是ai能解决的,ai能解决的话,基于 gnome kde 这些一样能改好。


    不过做一个不考虑兼容的,轻量级的,其实还不错,参考 popos 那个新桌面。

  • kor1 05-14 11:41
    16

    输入法:fcitx、ibus等把按键转成文字。在wayland下,需要合成器把按键转发给输入法,得到文字后通过另一个协议发送给目标应用。输入法会提供界面显示,不过也可以像mac和手机那样桌面环境提供统一的候选词选择前端,但是如何与输入法交互我还没了解



    刚好我在开发输入法,wayland 下,输入法和桌面合成器需要实现input-mothod v1 v2 协议,而桌面合成器又要和普通应用实现 text-input v1,v2,v3协议,好像现在还有一个v4 协议。所以这个合成器很重要。

  • Xushengfeng 楼主 05-14 12:44
    17

    是的,基本都靠unix socket

    说难不难,但也绝对不轻松。像我自己也基于electron搞个简单桌面环境(至少能简单跑个edge,其他好的不兼容),不指望ai从0构建,但是在查找、阅读、理解部分协议甚至简单补充实现这些协议还是有很大帮助的

  • Xushengfeng 楼主 05-14 12:50
    18

    欸,好像在你的话题下回过你 ^-^

    等他们逐步支持吧,虽然之前搞得很混乱,但是现在各个发行版默认wayland,应该都会重视开发吧

  • Xushengfeng 楼主 05-14 12:52
    19

    我也是搞前端的,用ts开发桌面环境……

    现在学习方便很多了,几个月前我对这些也是不懂的

* 帖子来源Linux.do
返回