グローバル変数を使わずにコールバックから親クラスを取得する

fltk、特に fluid を「素直」に使うと、グローバル変数が大量発生してさながら C プログラムになってしまう。fltk は C になってしまうのはしょうがないのかとあきらめていたが、やっと解決法が見つかった。とても fltk らしい方法だ。

fluid でクラスを作り、コンストラクタで Fl_Double_Window を作ると大体、以下のようなコードが生成される。

  { Fl_Double_Window* o = frame_ = new Fl_Double_Window(482, 498, "win");
    w = o;
    o->color(FL_LIGHT1);
    o->user_data(this); //← Hatena の都合により一部変更。ここが重要。

ここで注目すべきは、最後の行の user_data に this を渡しているところだ。これを使えば、親クラスを取得できる。
まず、メニューなどは殆どの場合、ウインドウの直接の子になる。コールバックでは、メニューのポインタがもらえるので、parent() を呼び出すことでウインドウが貰える。そのウインドウの user_data() を呼ぶことで親クラス ( this ) が得られるようだ。かなり荒っぽい...。だが、fluid を使うと自動的に user_data に this が付けられるのはそういった用途を考えてのことであろう。

ひ、非常に微妙だ、fltk。確かに機能として不足はない。「痒いところは自分でかけ」と言ったところか...。このツールキットは捨てるにも惜しいが、この状態を捨て置くのも厳しい。ver 1.2 以降の躍進を期待しつつ、今日は本当に疲れたので、寝ます。