Gnome Shell (やそれからフォークされた Cinnamon など) の、アプレットなどの目に見える部品の多くは JavaScript で作られている。
これは GJS なる Gnome の JavaScript バインディングをつかって書かれている。
JavaScript から Clutterを叩いている。
Clutter を介した描画処理自体は OpenGL を使って描画されるので高速に処理されることになっている。
しかし、実際に触ったことはなかったので、お試しで時計をつくることで触ってみた。
時計仕様
時計は、現在時刻と、引数で指定した時刻の差分をリアルタイム表示することとした。
また Clutter の OpenGL 描画を活かすために引数で指定した時刻の差分が60秒以下の場合は赤く点滅するようにした。
これをつくる経緯としては、とあるライブのDJセットにて、現在時刻、ストップウォッチ(開始からの時間)、カウントダウン(終了までの残り時間)
の3段表示のデジタルクロックを見かけたことである。
そして、これは普通にDJとか関係なく便利そうだと思ったことにある。
その動画は今は見つからなくなってしまったが、HTML上で再現するとおおよそ下記のようになる:
成果物
https://gist.github.com/cat-in-136/64759185fc206fa4c8cdf49ec4de361e
gjs
をインタプリタとして実行する。shebang (#!
)も指定しているので実行権限を付与して実行しても良い。
$ gjs path/to/djclock.js
メモ
Clutter.Stage
がメインウィンドウである。
Clutter自体は簡素な部品と簡素なレイアウトマネージャがあるため、簡単な配置はこれで十分である。
ボタンなど高級な部品は提供されていないので、そういうのが必要なときは何らかの方法で頑張る必要があるが、
今回はテキストを表示するだけであるのでこれで十分である。
点滅アニメーションは予めアニメーションを登録して、それをClutter.Text
にセットすればよい。
点滅処理自体はClutter自身が面倒を見る。ここはCSS Animation的な思想に近い。
その他はClutterに関係ない純粋なJavaScriptの知識で解せる内容ではあるが、
SpiderMonkey由来ということもあり普通にモダンなJavaScriptがかけるというのはいいことだ。
2011年のGnome Shell登場時はまだ使えない文法も多かったはずで、かなり面倒くさい書き方をしていたのではないかと想像する。
あとClutterの情報は日本語はもちろん英語も資料はすくない。
Gnome Shellの拡張に関する文献とClutterのAPIを参考するのが一番近道だ。
ふとしのブログにいくつか記事があって参考になるが、
ソースコードが古いので手を加える必要がある。
参考文献