2010/07/23

debian squeeze plymouth

這兩天裝了兩台 Debian Squeeze 之後,突然發現 plymouth 已經很簡單的可以使用了。如果你正巧用的是 Intel 的顯示晶片,請聽我娓娓道來…(飛踢)

首先裝 plymouth 跟一些 theme:
sudo aptitude install plymouth plymouth-themes-all plymouth-x11

plymouth-x11 我猜測應該是 plymouth 跟 gdm 接合用的一些程序。

裝好之後,請修改 /etc/default/grub,把下面這個參數加入 splash (原本應該是空的):
GRUB_CMDLINE_LINUX="splash"

接著更新 grub 參數:
sudo update-grub

因為預設的佈景主題很遜,建議你用 solar:
sudo plymouth-set-default-theme solar
sidp update-initramfs -u

做完之後重開機就完成了。雖然最後噴了一些錯誤訊息出來

2010/07/21

js-gallery: javascript desktop app 範例

這幾天用 javascript 寫了個範例,是個簡單的圖片瀏覽程式。目前行數約略 250 行,希望還是可以再精簡一點囉。




source code: http://gist.github.com/484314

GNOME javascript runtime introdution

這幾天在寫 COSCUP 議程 Javascript in Linux Desktop 的範例,對於 Seed 跟 GJS 有了些認識。先解釋一下 GNOME javascript runtime。這個時候你先要把『javascript 就是拿來寫 Web Application』的觀念先忘掉,GNOME javascript runtime 可以讓你使用 javascript 撰寫桌面應用程式,一如 pidgin, stardict, 或是 filezilla 這類的軟體(當然 js runtime 現在還沒成熟)。

這個時候問題就跟你挑瀏覽器一樣:我要用哪種 javascript engine? 目前開放源碼的 javascript 不外乎是 Mozilla Firefox 用的 Spidermonkey, Webkit 內建的 JavaScriptCore, 以及 Google Chrome 用的 V8。而 Spidermonkey 跟 JavaScriptCore 在 GNOME 裡面分別被發展成兩套 Javascript runtime: GJSSeed

或許你有點疑惑,怎麼又提 javascript engine 又提 javascript runtime?

因為有了 javascriptp engine 後,內建的函式庫並不足以開發桌面應用程序,而且在桌面應用程式也不一定有 DOM 可以使用。GNOME 為了解決這個問題,發展了一套 framework: GObject introspection (GI),他主要的用處是提供 GNOME 使用 C 語言撰寫的函式庫跟其他 runtime 如 javascript, python, ruby 的橋樑,讓這些語言都可以透過 binding 的方式來使用 GNOME 函式庫。不過 GObject introspection 發展以前,python 跟 ruby 都已經有了跟 gnome 的 binding,只是 GObject introspection 採用更全面的方式來分享這類 dynamic language 作 binding 時都需要的基礎工程。詳細的原理寫出來就太多了,略過 XD

所以基本上 GNOME 開發的函式庫都已經包含了 GIR (GObject Introspection Repository),也就是給動態語言用的 binding 資料。Runtime 如 javascript engine 就可以利用這些資料來製作對 GNOME 函式庫的 binding,所以使用 javascript runtime 也可以撰寫 GTK 程式。

以下是個 GTK hello world in javascript
#!/usr/bin/seed

Gtk = imports.gi.Gtk;
Gtk.init(Seed.argv);

var window = new Gtk.Window();
window.signal.hide.connect(Gtk.main_quit);
window.show_all();
Gtk.main();

如果你有安裝 python-gi, 那也可以透過 gir 來呼叫 gtk (而不是以現有的 python-gtk)。不過 GI 官網上是建議如果已經有了作好的 binding 就用原本的就好。畢竟 GI 的東西沒有針對每個語言 fine tune。


#!/usr/bin/env python
from gi.repository import Gtk
import sys

Gtk.init (sys.argv)

window = Gtk.Window ();
window.connect ("hide", Gtk.main_quit);
window.show_all ();
Gtk.main ();



晚點再來寫 seed 跟 gjs 真的動工時的差異。

2010/07/14

vim 一次註解多行

eclipse 有個蠻不錯的功能,就是框選多行之後,按下 ctrl + / 就可以註解所選的行。那 vim 呢?找了一下,看到有類似的功能。

首先按下 ctrl + v 區塊選取,選取你要標注最前面的一個字元。比如說

var width = aWin.document.documentElement.scrollWidth;
var height = aWin.document.documentElement.scrollHeight;
if (effect.viewCanvas == null)
   effect.viewCanvas = this.createCanvas (width, height);

就選取 v, v, i 和空白。按下大寫 I,輸入你正在寫得程式語言的註解,javascript 就是 //。最後按下 Esc 就完成了。

