wxWidgetsふたたび


Windowsだと出るトレイアイコンが、UbuntuwxWidgets 2.8だと出ない。
結局、諸般の事情でwxWidgetsのサポートをすることに。。AndroidSDLでそれなりにサポートできそうなので。
今回の重要な変更は、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も準備した。
wxWidgetsMFC風のイベントテーブルによってコールバックするメソッドを登録する。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が地味に問題になる。まだいい考察がない。