いがらしです。

「[ruby-ext:00234] Modal Dialogbox」で 、
Toru Hoshina <hoshina / best.com>さんは書きました:

> 保科です。
> 
> ruby-1.3.5-970531 と ruby/gtk 0.18 でちょっとしたプログラムなぞ
> 書いてみたいなぁ、などと無謀な試みをしているのですが(汗)
> Modal Dialogbox のところで詰まっています。

「無謀な試み」なんて言わずにどんどん使って下さいね。

> gtk_window_set_modal() を使うと、Modal Window はすぐにできるのですが
> ボタンを押されるまで戻り値を返さないような、Modal Dialogbox を
> 作ろうとすると、gtk_mail_iteration() がどうしても欲しくなって
> しまうのです。

gtk_mail_iteration()ってどういう使い方するものなのか
知らないんです。Gtkの配布物の中にも使用例が見つからないし。
どこかに(C言語レベルの)サンプルプログラムないでしょうか?

> 小汚いプログラムで恐縮なのですが、以下のものを走らせると、
> ダイアログボックスが出た時点で、戻り値 2 で返ってきてしまいます。
> 
> コメントを外せばボタンを押してダイアログボックスを閉じるまで
> 返ってこなくなり、戻り値も 1 になるのですが…

このプログラムで
  while val == 2
    Gtk::main_iteration()
    STDERR.print("*")
  end
のようにすると結構このwhileループを回っているように見えるんですが、
CPU timeをそんなに消費してはいないみたいですね。

> で、gtk_main_iteration() を rbgtk.c に追加すること自体は簡単でしたので
> 自分のところではそうして Gtk::main_iteration が使えるようにして
> いるのですが、ひょっとして、私はなにかひどい誤解をしていたりする
> のでしょうか?

どういう場面でgtk_main_iteration()を利用すべきか
まだ私には分からないのですが、取り込んでおきます。

実は私もFileSelectionを使う時に悩んだのですが、
こんな風にGtk.mainとGtk.main_quitを使っていました。

      include Gtk
      #     :
      fs = FileSelection.new(Res.title_file_open)
      fs.set_modal(true)
      result = false
      fs.signal_connect("destroy") do
	main_quit
      end
      fs.ok_button.signal_connect("clicked") do
	fs.hide
	@filename = fs.get_filename
	result = true
	fs.destroy
      end
      fs.cancel_button.signal_connect("clicked") do
	fs.hide
	fs.destroy
      end
      fs.show_all
      main
      # resultに応じた処理
      #        :

それともダイアログボックスでの選択に依存する処理はすべて
ダイアログボックスのボタンのシグナルハンドラに書くべき
なんでしょうか?
akaishiさんのページ
    http://ruby.freak.ne.jp/gtk/fileselection.html
のプログラムではそうなっています。

----
五十嵐  宏  (Hiroshi IGARASHI)