From: Kouhei S. <ko...@co...> - 2011-09-10 14:33:56
|
須藤です。 In <CAMyNdeUKdponJE=fMSV4hSvEtEEywoX=fUe...@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がある意味があ るのかとか。 |