seedkit - 用 web technology 撰寫 desktop application

繼上次 COSCUP 講了 Javascript in linux desktop 後,最近又在看之前 penk 跟我介紹的 seedkit,還有會後 sleepnova 跟我提到一些 java 上有些 javascript implementation 的實做,去慶功宴的時候阿修又提了好幾個 javascript 寫 desktop application 的 framework,才知道這個部份已經蠻多人在做了。

不過這次會議也有另外一個感想,就是 web developer 還是比較希望維持原有的開發模式,而不僅只是使用 javascript 語言來撰寫程式。翻開 seed/gjs 寫的 javascript 源碼,開發的思維其實跟 python 差不多,幾乎都可以從 python 無痛轉換了。

而 seedkit 就是打算維持原本 web application 的開發模式而設計的工具。在 seedkit-viewer 的 example 裡面提供了一些有趣的範例。比如說 dbus-rhythmbox  這個範例,他透過 dbus 的方式控制歌曲的上、下首切換。

右邊的 seedkit-viewer 視窗裡面的 next/previous 可以操作 rhythmbox 上、下首。這個程式與 rhythmbox 是兩個獨立的程式,而不是 rhythmbox 的外掛。

這個功能可以在各種語言用 dbus 實做出來。不過在 Seedkit 的實做方式則是比較近乎 web application 的開發方式。首先我們看源碼中的 ui.html (沒錯是 HTML 檔案)。

<html>
    <head>
    <link rel="stylesheet" href="./ui.css" type="text/css" media="all" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script src="./ui.js"></script>

    </head>
    <body>
    <div class="demo">
        <img id="cover-art"></img>
        <div id="prev-button" class="button">Prev</div>
        <div id="next-button" class="button">Next</div>
        <div id="file-uri"></div>
    </div>
</body>
</html>

基本上就是使用 jquery 函式庫,並引入了 ui.js 這個 javascript。接下來是 ui.js。

Seed.include("./dbus-rhythmbox.js");

$(document).ready(function(){

var shell = new RhythmboxShell();
var player = new RhythmboxPlayer();

//playeplayer.getVolumeRemote(function (volume) {print("oi")});

$("#next-button").click(function(){
 player.nextRemote();
});

$("#prev-button").click(function(){
 player.previousRemote();
});


player.connect("playingUriChanged", 
        function(emitter, uri){
  //var song = shell.getSongPropertiesRemoteSync(uri);
  //print(song); 
        });

player.connect("playingSongPropertyChanged", 
        function(emitter, title, property\_name, old\_value, new\_value){
  if (property\_name == "rb:coverArt-uri")
   $("#cover-art").attr('src', new\_value);
});

});

這段也相當簡單,就是按下 next 或 previous 之後去呼叫 player.nextRemote/previousRemote,並且使用了 jquery 的語法。至於 player 則定義於 dbus-rhythmbox.js 裡面。

另外,這個範例為了方便的操作 dbus,所以做了一個 wrapper 在 dbus-local.js,有興趣的話可以翻一下,特別是把 next mapping 到 nextRemote 可以翻一下 proxifyPrototype 這個函式。

基本上 seedkit 讓開發桌面程式的方式盡可能的接近網頁應用程式,並且還是可以使用系統的 API 去作檔案 IO、網路存取、dbus、notification 之類的系統 API,感覺起來是 GTK 裡面比較完整的解決方案。

而更棒的是 seedkit 也可以當作一個 Gtk Widget,你可以將這些程式片段嵌入在 UI 的一部分,這也保持了開發彈性,開發者還是可以選用其他的 UI 函式庫如 Clutter 或是 GTK,而不是只能使用 Web Application 的 View。


讀者回函
讀完本文之後有什麼建議或回饋嗎?請按此在 Twitter 上面分享此文並且提及我,或是透過寄送電子郵件分享你的看法 😎