永井@知能.九工大です. From: Hidetoshi NAGAI <nagai / ai.kyutech.ac.jp> Subject: [ruby-list:41666] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb Date: Mon, 5 Dec 2005 23:51:10 +0900 Message-ID: <20051205.235102.74727515.nagai / ai.kyutech.ac.jp> > あ,MacOS X 独自のものが使われているんですね. > てっきり他の環境と同じで,通常の topleve ウィジェットを用いた > ダイアログになっていると思っていました. > そうなると,ちょっと違う部分を調べないといけないですね. > > # Tk のソースの macosx ディレクトリ内に定義があるのかなぁ... MacOS X 用のソースの中で定義されていました. 結論から申し上げますと, 「ごめんなさい.1.8.4 には間に合いません」 です. MacOS X 用のダイアログボックスでは,Aqua 環境に合わせるために MacOS X 独自の API を用いて実装されています. pthread も用いていますので,今回の問題は pthread が絡んだ 問題であるのかもしれません. 何とかしたいという気持ちは十分にあるのですが, 私は MacOS X に全く触ったことがなく, Aqua の API がどのようになっているのかも全く知りません. MacOS X の実機も手元にないですし, 仮に今 MacOS X の実機が手元届いたとしても, Aqua の API を理解して問題を解消するには時間が全く足りません. したがって,Ruby 1.8.4 のリリース版では 残念ながらこのままということになります. 以下は余談となるのですが, もし Aqua 版 Tcl/Tk がインストールするファイルにおいて tk のライブラリ以下のファイルが同じものであるならば, Tk インタープリタを起動した後に tk_messageBox 等のコマンドを 強制的に置き換えてしまうことで回避できるかもしれません (もちろんプラットフォーム独自のダイアログは使えなくなりますが). <tk-lib-dir>/tk.tcl の中に ======================================================== #---------------------------------------------------------------------- # Define common dialogs on platforms where they are not implemented # using compiled code. #---------------------------------------------------------------------- if {[string equal [info commands tk_chooseColor] ""]} { proc ::tk_chooseColor {args} { return [eval tk::dialog::color:: $args] } } if {[string equal [info commands tk_getOpenFile] ""]} { proc ::tk_getOpenFile {args} { if {$::tk_strictMotif} { return [eval tk::MotifFDialog open $args] } else { return [eval ::tk::dialog::file:: open $args] } } } if {[string equal [info commands tk_getSaveFile] ""]} { proc ::tk_getSaveFile {args} { if {$::tk_strictMotif} { return [eval tk::MotifFDialog save $args] } else { return [eval ::tk::dialog::file:: save $args] } } } if {[string equal [info commands tk_messageBox] ""]} { proc ::tk_messageBox {args} { return [eval tk::MessageBox $args] } } if {[string equal [info command tk_chooseDirectory] ""]} { proc ::tk_chooseDirectory {args} { return [eval ::tk::dialog::file::chooseDir:: $args] } } ======================================================== などというような記述があるなら,これに基づいて ======================================================== Tk.ip_eval(<<'EOS') proc ::tk_chooseColor {args} { return [eval tk::dialog::color:: $args] } proc ::tk_getOpenFile {args} { if {$::tk_strictMotif} { return [eval tk::MotifFDialog open $args] } else { return [eval ::tk::dialog::file:: open $args] } } proc ::tk_getSaveFile {args} { if {$::tk_strictMotif} { return [eval tk::MotifFDialog save $args] } else { return [eval ::tk::dialog::file:: save $args] } } proc ::tk_messageBox {args} { return [eval tk::MessageBox $args] } proc ::tk_chooseDirectory {args} { return [eval ::tk::dialog::file::chooseDir:: $args] } EOS ======================================================== という処理を Ruby/Tk 上で実行することにより, プラットフォーム独自のものではないダイアログが 使われるようになるはずです. -- 永井 秀利 (九工大 知能情報) nagai / ai.kyutech.ac.jp