队员:复旦大学 朱元依、沈扬、朱俊杰 指导老师:张亮、陈辰 企业导师:王子冲
本项目为2023年操作系统大赛企业赛道赛题。
项目链接:DDE 控制中心自启动管理插件 github仓库
1 摘要 Deepin(原名Linux Deepin)致力于为全球用户提供美观易用,安全可靠的Linux发行版。该系统由深度科技自主开发,提供了美观易用、极简操作的桌面环境,主要由桌面、启动器、任务栏、控制中心、窗口管理器等组成。其中,控制中心是Deepin桌面环境的核心组件之一,它是用于管理和配置操作系统各种设置的集成工具。然而,在该控制中心中,并未对用户提供自启动项提供的便捷管理界面。在本项目中,我们为Deepin操作系统中自启动项的修改功能编写了简洁易用的控制中心插件,将自启动管理的系统功能集成到了控制中心中。该插件以单独的仓库提供,并能够单独构建,一键植入Deepin控制中心中。
2 需求分析 最终用户对自启动权限的管理目前只能通过dde-launcher(启动器/“开始菜单”)的右键菜单进行管理,而控制中心作为控制系统的门户应用反而缺少此功能。
用户需求
在官方发布的deepin23-Beta版本中,对于用户程序与系统程序的自启动管理方法为:找到应用的可执行程序(通常为.desktop)类型的文件,通过右键打开功能菜单的方式设置为开机自启动。但由于操作系统自带的应用程序界面中所有程序都会被展示到,所以当操作系统中应用程序过多的时候用户很难统计到那些程序被设置成了开机自启动,同时对于用户不想参与管理的应用也会展示在应用菜单中。因此我们对于本项目开发所面向的需求是在控制中心(deepin-control-center)中在不影响原有插件所提供的设置服务的基础上,为用户提供一个额外的插件用于管理开机自启动软件,同时插件可以满足用户自行选择需要手动维护的自启动程序,对于用户希望自己管理是否自启动的软件显示在面板上可以对是否自启动进行开关,用户不希望管理的软件默认不自启动不显示到面板;面板也可以提供添加和删除的功能让用户挑选出自己想要在面板上操作的应用。
功能需求
deepin作为国产开源的深度Linux桌面系统,不仅为用户提供了人性化、个性化以及对于中文等语言有良好支持的操作系统体验,也为Linux的开发者与学习者提供了控制中心(dde-control-center)与任务栏(dde-dock)等桌面控件的开发者接口与插件注入接口。除了可以不断的扩展完善用户需求与用户体验外,deepin深度桌面在操作系统学科的教学与深入理解方面也带来了很多的可能性与创造性。因此作为OS大赛的参与团队,我们不仅是在希望我们的开发会对deepin项目的完整性、deepin用户的体验感上带来一些帮助,同时也想通过我们自己的努力在学生的视角让操作系统的教学与后续学习有一个优秀的案例和一些开发相关的经验总结,使得我们理论层面的操作系统教学可以有更大的实践空间。
2.1 当前方案 目前已有的自启动管理方法是在开始菜单中对菜单中所展示应用软件单独进行自启动的设置。具体的方法是对所希望设置自启动项的应用软件选中后右键,点击“设置开机自启动”即可在每次开机时自动打开该应用软件。
然而,这种方法有两大明显的缺陷:(1)无法向用户展示所有的自启动项设置(2)大批量的自启动项修改极其不便。由此,催生了控制中心自启动管理插件的需求。
2.2 插件需求 为了完成控制中心插件,我们对需求进行了更细致的刻画。经过总结后,插件的需求主要分为三条:
1、完成一个控制中心插件,能够展示当前所有开机启动项的列表; 2、能够在插件中,通过用户界面的交互来管理(添加、删除、启用、禁用)开机启动项; 3、插件以单独的仓库提供,并能够单独构建,不需要合并入 dde-control-center 项目。
其中,第一条需求是该插件的基础。自启动项的列表一方面为用户提供了清晰的展示界面,另一方面也是程序与用户交互,获取修改操作信息的基础。 第二条需求总结了该插件需要支持的功能,即添加、删除、启用、禁用,这些功能需要在前端设计对应的交互界面,同时在后端设计对应的操作接口,调用系统接口以修改自启动设置。 第三条需求与系统发布相关。目前最新的稳定发布版本是Deepin V23 Beta,而官方版本已经在发布,若修改源码统一编译控制中心,会需要对当前已发行的操作系统版本进行修改,较为不便。故需要单独编译该插件,并将其装载到系统中的插件接口中。
3 相关资料调研 3.1 Deepin开机自启动系统设置 Deepin系统通过检测固定的目录,检测自启动项。通过放置应用程序的.desktop文件在其中一个自动启动目录中,系统可以检测到该应用程序的自启动设置。通过修改.desktop文件中的对应字段,可以修改对应应用程序的自启动设置。
3.1.1 自启动目录 在“desktop base directory specification”中的“Referencing this specification” 部分进行定义了自动启动目录是 $XDG_CONFIG_DIRS/autostart。
如果同一文件名位于多个自动启动目录下,只应使用最重要目录下的文件。
示例:
如果未设置$XDG_CONFIG_HOME,用户主目录中的自动启动目录为~/.config/autostart/。
如果未设置$XDG_CONFIG_DIRS,系统范围的自动启动目录为/etc/xdg/autostart/。
如果未设置$XDG_CONFIG_HOME和$XDG_CONFIG_DIRS,并且两个文件/etc/xdg/autostart/foo.desktop和 ~/.config/autostart/foo.desktop存在,那么只有文件~/.config/autostart/foo.desktop将被使用,因为~/.config/autostart/比/etc/xdg/autostart/更重要。
3.1.2 应用程序的.desktop 文件 一个应用程序的.desktop文件必须符合"桌面入口规范"中定义的格式。所有关键字应按照定义进行解释,但以下情况除外,以便考虑到位于自动启动目录中的.desktop文件不会显示在菜单中。
Hidden关键字 当.desktop文件的Hidden关键字设置为true时,该.desktop文件必须被忽略。当多个具有相同名称的.desktop文件存在于多个目录中时,仅应考虑最重要的.desktop文件中的Hidden关键字:如果其设置为true,则其他目录中具有相同名称的所有.desktop文件也必须被忽略。
OnlyShowIn和NotShowIn关键字 OnlyShowIn项可以包含一个字符串列表,用于标识必须自动启动此应用程序的桌面环境,其他桌面环境不得自动启动此应用程序。
NotShowIn项可以包含一个字符串列表,用于标识不得自动启动此应用程序的桌面环境,其他桌面环境必须自动启动此应用程序。
这两个关键字中的一个,要么是OnlyShowIn,要么是NotShowIn,可以出现在单个.desktop文件中。
TryExec关键字 带有非空TryExec字段的.desktop文件如果TryExec关键字的值与已安装的可执行程序不匹配,则不得自动启动。TryExec字段的值可以是绝对路径,也可以是没有任何路径组件的可执行文件名。如果指定了没有任何路径组件的可执行文件名,则会搜索$PATH环境以找到匹配的可执行程序。
注意事项 如果通过在系统范围的自动启动目录中安装.队员:复旦大学 朱元依、沈扬、朱俊杰 指导老师:张亮、陈辰 企业导师:王子冲
本项目为2023年操作系统大赛企业赛道赛题。
项目链接:DDE 自启动管理插件 github仓库
一、目标描述 我们小组的选题为proj223-control-center-startup-management-plugin
DDE 深度桌面环境的控制中心提供了插件功能,以便第三方开发者可以扩展其功能并额外的功能组件添加到控制中心之中。我们将在本项目中为 DDE 桌面环境的控制中心编写一个自启动管理插件。
二、比赛题目分析和相关资料调研 为了明确题目设置的原因与需求,我们请教了了企业导师,得知:目前用户对自启动权限的管理目前只能通过 dde-launcher (启动器/“开始菜单”)的右键菜单进行管理;考虑到此功能本身也并不复杂,所以设置了此课题,旨在解决这样的问题。
而对于此开发任务的具体实施,主要需要对dde-dock插件运行的原理和deepin开机自启动的设置方式进行调研,以便进行开发。调研的具体内容包括:
了解了Qt 插件标准(Qt 插件标准)
阅读整理了dde-dock官方仓库中的插件工作原理(插件工作原理)
学习其他开发者的插件项目(CMDU_DDE_DOCK)
阅读整理了各个论坛中关于deepin开机自启动项的讨论(169824、124825726)
三、系统框架设计 1、项目整体结构设计 符合dde-dock提供的接口与插件开发规范,本项目将分为插件类(SelfStartPlugin)、部件类(MainWidget)和自启动管理窗口(AppletWidget)分别进行功能的实现。其中,项目的结构和各对象所包含的数据结构与方法如下图所示:
2、类功能说明 插件类SelfStartPlugin负责实现插件与dde-dock交互所必须的接口;部件类MainWidget负责在dde-dock中展示该插件的图标;自启动管理窗口AppletWidget负责实现核心功能:读取Deepin系统的开机自启动项、同时对各个软件的开机自启动进行管理(包括添加、删除、启用、禁用)。
3、实现描述 (1)插件类 在插件类中,主要实现了dde-dock中 PluginItemInterface相关的接口,便于系统加载并实现插件的功能。接口包括以下内容:
名称 功能 SelfStarupPlugin 类的初始化函数 pluginName 返回插件名称,用于在 dde-dock 内部管理插件时使用 init 插件初始化入口函数,参数 proxyInter 可认为是主程序的进程 pluginDisplayName 返回插件名称,用于在界面上显示 itemWidget 返回插件主控件,用于显示在 dde-dock 面板上 itemPopupApplet 返回鼠标左键点击插件主控件后弹出的控件 flags 用于返回插件的属性,例如插件显示的位置,插件占几列,插件是否支持拖动等 pluginIsAllowDisable 返回插件是否允许被禁用(默认不允许被禁用) pluginIsDisable 返回插件当前是否处于被禁用状态 pluginStateSwitched 当插件的禁用状态被用户改变时此接口被调用 itemContextMenu 返回鼠标左键点击插件主控件后要执行的命令数据 invokedMenuItem 返回鼠标右键点击插件主控件后要显示的菜单数据 (2)部件类 名称 功能 MainWidget MainWidget部件的初始化函数,设置dde-dock图标的基础样式与文字内容 ~MainWidget MainWidget部件的析构函数 sizeHint 设置图标大小的函数 插件图标 最左侧的SELF_STARTUP图标为该插件图标。