不過如果要像 eclipse 按一次 ctrl + / 就註解,再按一次取消註解就要寫 vim script 了。

2010/07/11

在 Ubuntu 10.04 啟用 Touchpad 雙指滾輪的功能

這幾天用 EeePC S101 的時候,發現 Ubuntu 10.04 對於 Elantech Touchpad 的雙指滾輪又改成在 Touchpad 右側滑動的滾輪了。

搜尋了一下才知道現在設定的方式都是用 xinput 的方式設定。不過上面的設定方式是針對 Synaptics Touchpad,所以要先用以下指令找出 Elantech 所用的裝置名稱:
xinput list
用完之後會有以下輸出,可以從裡面發現使用的 Touchpad 裝置名稱是 ETPS/2 Elantech Touchpad
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                 id=13 [slave  pointer  (2)]
⎜   ↳ Macintosh mouse button emulation         id=14 [slave  pointer  (2)]
⎣ Virtual core keyboard                    id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                                id=7 [slave  keyboard (3)]
    ↳ Power Button                             id=8 [slave  keyboard (3)]
    ↳ Sleep Button                             id=9 [slave  keyboard (3)]
    ↳ USB2.0 0.3M UVC WebCam                   id=10 [slave  keyboard (3)]
    ↳ Asus EeePC extra buttons                 id=11 [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard             id=12 [slave  keyboard (3)]

所以只要用以下指令就可以設定好 Elantech Touchpad 的雙指滾輪
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Two-Finger Scrolling" 8 1
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Synaptics Two-Finger Scrolling" 8 1 1
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Synaptics Two-Finger Pressure" 32 10
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Synaptics Two-Finger Width" 32 8

不過這些設定都不會保存下來,需要在登入的時候重新設定。所以我把他放在 ~/bin/touchpad-setting.sh 底下,並且用 chmod +x touchpad-setting.sh 更改成可執行權限,然後在 [系統] → [偏好設定] → [始動應用程式] → [初始啟動程式] 裡面加入 touchpad-setting.sh。

這個時候又遇到一個奇怪的問題,我直接執行這個 script 有用,不過如果是登入的時候自動執行卻沒用。後來我猜是剛登入的時候 xinput 的 backend 可能還沒準備好,所以執行下去沒反應。最後我又加入了 sleep 5 之後,就一切正常了。
#!/bin/bash

sleep 5
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Two-Finger Scrolling" 8 1
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Synaptics Two-Finger Scrolling" 8 1 1
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Synaptics Two-Finger Pressure" 32 10
xinput set-int-prop "ETPS/2 Elantech Touchpad" "Synaptics Two-Finger Width" 32 8

2010/07/06

Firefox 之簡易觸控手勢實做

其實我不知道 Firefox 有沒有觸控手勢。不過寫了一陣子的延伸套件,依我看到的資料來說應該是還沒有。在 framework 還沒支援觸控手勢時,我們可以先用簡單的方式實做。觸控手勢跟一般滑鼠手勢不同,觸控沒有『右鍵』可以使用。所以就我的狀況而言,我需要使用拖曳的方式來實做。

比如說我有個 richlistbox 上的 item 要作往右滑的觸控手勢,首先在 XUL 加上 Drag & Drop 的事件

<richlistbox id="testList" 
                ondragstart="gesture.onDragStart (event);"
                ondragend="gesture.onDragEnd(event);">
    ...
    </richlistbox>

接下來在 javascript 中簡單計算時間跟滑動距離來決定要不要觸發 gesture。

var gesture = {
    gestureStartX: 0,
    gestureEndX: 0,
    gestureTimeStart: 0,
    gestureTimeEnd: 0,

    onDragStart: function (event) {
        event.dataTransfer.setData("text/plain", "Drag Gesture");
        gesture.gestureStartX = event.screenX;
        gesture.gestureTimeStart = (new Date()).getTime();
    },

    onDragEnd: function (event) {
        gesture.gestureEndX = event.screenX;
        gesture.gestureTimeEnd = (new Date()).getTime();
        let offsetX = gesture.gestureEndX - gesture.gestureStartX;
        let offsetTime = gesture.gestureTimeEnd - gesture.gestureTimeStart;

        if (offsetX < 500 && offsetX > 0 && offsetTime < 1000) {
            Application.console.log ("X offset: " + offsetX);
            Application.console.log ("time offset: " + offsetTime);
            Application.console.log ("Do gesture.");
        }
    },
};


不過這跟 firefox 延伸套件的滑鼠手勢差距還很大,比較好的解法是 Firefox (或是說 Fennec/Firefox Mobile) 要提供觸控手勢 framework。