经过了半个月的摸爬滚打,总算在写GNOME插件上走上了点正轨。这篇文章虽然是指南,其实就是一些抱怨(笑)
概况
首先说说GNOME Extension是什么来的。
2011年,GNOME释放了万众期待的大版本更新GNOME 3。据wiki描述,这个万众期待的大版本气得Linus Torvalds投向了xfce,并且把GNOME开发组狠狠地骂了一顿。不过在GNOME 3这么迭代了几个版本之后,他又用回了GNOME。
而GNOME Extension就是GNOME 3开始的,一种更加开放自由的方式提供给用户tweak自己的工作环境的方式。GNOME 3的桌面环境称作GNOME Shell,它负责Top Bar,还有Activites,Workspaces。整个GNOME Shell是由一种Javascript方言GJS和一大堆GTK+库Binding写成的。
前端开发的同学都知道,无论一个网页写成什么样子,我只要在控制台输入几行js代码,就可以魔改这个网页,也即没有所谓名字保护机制,任何部分都可以自由访问。GNOME Shell自然也是这样,所以每一个插件上传都需要相当长的时间由工作人员Review之后才能释出。
在终端输入gjs
,你就可以开始用一个由GNOME倾情提供的js解释器了:
$ gjs
gjs> print("Hello World!");
Hello World!
gjs> const Gtk = imports.gi.Gtk;
gjs> const GLib = imports.gi.GLib;
gjs> Gtk.init(null);
gjs> let mainloop = new GLib.MainLoop(null, null);
gjs> let w = new Gtk.Window();
gjs> w.show_all();
gjs> mainloop.run();
在你打完最后一句之后,应该会出来一个小窗口儿了。
是不是有一种胜券在握的感觉。有了这个gjs感觉可以扔掉nodejs了(两者使用的JS引擎不同,nodejs和QML使用Google的V8,而GJS使用Mozilla的SpiderMonkey,这两家真是世仇啊哈哈),甚至还可以10行以内开发Native GUI,还可以使用由GTK+提供的所有库!是不是很爽。其实噩梦才刚刚开始。`