|
From: Kouhei S. <ko...@co...> - 2011-09-10 14:33:56
|
須藤です。
In <CAM...@ma...>
"Re: [ruby-gnome2-devel-ja] vteの実装をしてみました" on Tue, 6 Sep 2011 20:17:42 +0900,
Masaaki Aoyagi <mas...@gm...> wrote:
> 教えて頂いたことを踏まえ、いくつか変更しましたので差分を添付します。
ありがとうございます!
> 前回からの変更点は、
> * fork_command_full を Hash 引数に変更
いいと思います!
rb_grn_*()は関数のprefixをrb_grnではなく、Ruby-GNOME2のやり
方にあわせて変えてしまってOKです!
> * 引数のデフォルトを fork_command に合わせる
いいと思います!
> * ブロック引数を省略した場合は、child_setup を渡さないように
> これにより、ブロックを省略した場合は動くようになりましたが、ブロックを渡した場合は相変わらずよく分からない。。。
少し考えてみたのですが、
vte_terminal_fork_command_full()も__vte_pty_spawn()もどちら
もchild_setupにVtePtyを渡してくれないのでだいぶ厳しいですね。
思いついたのは、こんなのですが、大変なので、とりあえず、
child_setupは未サポートがいいんじゃないかと思います。
1. pipeを作る。
2. child_setupの引数として、読み込み用のpipeと渡されたブロッ
ク引数を持つ構造体を作る。
3. vte_terminal_fork_command_full()を呼び出す。
4. child_setupの中では読み込み用のpipeをreadする。
(ここでブロック。)
5. vte_terminal_fork_command_full()が返ってきたら
vte_terminal_get_pty_object()でVtePtyを取ってきて、
書き込み用のpipeに取ってきたVtePtyのアドレスをwriteする。
6. 5.の書き込み用のpipeをclose。(まだ早いかも。)
7. 4.でブロックしていたreadから5.で取ってきたVtePtyのアド
レスがわかるので、それを引数にしてvte_pty_child_setup()
を呼び出す。
8. child_setupの中で4.の読み込み用のpipeをclose。
9. child_setupの中でブロック引数を呼び出す。
> * fork_command で引数を省略した際と Hash で渡した際は fork_command_full に処理を委譲する
> * vte_terminal_fork_command が使われる場合は、warning メッセージを出力する
> * search_get_wrap_around が"?"付きメソッドになっていなかったので修正
いいと思います!
> いかがでしょうか?
コミットしてください!
あと、(うろ覚えですが)いくつか気になった所があるのですが、
これはコミット後に直すのでもいいかなぁと思っています。
* NIL_P(xxx) ? NULL : RVAL2CSTR(xxx)の代わりに
RVAL2CSTR_ACCEPT_NIL(xxx)というのが使えた気がする。
(うろ覚え)
* NIL_P(xxx) ? NULL : RVAL2GOBJ(xxx)は
RVAL2GOBJ(xxx)だけでいけた気がする。
(うろ覚え)
>> search_{get,set}_XXXなんですが、{get,set}を先頭に持ってきて
>> {get,set}_search_XXXにするのはいかがでしょうか?set_が先頭に
>> ないとG_DEF_SETTERSでsearch_XXX=みたいなメソッドを自動生成す
>> るやつが動かない気がするんです。
>>
>> でも、これもメソッド名の統一感的に難しそうですねぇ。うーん。
>
> これは、以下の命名規則のページでも動詞の削除などをしないとされているので、個別対応となると思っています。
> 大して数はないので、それでいいのかなと。
> http://ruby-gnome2.sourceforge.jp/hiki.cgi?Naming+and+Conversion+Rules
> 今回対象となるメソッドは、search_set_gregex と search_set_wrap_around ですが、
> 代入メソッドを定義した方が良いでしょうか?
あった方がRubyっぽく書けるような気がするのでお願いします。
> また、見ていて気づいたのですが search_set_gregex はNULL許容のため、引数がオプショナルになっており
> search_set_gregex()とコールするとNULLを渡した事になり、設定が解除されてしまいそうです。
> 引数を必須にしておいた方が良いでしょうか?
あぁ、そうですね。
オプショナルにしないほうがいいと思います。
search_set_gregex()とsearch_get_gregex()について少し考えてみ
たのですが、現状はGLib::Regexpがなく、今後も追加するかどうか
はまだ検討する余地があると思う(*)ので、今のところは以下のよ
うにするのはいかがでしょうか?
* search_set_gregex: 引数は文字列を受け取り、内部でGRegexp
を生成して使う。
* search_get_gregex: APIを提供しない。あるいは
g_regex_get_pattern()の値を返す。
(*) RubyのRegexpとGLib::Regexがあると混乱しそうとか、Rubyの
Regexpの方が断然使いやすいのでGLib::Regexがある意味があ
るのかとか。
|