wxWidgetsふたたび
Windowsだと出るトレイアイコンが、UbuntuのwxWidgets 2.8だと出ない。
結局、諸般の事情でwxWidgetsのサポートをすることに。。AndroidはSDLでそれなりにサポートできそうなので。
今回の重要な変更は、wxWidgets2.8を視野に入れている点。要するにcallbackスタイルのAPIに対応した。C標準の関数だとqsortのような関数が当たるが、自身の呼び出しコンテキストの中で、さらに与えた関数をcallbackすることで処理するスタイルのAPIに対応できると、だいたいのGUIフレームワークに対応できる。
ダイナミックでないcallback API
nmoshは、psyntax-mosh由来のダイナミックなcallbackも一応持っているが、これは引数の受け取りコードを動的に生成するので、実行可能コードを生成できない環境(iPhoneとか)のようにセキュリティ都合のある環境に対応できない。
というわけで、Scheme VMとしてサポートするコールバックはいわゆるAPPLY一つに限り、Cコード側でコールバックの引数をSchemeオブジェクトに変換させる。
SchemeオブジェクトをエクスポートするAPI
このため、Schemeコールバックの引数をC側で作るために、オブジェクトをエクスポートするためのAPIも準備した。
wxWidgetsはMFC風のイベントテーブルによってコールバックするメソッドを登録する。nmoshでは、C++的なイベントハンドラは1種類にしぼり、オブジェクト生成のときに一つScheme手続きを渡すようにする。
void nmoshMenu::invoke(wxCommandEvent& e){ void* obj; NMOSH_EXPORT_BEGIN(param) NMOSH_EXPORT_INT(NULL, e.GetId()) NMOSH_EXPORT_END() obj = NMOSH_EXPORT(param); NMOSH_APPLY(m_handler, obj); } BEGIN_EVENT_TABLE(nmoshMenu, wxMenu) EVT_MENU(wxID_ANY, nmoshMenu::invoke) END_EVENT_TABLE()
NMOSH_EXPORT_*によって、Schemeのリスト等を生成できるようにする。
... nmoshはC++で書かれているが、オブジェクト生成APIはCから使用できるようにしている。C++ライブラリのリンクは(特にWindowsで)非常に大きな問題になるのでnmoshのプラグインAPIでは避けている。(例えば、Windows上ではGCC←→Visual Studio、デバッグビルド←→リリースビルド のように、リンクできない組み合わせが有る。)
GC参照のRetainが地味に問題になる。まだいい考察がない。