最近更新: 2012-08-03

gjs/gnome-shell 指定 GIRepository 的搜尋路徑

如果你自己製作了一個 GIRepository 資源,但是它的 typelib 文件沒有放在 GIRepository 預設的搜尋路徑中,那麼你可以用 prepend_search_path() 加入。

例如我寫了一個 SystemSignal agentPOSIX 的類別庫,並且做成 GIRepository 資源。 但是 SystemSignelPOSIX typelib 放在 /home/rock/gir-typelib 目錄下,我應該這麼做:

#!/usr/bin/gjs
const mainloop = imports.mainloop;

const gi = imports.gi.GIRepository; // import namespace

gi.Repository.prepend_search_path("/home/rock/gir-typelib");
// add another path to search girepository typelib.

const Posix = imports.gi.Posix; // my girepository.
const SystemSignal = imports.gi.SystemSignal; // my girepository.

var og = new SystemSignal.Agent();
og.connect("delivered", function(self, signum) {
    if (signum == Posix.SIGTERM) {
        print("I catch SIGTERM.");
        mainloop.quit('');
    }
});

var pid = Posix.getpid();

mainloop.timeout_add_seconds(2, function(){
    Posix.kill(pid, Posix.SIGTERM);
    return false;
});

mainloop.timeout_add_seconds(5, function(){
    print("SIGTERM is not caught.");
    Posix.exit(1); //failed.
});

mainloop.run('');
Posix.exit(0);

gi.Repository.prepend_search_path() 只決定額外的 GIRepository typelib 搜尋路徑。 至於 typelib 依賴的共用庫 (.so) 仍然要按 ldconfig 的設置放置。

以本例來說,如果 SystemSignal typelib 依賴的 libsystem-signal-agent.so 未放置在 ldconfig 的搜尋路徑,則 gjs 載入時將擲出錯誤: Failed to load shared library 'libsystem-signal-agent.so' referenced by the typelib

樂多舊網址: http://blog.roodo.com/rocksaying/archives/20113696.html