[ruby-list:41667] Re: MacOS X Aqua 対応のための tcltklib の extconf.rb

From: Hidetoshi NAGAI <nagai@...>
Date: 2005-12-06 02:10:25 UTC
List: ruby-list #41667
永井@知能.九工大です.

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

In This Thread