目录

Gnome扩展杂谈

gnome-extension 是用JavaScript写的。框架叫GJS,基于mozillaSpiderMonkey引擎,叫蜘蛛猴/猿。猿猴不分,猿似乎更适合中国土话。

小白也可以写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/,规范要求和简单例子都有。虽然我也没看。
  • 连风格都规定了CamelCasesmallCamelCase等,我写了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.jsmetadata.jsonstylesheet.css(可选)。
  • 然后,赶紧在github建一个仓库,clone到本地,再把上面extensions目录的文件移动到仓库,然后把文件链接回去。重点:在仓库里编写,在X11环境,Alt-F2r按回车,重启,这样链接的文件就可立刻生效。
  • 不要在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.orgAdd yours。然后等待审查。遇到过两三次,我提交后,网页才刷新,就显示通过了的,怀疑审查者的手抖了一下。
  • 每个扩展都支持在页面,手动提交屏幕截图和应用图标。这两项居然没纳入规范。我的图标一般都是精心制作的svg,网页却只支持png格式。屏幕截图可以gif,有人还厉害的在资源文件里面嵌入视频教程的。
  • 可能是为了强推js,凡是能js实现的,不能使用其他语言,一行bash能搞定的,必须一堆js来实现。因为某些库被阉割,可能导致实现起来蛮复杂的。比如GLibCairo的某些函数不被支持。
  • 审查不能夹带私货的,不明确的配置,后期可能在线更新的都不行。会被说:这会导致偷偷挖矿,可能引起国际争端,一堆严重的玩笑。🤣
  • Holmes帮我第一个扩展。Just.P一直热心帮忙。Simon最认真的精确帮忙(网页,扩展搞那么漂亮,头像却最土😆)。GdHRomain也都热心。被卡住的时候,瞎聊才能开阔思路。