seedでGIOしてみる

ということで、seed-exampleのls.jsを使って、girファイルリストを作ってみる。

#!/usr/bin/env seed

const Gio = imports.gi.Gio;
var g_file = Gio.file_new_for_path("/usr/share/gir-1.0");
var g_file_enumerator = g_file.enumerate_children("standard::name");

while ((g_file_info = g_file_enumerator.next_file())){
    Seed.printf("%s",g_file_info.get_name());
}

PATHは/usr/share/gir-1.0に決め打ちして、PATHからGFileオプジェクトを新規作成する。詳細は、devhelpで、g_file_new_for_path()を見てください。

メソッド名(file_new_for_path)の正式名は、

$ grep file_new_for_path /usr/share/gir-1.0/*
/usr/share/gir-1.0/Gio-2.0.gir:    <function name="file_new_for_path" c:identifier="g_file_new_for_path">

このときの、c:identifier でわかります。

次に、enumrate_children()を使って、GFileEnumratorオブジェクトを取得する。詳細は、devhelpで、g_file_enumerate_children()を見てください。引数は"standard::name"ですが、これは、g_file_enumerate_children()関数の第二引数のattributeです。ワイルドカードも使えるそうです。/usr/include/glib-2.0/gio/gfileinfo.hの中に定義が書いているので、調べてみてください。今回は名前だけなので、standard::name (#define G_FILE_ATTRIBUTE_STANDARD_NAME "standard::name" /* byte string */)を使ってます。

後はwhileでnext_file()がnullを返すまでget_name()で帰ってくるファイル名を表示してます。next_fileはg_file_enumerator_next_file()を、get_nameはg_file_info_get_name()を調べてみてください。

これだけで、Seed + Gio でファイルリストができます。次は、Gtk.TreeViewで表示してみたいと思います。seed-examples/gtktreeview.jsを参考にする予定です。

まぁ、ヘッダファイルやgirファイルやdevhelpを駆使しても、サンプルが無いとまだまだ何もできない状況ですが、ぼちぼちやっていきます。