gnome-extension
是用JavaScript
写的。框架叫GJS
,基于mozilla
的SpiderMonkey
引擎,叫蜘蛛猴/猿。猿猴不分,猿似乎更适合中国土话。
小白也可以写gnome的扩展。
- 只要会C和一点点C++的概念。你就可以上手使用js。因为js本来也没有类,只是在ES6假假的定义了一个类的写法。
- 学js是没必要的,第一次写扩展时,我在推上才知道有
闭包
,在stackoverflow才知道有原型
。
- 现在开发的好处就是不用频繁迭代了。现在的版本是从40开始的。在此之前,因为迭代开发的关系,导致不同的版本有不同的兼容问题。
- 几个开发者都是从被抛弃的
Vala
过来的,居然和我有共同语言。
- 话无遮拦,是我提倡的学习传统,叫
鸣学
。也就我一个人在Matrix
的房间里面一顿乱说。
- 开发资料的来源,只有
https://gjs-docs.gnome.org/
,https://gitlab.gnome.org/GNOME/gnome-shell/tree/main/js/ui
和聊天室。
gjs-docs
只是大概全的简易函数手册,反正gnome传统的手册都是那样,其实只能叫列表。
gitlab...ui
就是看源码,真实的在你本机运行的源码。抄吧。
Matrix
其实是和以前的irc桥接的聊天室,审查,开发,都在里面,平时好严肃。除开我进去乱聊。
开发步骤
- 手册都在
https://gjs.guide/
,规范要求和简单例子都有。虽然我也没看。
- 连风格都规定了
CamelCase
和smallCamelCase
等,我写了10个扩展后才知道。
- 为了不被经常说格式问题,我才开始使用
clang-format
假假的格式化下代码。我喜欢Webkit
的风格。
1
2
3
4
5
6
7
8
9
|
⭕ cat ../_clang-format
BasedOnStyle: WebKit
AllowShortBlocksOnASingleLine: Always
AllowShortIfStatementsOnASingleLine: AllIfsAndElse
BreakBeforeBraces: Attach
TabWidth: 4
UseTab: Always
AlignConsecutiveAssignments: true
SpacesBeforeTrailingComments: 2
|
- 现在开发简单,新建扩展如下。
--template
是可以补全的。
1
|
⭕ gnome-extensions create --uuid=speed@eexpss.gmail.com --name="Screen Net Speed" --description="animation net speed on screen" --template=indicator
|
- 根据模板,只是在
~/.local/share/gnome-shell/extensions/
产生2个或者3个固定的文件。extension.js
,metadata.json
,stylesheet.css
(可选)。
- 然后,赶紧在
github
建一个仓库,clone
到本地,再把上面extensions
目录的文件移动到仓库,然后把文件链接回去。重点:在仓库里编写,在X11
环境,Alt-F2
按r
按回车,重启,这样链接的文件就可立刻生效。
- 不要在
extensions
目录写东西,遇到自己的扩展更新,按Alt-F2 r
后,会被冲掉源码的。
wayland
下使用这样的命令,重启调试。设置屏幕分辨率,是在SO等了好久没人理,在聊天室问才知道的。
1
2
|
env MUTTER_DEBUG_DUMMY_MODE_SPECS=1024x768 \
dbus-run-session -- gnome-shell --nested --wayland
|
- 调试使用如下命令,查看错误。可以使用各种
*Lint
提前检查语法等基本错误,反正对比过后,我懒得折腾。
1
2
|
⭕ type glog
glog 是“journalctl -f -o cat /usr/bin/gnome-shell”的别名
|
- 打包使用如下命令,
--ex
可补全,是需要附加的资源文件。打包是@uuid@.shell-extension.zip
这样的压缩包。后期虽然可以zip -u
更新,但gnome-extensions
支持自动编译gschema
设置和po
翻译等各种资源文件,省略手动过程。
1
|
⭕ gnome-extensions pack -f --extra-source=Clock.js
|
- 发布在
https://extensions.gnome.org
的Add yours
。然后等待审查。遇到过两三次,我提交后,网页才刷新,就显示通过了的,怀疑审查者的手抖了一下。
- 每个扩展都支持在页面,手动提交屏幕截图和应用图标。这两项居然没纳入规范。我的图标一般都是精心制作的svg,网页却只支持png格式。屏幕截图可以gif,有人还厉害的在资源文件里面嵌入视频教程的。
- 可能是为了强推js,凡是能js实现的,不能使用其他语言,一行bash能搞定的,必须一堆js来实现。因为某些库被阉割,可能导致实现起来蛮复杂的。比如
GLib
和Cairo
的某些函数不被支持。
- 审查不能夹带私货的,不明确的配置,后期可能在线更新的都不行。会被说:这会导致偷偷挖矿,可能引起国际争端,一堆严重的玩笑。🤣
Holmes
帮我第一个扩展。Just.P
一直热心帮忙。Simon
最认真的精确帮忙(网页,扩展搞那么漂亮,头像却最土😆)。GdH
和Romain
也都热心。被卡住的时候,瞎聊才能开阔思路。